在Android OpenGL ES 1.1中,如何在三角形的两边绘制纹理?

时间:2011-10-12 23:57:59

标签: android opengl-es textures

我正在尝试在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轴旋转时,我看到三角形另一侧的相同图像。我想改变另一边三角形的纹理。请让我知道怎么做。

1 个答案:

答案 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的首选解决方案。