Я работаю над opengl es 2.0 для приложения для Android. У меня есть модель, для которой я применяю текстуру. Я делаю это, используя следующие шейдеры. Его простой шейдер.
В нижнем шейдере, когда файл текстуры прозрачен в некоторых местах, я получаю черный цвет. Вместо этого я хочу найти места, где он прозрачен, и дать определенный цвет, такой как RGB (0,6,0,7,0,3). Пожалуйста, дайте мне знать, как изменить приведенный ниже шейдер, чтобы получить это в моей модели.
protected static final String mVShader =
"uniform mat4 uMVPMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec2 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vTextureCoord = aTextureCoord;\n" +
"}\n";
protected static final String mFShader =
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform sampler2D uTexture0;\n" +
"void main() {\n" +
" gl_FragColor = texture2D(uTexture0, vTextureCoord);\n" +
"}\n";
Теперь проще всего проверить цвет альфа-текстуры и вывести другой цвет в зависимости от этого:
void main()
{
vec4 color = texture2D(uTexture0, vTextureCoord);
gl_FragColor = (color.a > 0.1) ? color : vec4(0.6, 0.7, 0.3, 1.0);
}
Конечно, вы можете адаптировать этот порог, но использование всего 0.0
может не работать из-за проблем с точностью. Динамическое разветвление в шейдере фрагмента может быть не лучшей идеей с точки зрения производительности, но если вы говорите, что не можете просто изменить текстуру, потому что цвет может измениться, это будет самым простым способом.
Если изменение цвета постоянно на большом количестве кадров, возможно, вы также можете создать временную текстуру, которая содержит измененный цвет в прозрачных областях. Это можно легко добиться на графическом процессоре, используя вышеупомянутый шейдер, и просто визуализировать эту временную текстуру (используя FBOs) вместо отображения фреймбуфера.
glTexImage2d(..., NULL)
или любой другой эквивалент в вашем язык). Затем, когда цвет меняется, вы создаете данные изображения путем рендеринга непосредственно в эту текстуру, используя FBO и вышеупомянутый шейдер (ссылка для рабочего стола, но должна работать аналогично в ES, если FBO поддерживаются).