11

我不知道如何使用 OpenGL ES 2.0 获得与 OpenGL ES 1.1 类似的结果。我想实际使用一个 Sampler2D(将我的纹理与 Alpha 通道混合到帧缓冲区)并设置一个颜色。纹理应该以颜色绘制 - 就像在 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”部分用黑色破坏了我的alpha通道(因为我还添加了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,这是我现在得到的: 现在

我想得到:

我想看的

一些想法来实现这一点?任何帮助,将不胜感激。

4

2 回答 2

20

要按照 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);
}
于 2011-02-15T06:19:05.850 回答
4

枢轴答案对我很有用。我只是想添加更新版本的 GLSL (3.3+) 的外观:

in vec2 passedUvCoords;
in vec4 passedColor;

out vec4 outColor;

uniform sampler2D textureSampler;

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

这只是片段着色器。

于 2017-12-31T11:13:33.787 回答