【问题标题】:OpenGL ES2 Android - Mapping 2D Textures to a GL_TRIANGLES cubeOpenGL ES2 Android - 将 2D 纹理映射到 GL_TRIANGLES 立方体
【发布时间】:2012-08-30 02:12:35
【问题描述】:

我正在尝试将 256*256 纹理映射到立方体上。当我这样做时,正面和背面如预期的那样,左右面在 z 方向上反转,顶面和底面被“弄脏”成重复的模糊。这个问题我之前已经讨论过,但是我能找到的唯一解决方案是使用四边形,这在 OpenGL ES2.0 的 Android 实现中不可用,或者创建一个包含所有面的顶点的顶点列表(而不仅仅是8 个顶点),然后用索引 0-23(而不是 0-7)引用它们。

我使用的给出上述结果的代码如下:

private float vertices[] = {

    //Front 
    -1.0f, -1.0f, 1.0f,  //0 Bottom Left
    1.0f, -1.0f, 1.0f,  //1 Bottom Right
    -1.0f, 1.0f, 1.0f,  //2 Top Left
    1.0f, 1.0f, 1.0f,  //3 Top Right

    //Back
    -1.0f, -1.0f, -1.0f, //4 Bottom Left
    1.0f, -1.0f, -1.0f, //5 Bottom Right
    -1.0f, 1.0f, -1.0f, //6 Top Left        
    1.0f, 1.0f, -1.0f //7 Top Right 
};

//Order to draw points in vertices array
private short indices[] = {
    //Faces definition
    0,1,2, 2,1,3, //Front
    5,4,7, 7,4,6, //Back
    1,5,3, 3,5,7, //Right 
    4,0,6, 6,0,2, //Left
    2,3,6, 6,3,7, //Top
    4,5,0, 0,5,1 //Bottom
};

private float textureVertices[] = {
    0.0f, 1.0f, //Front
    1.0f, 1.0f, 
    0.0f, 0.0f,
    1.0f, 0.0f,

    1.0f, 1.0f, //Back
    0.0f, 1.0f, 
    1.0f, 0.0f,
    0.0f, 0.0f,

    1.0f, 1.0f,
    0.0f, 1.0f, //Right 
    1.0f, 0.0f,
    0.0f, 0.0f,

    1.0f, 1.0f, //Left
    0.0f, 1.0f, 
    1.0f, 0.0f,
    0.0f, 0.0f,

    0.0f, 1.0f, //Top
    1.0f, 1.0f, 
    0.0f, 0.0f,
    1.0f, 0.0f,

    0.0f, 1.0f, //Bottom
    1.0f, 1.0f, 
    0.0f, 0.0f,
    1.0f, 0.0f

};

public void draw(GL10 gl){
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]);

    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glFrontFace(GL10.GL_CCW);
    gl.glCullFace(GL10.GL_BACK);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT,indicesBuffer);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
}

我认为Mapping a square texture to a triangle 帖子中接受的答案几乎涵盖了我所追求的,如果确实有可能以我期望的方式进行索引和纹理。

【问题讨论】:

    标签: android opengl-es textures uv-mapping


    【解决方案1】:

    您的vertices 数组应该与textureVertices 数组的布局相匹配。这意味着 8 个顶点不足以渲染纹理立方体,因为同一位置的顶点可能具有不同的纹理坐标,具体取决于它们所属的面,因为indices 是纹理和顶点数组的索引。

    考虑一个旋转的立方体,使其边缘面向你。在边缘的左侧,纹理结束。在右侧,纹理开始。

    【讨论】:

    • 感谢您快速而清晰的回复 - 我现在明白为什么我尝试做的事情不起作用。我不明白索引也用于纹理数组。有没有办法为纹理使用单独的索引数组,或者匹配纹理顶点和立方体顶点数组是最佳实践?
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多