我不知道如何将OpenGL ES 2.0的结果与OpenGL ES 1.1相似。我实际上想使用Sampler2D(将我的纹理与Alpha channel 混合到帧缓冲区中)并设置一个颜色。纹理应该用颜色绘制-就像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 channel (因为如果AlphaValue为0,我也添加了colorVarying)并产生奇怪的渐变效果...在固定功能管道中如何组合纹理和颜色 channel ?我对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颜色与纹理结合到顶点上,请使用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);
}
关于alpha - GLSL中的纹理和颜色在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4998299/