Я использую OpenGl ES 1.1 на iOS для создания программы рисования / рисования. Я новичок в openGL, но со всей информацией о том, что мне удалось использовать полупрозрачную текстуру png для использования в качестве кисти и рисования линий антиалисинга.
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glColor4f( 0.5, 0, 0, 0.5 );
Также с помощью glColor мне удалось контролировать цвет кисти и ее непрозрачность.
Теперь я пытаюсь использовать текстуру, чтобы стереть часть рисунка, а также чтобы иметь возможность использовать непрозрачность при стирании, чтобы получить прозрачное стирание, и не все очищается.
Я пробовал несколько функций смешивания с очень небольшим успехом. Например, я использовал настройки смешивания:
glBlendFunc( GL_ONE, GL_ZERO );
и то, что я получил, было удалено из области текстуры, у которой было содержимое, а область текстуры, где она была полностью прозрачной, стала черной, а непрозрачность текстуры была проигнорирована.
Может кто-нибудь подсказать мне, как я могу частично стереть с непрозрачностью и мягкими краями.
Обновление:
Чтобы продолжить изучение этой проблемы, я создал приложение для ipad, в котором у нас есть фон текстуры / изображения, а поверх этого я поместил сетку текстуры кисти, которая представляет собой белый круг с выцветшими краями. Нажатие на текстуры откроет всплывающее окно, которое позволяет вам установить цвет текстуры, а также смеси OpenGL Source и Destination. Я могу изменить настройки, чтобы иметь возможность рисовать поверх фона разными цветами с ожидаемым эффектом. Однако я не могу установить параметр, который позволил бы текстуре стирать фон. Большая часть кода рисования выполняется в классе GLElement в "renderWithTexture". Вот код:
-( void ) renderWithTexture
{
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(blendSource_m, blendDest_m);
[ self setPremultipliedColour ];
static const GLfloat texCoords[] = { 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0 };
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), vertices_m );
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
в этом коде blendSource_m и blendDest_m - это две переменные, которые хранятся в классе и могут быть установлены через всплывающее окно.
Пожалуйста, скачайте проект и, пожалуйста, дайте мне знать, как заставить его работать, чтобы я мог стереть с текстурой. Надеемся, что этот небольшой проект поможет другим в будущем, так как будет очень полезно увидеть, как смешивание в OpenGL может повлиять на среду рисования.
Решено:
Мне удалось решить эту проблему, сначала установив для свойства isOpaque объекта GLView значение NO, а для параметров glClearColor для GL был выбран чистый цвет. Я добавил цвет фона к основному виду, чтобы видеть, когда области стираются. Как видно из примера, 2 элемента в конце первого ряда, один полностью стерт, а другой частично стерт.
тестовый проект ipad