alpha - GLSL中的纹理和颜色在一起?

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

我不知道如何将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/

相关文章:

android - 缓冲区和 glVertexAttribPointer 之间的关系

ios - UIKit 加法混合

ios - CALayer, subLayer alpha覆盖

Java:从 BufferedImage 中提取 Alpha channel

c++ - 使用 Alpha channel 复制 SDL_Surfaces

android - OpenGL 透明图像中有黑色

c++ - 如何使用 OpenGL 渲染平滑字体(实际上是任何 "flat"形状)?

java - Libgdx - 屏幕截图质量差

android - 使用 OpenGL ES2.0 的纹理渲染质量下降

安卓 OpenGL : GLbyte LoadShader conversion