GLSL中的纹理和颜色?

问题描述:

我无法弄清楚,如何获得与OpenGL ES 2.0相似的OpenGL ES 1.1结果。我想实际使用Sampler2D(将我的纹理与Alpha通道融合到Framebuffer)并设置Color。质地应在颜色画 - 在OpenGL ES像1.1 我FragmentShader看起来是这样的:GLSL中的纹理和颜色?

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这里是我现在得到: Now

而且我想:

What I want to see

一些想法来完成这个? 任何帮助,将不胜感激。

当您质地结合您的顶点颜色的方式的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); 
} 
+0

谢谢!这对我来说非常有效。 – Constantin 2011-02-15 10:22:16

支点的答案是我伟大的工作。我只是想补充一下GLSL(3.3+)的更新版本:

in vec2 passedUvCoords; 
in vec4 passedColor; 

out vec4 outColor; 

uniform sampler2D textureSampler; 

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

这只是片段着色器。