【问题标题】:Texture and color together in GLSL?GLSL中的纹理和颜色一起?
【发布时间】:2011-02-14 23:00:33
【问题描述】:

我不知道如何使用 OpenGL ES 2.0 获得与 OpenGL ES 1.1 类似的结果。我想实际使用 Sampler2D(将我的纹理与 Alpha 通道混合到帧缓冲区)并设置颜色。纹理应该以颜色绘制 - 就像在 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通道(因为我还添加了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 opengl-es-2.0 alpha fragment-shader blending


    【解决方案1】:

    要按照 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);
    }
    

    【讨论】:

      【解决方案2】:

      Pivots 答案对我来说非常有用。我只是想添加新版本的 GLSL (3.3+) 的外观:

      in vec2 passedUvCoords;
      in vec4 passedColor;
      
      out vec4 outColor;
      
      uniform sampler2D textureSampler;
      
      void main(void) {
          outColor = texture(textureSampler, passedUvCoords) * passedColor;
      }
      

      这只是片段着色器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-16
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        相关资源
        最近更新 更多