美文网首页OpenGL ES
第十八节—关于多纹理单元渲染

第十八节—关于多纹理单元渲染

作者: L_Ares | 来源:发表于2020-10-12 17:38 被阅读0次

    本文为L_Ares个人写作,如需转载请表明原文出处。

    关于多纹理单元传入FragmentShader进行渲染的话,需要有一个简单的理解。

    片元着色器中允许输入最多16个纹理单元,下面举一个最简单的例子来讲述多个纹理单元的混合渲染。

    如果想要更多的混合,可以参考OpenGL中说过的第十一节—混合,里面有颜色混合的方程式。

    混合是在FragmentShader中完成的,所以下面写一个最简单的多纹理混合的片元着色器代码(服务端代码)。

    attribute vec2 textCoord;
    uniform sampler2D firstMap;
    uniform sampler2D secondMap;
    
    void main ()
    {
        vec4 firstColor;
        vec4 secondColor;
    
        firstColor = texture(firstMap, textCoord);
        secondColor = texture(secondMap, textCoord);
    
         gl_FragColor = firstColor * secondColor;
    }
    
    
    

    那么在客户端,也就是我们的普通代码文件中,需要打通通道,传递纹理和纹理坐标。

    //获取纹理坐标在fragment中的位置
    GLuint textCoord = glGetAttribLocation(self.nProgram, "textCoordinate");
    //打开纹理坐标通道
    glEnableVertexAttribArray(textCoord);
    
    //因为多个纹理,所以最好激活两个纹理单元
    glActiveTexture(GL_TEXTURE0);
    //这里的第二个参数,绑定纹理到默认的纹理ID,因为glUniform里面也设置的0
    glBindTexture(GL_TEXTURE_2D, 0);
    //设置采样器的位置值
     glUniform1i(firstMapLocation,0);
    
    //激活第二个纹理单元
    glActiveTexture(GL_TEXTURE1);
    //绑定第二个纹理单元
    glBindTexture(GL_TEXTURE_2D, 1);
    //设置采样器采样位置值
    glUniform1i(secondMapLocation,1);
    

    相关文章

      网友评论

        本文标题:第十八节—关于多纹理单元渲染

        本文链接:https://www.haomeiwen.com/subject/ixkppktx.html