GLSL中的纹理和颜色一起?

时间:2011-02-14 23:00:34

标签: alpha opengl-es-2.0 blending fragment-shader

我无法弄清楚,如何使用OpenGL ES 2.0类似于OpenGL ES 1.1的结果。我想实际使用Sampler2D(将我的纹理与Alpha通道混合到Framebuffer)并设置Color。纹理应该用颜色绘制 - 就像在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”部分用黑色破坏了我的alphachannel(因为我还添加了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 个答案:

答案 0 :(得分:15)

要按照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将纹理乘以颜色,而不是添加到它。

你在图像中看到一个渐变,因为在OpenGL ES(1.1和2.0)中将步幅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);
}

答案 1 :(得分:0)

Pivots的回答对我很有帮助。我只想添加一个更新版本的GLSL(3.3 +)的样子:

in vec2 passedUvCoords;
in vec4 passedColor;

out vec4 outColor;

uniform sampler2D textureSampler;

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

这只是片段着色器。