我正在尝试在Android中的三角形两侧绘制纹理。我有以下代码
float textureCoordinates[] = { 0.0f, 0.0f, //
0.0f, 1.0f, //
1.0f, 0.0f
};
short[] indices = new short[] { 0, 1, 2 };
float[] vertices = new float[] { -0.5f, 0.5f, 0.0f, // p0
-0.5f, -0.5f, 0.0f, // p1
0.5f, 0.5f, 0.0f, // p2
};
现在有了这个我能够得到纹理的三角形。但是当我在180度旋转后沿y轴旋转时,我看到三角形另一侧的相同图像。我想改变另一边三角形的纹理。请让我知道怎么做。
答案 0 :(得分:3)
只需一个函数调用就无法实现。使用片段着色器(ES 2)时,您可以查询内置片段着色器输入变量gl_FrontFacing
,以确定当前片段是属于其三角形的前面还是后面。所以你会写这样的东西:
uniform sampler2D frontTexture;
uniform sampler2D backTexture;
varying vec2 texCoord;
void main()
{
if(gl_FrontFacing)
gl_FragColor = texture2D(frontTexture, texCoord);
else
gl_FragColor = texture2D(backTexture, texCoord);
}
当使用固定功能管道(ES 1)时,您将无法渲染对象的两个版本,一个具有前纹理,另一个具有背面纹理。您可以方便剔除以防止深度打击问题。所以它会是这样的:
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); //render only front faces
glBindTexture(GL_TEXTURE_2D, frontTexture);
<draw object>
glCullFace(GL_FRONT); //render only back faces
glBindTexture(GL_TEXTURE_2D, backTexture);
<draw object>
由于我不确定现代ES设备在着色器中处理分支的效果如何(尽管在这种情况下所有片段应采用相同的路径),可能是第二种方法与简单的单纹理片段着色器一起使用在性能方面,也可能是ES 2的首选解决方案。