Прозрачность с помощью GLSL Android Opengl es 2.0 - PullRequest
1 голос
/ 10 декабря 2011

Я работаю над OpenGLES 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";

1 Ответ

0 голосов
/ 10 декабря 2011

Теперь проще всего было бы проверить альфа цвета текстуры и вывести другой цвет в зависимости от этого:

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 ) вместо буфера кадров дисплея.

...