我无法弄清楚,如何使用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这是我现在得到的:
我想得到:
要实现这一目标的一些想法? 任何帮助将不胜感激。
答案 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;
}
这只是片段着色器。