2011-10-12 107 views
2

我想画一个纹理在Android的一个三角形的两边。我有下面的代码在Android中的OpenGL ES 1.1,如何绘制纹理三角形的两侧?

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轴旋转它,我看到在三角形的另一侧上的相同的图像。我想改变另一边的三角形的纹理。请让我知道如何去做。

回答

2

这不只是一个单一的函数调用来实现。当使用片段着色(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的首选解决方案,性能明智。

+0

非常感谢您的回答。我认为这应该工作。我会试一试,并会让你知道。谢谢。 – Vinodtiru