iPhone OpenGL:纹理多维数据集问题

时间:2010-11-10 23:15:24

标签: iphone opengl-es 3d

我一直很喜欢和OpenGl一起玩,并且已经关注了一些例子

我的问题是纹理化多维数据集。大多数侧面纹理很好(正面,背面,左侧),但右边是一团糟。

我的立方体

// cube
static const GLfloat cubeVertices[] = { 
    -5.0f, 15.0f, 5.0f,
    5.0f, 15.0f, 5.0f, 
    5.0f,0.0f, 5.0f,
    -5.0f,0.0f, 5.0f,
    -5.0f, 15.0f,-5.0f, 
    5.0f, 15.0f,-5.0f,
    5.0f,0.0f,-5.0f,
    -5.0f,0.0f,-5.0f
};

static const GLubyte cubeNumberOfIndices = 36;

const GLubyte cubeVertexFaces[] = { 
    0, 1, 5, // Half of top face 
    0, 5, 4, // Other half of top face
    4, 6, 5, // Half of front face 
    4, 6, 7, // Other half of front face
    0, 1, 2, // Half of back face 
    0, 3, 2, // Other half of back face
    1, 2, 5, // Half of right face 
    2, 5, 6, // Other half of right face
    0, 3, 4, // Half of left face 
    7, 4, 3, // Other half of left face
    3, 6, 2, // Half of bottom face 
    6, 7, 3, // Other half of bottom face 
};

我的纹理贴图

const GLshort squareTextureCoords2[] = {
    0, 5, // top left
    0, 0, // bottom left
    15, 0, //bottom right
    15, 5  //top right
};

我的立方体代码

//tell GL about our texture
    glBindTexture(GL_TEXTURE_2D, 1);
    glTexCoordPointer(2, GL_SHORT, 0, squareTextureCoords2);

    glVertexPointer(3, GL_FLOAT, 0, cubeVertices);

    for(int i = 0; i < cubeNumberOfIndices; i += 3) {
        //glColor4ub(cubeFaceColors[colorIndex], cubeFaceColors[colorIndex+1], cubeFaceColors[colorIndex+2], cubeFaceColors[colorIndex+3]);
        int face = (i / 3.0);
        if (face % 2 != 0.0) {
        }
        glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, &cubeVertexFaces[i]);
}

正如我所说的,一切都呈现出来但是立方体的一面(不能看到顶部和底部所以不用担心)纹理变得奇怪

由于

更新**

我现在尝试了这些Coords,并且纹理没有出现在每一面上,它从前到后纹理化,因此边缘就像纹理的另一边缘的线条。我必须接近破解这个

const GLfloat squareTextureCoords3[] = {
    // Front face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Top face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Rear face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Bottom face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Left face
    5, 5,       // top left
    0, 5,       // bottom left
    0, 0,       // bottom right
    5, 0,       // top right

    // Right face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right
};

2 个答案:

答案 0 :(得分:3)

首先,要描述八个顶点,您需要八个纹理坐标。你提供的缓冲区只包含四个,所以行为在技术上是未定义的(并且可能取决于你的编译器在数组后放入内存中的内容)。

将一个常量作为纹理名称传递给glBindTexture也没有用。你应该传递glGenTextures早先给你的任何东西。

即使这些问题得到解决,当你想到它时,如果你刚刚坚持只有八个顶点,那么边缘面上的纹理坐标将不会非常有用吗?这意味着您必须找到每个顶点的纹理坐标,这些坐标对每个连接的面都有意义。尝试在纸上画出来 - 我不确定它是否可行。为避免这种情况,您需要提供具有不同纹理坐标的重复顶点位置。

编辑:立方体的示例几何图形,其中每个面都有一组完全唯一的顶点(直接在此处键入,未经测试,以确定点):

// this is unchanged from your original
static const GLfloat squareTextureCoords3[] = {
    // Front face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Top face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Rear face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Bottom face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right

    // Left face
    5, 5,       // top left
    0, 5,       // bottom left
    0, 0,       // bottom right
    5, 0,       // top right

    // Right face
    0, 5,       // top left
    0, 0,       // bottom left
    5, 0,       // bottom right
    5, 5,       // top right
};

// this is changed, to match the tex coord list
static const GLfloat cubeVertices[] = { 
    // front face
    -5.0f, 15.0f, 5.0f,
    5.0f, 15.0f, 5.0f, 
    5.0f, 0.0f, 5.0f,
    -5.0f, 0.0f, 5.0f,

    // top face
    -5.0f, 15.0f, 5.0f,
    5.0f, 15.0f, 5.0f, 
    5.0f, 15.0f,-5.0f,
    -5.0f, 15.0f,-5.0f,         

    // rear face
    -5.0f, 15.0f,-5.0f, 
    5.0f, 15.0f,-5.0f,
    5.0f,0.0f,-5.0f,
    -5.0f,0.0f,-5.0f

    // bottom face
    -5.0f, 0.0f, 5.0f,
    5.0f, 0.0f, 5.0f, 
    5.0f, 0.0f,-5.0f,
    -5.0f, 0.0f,-5.0f,

    // left face
    -5.0f, 0.0f, 5.0f,
    -5.0f, 0.0f,-5.0f,
    -5.0f, 15.0f,-5.0f,         
    -5.0f, 15.0f, 5.0f,

    // right face
    5.0f, 0.0f, 5.0f,
    5.0f, 0.0f,-5.0f,
    5.0f, 15.0f,-5.0f,         
    5.0f, 15.0f, 5.0f,
};

// this is changed also, to match the new arrays above
const GLubyte cubeVertexFaces[] = { 
    4, 5, 6, // Half of top face 
    4, 6, 7, // Other half of top face
    0, 1, 2, // Half of front face 
    0, 2, 3, // Other half of front face
    8, 9, 10, // Half of back face 
    8, 10, 11, // Other half of back face
    20, 21, 22, // Half of right face 
    20, 22, 23, // Other half of right face
    16, 17, 18, // Half of left face 
    16, 18, 19, // Other half of left face
    12, 13, 14, // Half of bottom face 
    12, 14, 15, // Other half of bottom face 
};

其他代码保持不变。关键是在OpenGL中你不能单独索引顶点位置和纹理坐标。忽略颜色,法线等的可能性,OpenGL中顶点的描述是一个具有一个纹理坐标的位置。

答案 1 :(得分:0)

尝试

const GLubyte cubeVertexFaces[] = {
...
    1, 5, 2, // Half of right face  
    6, 2, 5, // Other half of right face 
...
};