Текстура и цвет вместе в GLSL? - PullRequest
8 голосов
/ 15 февраля 2011

Не могу понять, как получить с OpenGL ES 2.0 аналогичные результаты для OpenGL ES 1.1.Я хочу использовать Sampler2D (чтобы смешать мою текстуру с альфа-каналом в кадровый буфер), а также установить цвет.Текстура должна быть окрашена в цвет - как в OpenGL ES 1.1. Мой FragmentShader выглядит так:

varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;

void main(){
    gl_FragColor = texture2D(texture, texcoordVarying) + colorVarying;
}

Но часть "+ colorVarying" разрушает мой альфа-канал с черным (потому что я также добавляю colorVarying, еслиЗначение AlphaValue равно 0) и создает странный эффект градиента ... Как канал текстуры и цвета комбинируется в конвейере с фиксированной функцией?Моя замена для glColor4f:

void gl2Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a){
    const GLfloat pointer[] = {r, g, b, a};
    glVertexAttribPointer(ATTRIB_COLOR, 2, GL_FLOAT, 0, 0, pointer);
    glEnableVertexAttribArray(ATTRIB_COLOR);
}

И я использую glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);если это как-то актуально ...

Для цвета 1.0, 0.0, 1.0, 1.0 вот что я получаю сейчас: Now

И я хочу получить:

What I want to see

Какие идеи для этого?Любая помощь будет оценена.

Ответы [ 2 ]

15 голосов
/ 15 февраля 2011

Чтобы объединить цвет вашей вершины с текстурой, как это делает OpenGL ES 1.1 по умолчанию, вам нужно, чтобы ваш фрагментный шейдер был:

varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;

void main(){
    gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying;
}

Обратите внимание, что GL_MODULATE умножает текстуру на цветвместо добавления к нему.

Вы видите градиент на своем изображении, потому что передача шага 0 функциям спецификации массива вершин в OpenGL ES (как 1.1, так и 2.0) не приводит к шагу0 - скорее, OpenGL ES рассчитывает шаг за вами, исходя из плотно упакованных элементов указанного вами формата / типа.В результате вы на самом деле читаете через конец массива в случайную память.Если вам нужно одинаковое значение во всех вершинах, вы должны установить текущее значение атрибута и отключить связанный массив:

void gl2Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a){
    const GLfloat pointer[] = {r, g, b, a};
    glVertexAttrib4fv(ATTRIB_COLOR, pointer);
    glDisableVertexAttribArray(ATTRIB_COLOR);
}
0 голосов
/ 31 декабря 2017

Ответ Pivots работает отлично для меня. Я просто хотел добавить, как это будет выглядеть с более новой версией GLSL (3.3 +):

in vec2 passedUvCoords;
in vec4 passedColor;

out vec4 outColor;

uniform sampler2D textureSampler;

void main(void) {
    outColor = texture(textureSampler, passedUvCoords) * passedColor;
}

Это просто фрагментный шейдер.

...