我的程序的目的是加载和显示每个面上具有相同纹理的简单立方体。但问题是输出不是很好(只有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;
}
答案 0 :(得分:5)
您尝试仅使用8个顶点。要获得正确的纹理,您必须使用12个单独的三角形,每个三角形都带有“正确”的纹理坐标。问题是,当你试图将平面地图放到与球体同胚的东西上时(例如,你的情况下是一个立方体),你会得到这样的“麻烦”。
因此,将立方体拆分为12个三角形(是的,它们将共享坐标)并使用其中一种映射方法计算纹理坐标。
请参阅此处查看地图详情:
http://local.wasp.uwa.edu.au/~pbourke/texture_colour/texturemap/
您的问题的答案“是否可以使用glDrawElements函数正确设置纹理?”是“是的,但你必须改变数组的布局”。
更多的是,这个网站上已经写下了一个解决方案: Problems texturing a cube