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

本文为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);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。