Прозрачность OpenGL в текстуре при рендеринге с использованием буфера трафарета - PullRequest
0 голосов
/ 03 июля 2018

Вопрос был обновлен благодаря комментариям.

Снимок экрана с наложением текстур
Screenshot of how textures overlap

Чтобы нарисовать 2 точки с текстурой кисти, используя буфер трафарета, чтобы избежать наложения прозрачности текстур, используется следующий код:

    glEnable(GL_STENCIL_TEST.gluint)

    glClear(GL_STENCIL_BUFFER_BIT.gluint | GL_DEPTH_BUFFER_BIT.gluint)

    glStencilOp(GL_KEEP.gluint, GL_KEEP.gluint, GL_REPLACE.gluint)

    glStencilFunc(GL_ALWAYS.gluint, 1, 1)
    glStencilMask(1)

    glDrawArrays(GL_POINTS.gluint, 0, 1)

    glStencilFunc(GL_NOTEQUAL.gluint, 1, 1)
    glStencilMask(1)

    glDrawArrays(GL_POINTS.gluint, 1, 1)

    glDisable(GL_STENCIL_TEST.gluint)

И буфер трафарета работает, однако, каждая точка заполняет полный прямоугольник в буфере трафарета, но изображение текстуры имеет прозрачность. Так, может быть, текстура используется неправильно?

Текстура загружается вот так

    glGenTextures(1, &gl_id)
    glBindTexture(GL_TEXTURE_2D.gluint, gl_id)
    glTexParameteri(GL_TEXTURE_2D.gluint, GL_TEXTURE_MIN_FILTER.gluint, GL_LINEAR)
    glTexImage2D(GL_TEXTURE_2D.gluint, 0, GL_RGBA, gl_width.int32, gl_height.int32, 0, GL_RGBA.gluint, GL_UNSIGNED_BYTE.gluint, gl_data)

Смешивание установлено как

    glEnable(GL_BLEND.gluint)
    glBlendFunc(GL_ONE.gluint, GL_ONE_MINUS_SRC_ALPHA.gluint)

Не могли бы вы посоветовать, где искать, чтобы заполнить 1 с в буфере трафарета точно непрозрачной областью изображения кисти?

1 Ответ

0 голосов
/ 07 июля 2018

Рекомендую discard прозрачные части текстуры в фрагментном шейдере. Фрагмент можно полностью пропустить в шейдерном фрагменте по ключевому слову discard.
См. Фрагмент шейдера - Специальные операции .

Используйте небольшой порог и discard фрагмент, если альфа-канал цвета текстуры ниже порога:

vec4  texture_color = .....;
float threshold = 0.01;
if ( texture_color.a < threshold )
    discard; 

Другой возможностью было бы использование Альфа-теста . Это будет доступно только в профиле совместимости OpenGL, но не в профиле ядра или OpenGL ES.

См. Хронос OpenGL-Refpages glAlphaFunc:

Альфа-тест отбрасывает фрагменты в зависимости от результата сравнения между альфа-значением входящего фрагмента и постоянным эталонным значением.

При следующем альфа-тесте фрагменты, чей альфа-канал находится ниже threshold, отбрасываются:

float threshold = 0.01;
glAlphaFunc(GL_GEQUAL, threshold);
glEnable(GL_ALPHA_TEST)
...