本文为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);
网友评论