【问题标题】:Coord texture array does not works correctly with glDrawElements坐标纹理数组不适用于 glDrawElements
【发布时间】:2012-05-01 17:26:40
【问题描述】:

我的程序的目的是加载并显示一个简单的立方体,每个面上都有相同的纹理。但问题是输出不是很好(只有 4 个面的纹理正确)。我在纹理数组中尝试了很多坐标组合,但大多数时候情况更糟。是否可以使用 glDrawElements 函数正确设置纹理?

#define OFFSET_BUFFER(bytes) ((GLfloat *)NULL + bytes)

GLfloat vertices[] =
{
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    1.0, 1.0, -1.0,
    -1.0, 1.0, -1.0,
    -1.0, -1.0, 1.0,
    1.0, -1.0, 1.0,
    1.0, 1.0, 1.0,
    -1.0, 1.0, 1.0,
};

GLubyte indices[] =
{
    0, 1, 2, 3,
    4, 7, 6, 5,
    0, 4, 5, 1,
    3, 2, 6, 7,
    0, 3, 7, 4,
    1, 5, 6, 2
};

GLfloat textures[] =
{
    0,0, 1,0, 1,1, 0,1,
    0,1, 1,1, 1,0, 0,0,
    /*//0,0, 1,0, 1,1, 0,1,
    //0,0, 1,0, 1,1, 0,1,
    0,1, 1,1, 1,0, 0,0,
    0,1, 1,1, 1,0, 0,0,
    //0,0, 1,0, 1,1, 0,1*/
};

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Texture Mapping",NULL);
    SDL_SetVideoMode(500, 500, 32, SDL_OPENGL);

    bool continuer = true;
    SDL_Event event;
    GLuint texCube;

    glClearDepth(1.0f);
    glClearColor(0.1f, 0.1f, 0.1f, 0.1f);
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(70.0f, (float)500.0f / (float)500.0f, 1.0f, 3000.0f);
    glewInit();

    texCube = loadTexture("caisse.jpg");
    glBindTexture(GL_TEXTURE_2D, texCube);

    glEnable(GL_TEXTURE_2D);

    while (continuer)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = false;
        }

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        gluLookAt(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

        //Draw Cube ---------------------------------------

        glPushMatrix();
        glRotatef(45.0f, 1.0f, 1.0f, 0.0f);

        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(3, GL_FLOAT, 0, vertices);

        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(2, GL_FLOAT, 0, textures);

        glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices);

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);

        //-------------------------------------------------

        glPopMatrix();

        glFlush();
        SDL_GL_SwapBuffers();
    }

    glDisable(GL_TEXTURE_2D);
    SDL_Quit();

    return 0;
}

【问题讨论】:

    标签: arrays opengl sdl textures cube


    【解决方案1】:

    您正在尝试仅使用 8 个顶点。要获得正确的纹理,您必须使用 12 个独立的三角形,每个三角形都有“正确的”纹理坐标。问题是,当您尝试将平面映射映射到与球体同胚的物体(例如,在您的情况下为立方体)时,您会遇到这样的“麻烦”。

    因此,将立方体分成 12 个三角形(是的,它们将共享坐标)并使用其中一种映射方法计算纹理坐标。

    有关映射详细信息,请参见此处:

    http://local.wasp.uwa.edu.au/~pbourke/texture_colour/texturemap/

    您的问题“是否可以使用函数 glDrawElements 正确设置纹理?”的答案?是“是的,但您必须更改数组的布局”。

    更重要的是,这个网站上已经写了一个解决方案: Problems texturing a cube

    顶点和纹理坐标的详细布局在这里:http://blogs.msdn.com/b/dawate/archive/2011/01/20/constructing-drawing-and-texturing-a-cube-with-vertices-in-xna-on-windows-phone-7.aspx

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多