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这里是我现在得到:
而且我想:
一些想法来完成这个? 任何帮助,将不胜感激。
答
当您质地结合您的顶点颜色的方式的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);
}
答
支点的答案是我伟大的工作。我只是想补充一下GLSL(3.3+)的更新版本:
in vec2 passedUvCoords;
in vec4 passedColor;
out vec4 outColor;
uniform sampler2D textureSampler;
void main(void) {
outColor = texture(textureSampler, passedUvCoords) * passedColor;
}
这只是片段着色器。
谢谢!这对我来说非常有效。 – Constantin 2011-02-15 10:22:16