Прозрачность с помощью GLSL Android Opengl es 2.0

1

Я работаю над 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";
  • 0
    Как вы определяете места "когда файл текстуры прозрачен"? Вы имеете в виду наличие альфа-ноль? Разве вы не можете просто поместить этот конкретный цвет в текстуру в этих точках?
  • 0
    Да, я имею в виду, что альфа равна нулю. Но я хочу поставить разные цвета в этом месте. Поэтому я хочу сделать это с помощью кода. Пожалуйста, дайте мне знать ваши комментарии.
Теги:
glsl
opengl-es-2.0

1 ответ

0
Лучший ответ

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

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) вместо отображения фреймбуфера.

  • 0
    Огромное спасибо за помощь. Да, вы правы, что мое приложение будет работать быстрее, если я создам временную текстуру, поскольку динамический набор цветов будет сохранен в течение нескольких кадров. Но я не уверен, как сделать временную текстуру из FBO. Извините, я довольно новичок в шейдерах. Пожалуйста, дайте мне знать со ссылкой или примером кода, который может помочь мне. Большое спасибо за усилия.
  • 0
    @Vinodtiru Теперь вы фактически не создаете временную текстуру каждый раз, когда меняете цвет. Вы создаете эту текстуру один раз, одновременно создаете исходную текстуру, и таким же образом, за исключением того, что вы не помещаете в нее какие-либо данные изображения (вы вызываете glTexImage2d(..., NULL) или любой другой эквивалент в вашем язык). Затем, когда цвет меняется, вы создаете данные изображения путем рендеринга непосредственно в эту текстуру, используя FBO и вышеупомянутый шейдер (ссылка для рабочего стола, но должна работать аналогично в ES, если FBO поддерживаются).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню