OpenGL текстуры для стирания - PullRequest
1 голос
/ 16 мая 2011

Я использую 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

...