2011-10-12 109 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