问题
the purpose of my program is to load and display a simple cube with the same texture on each face. But the problem is that the output is not very good (just 4 faces are textured correctly).I tried lots of combinations of coordinates in the textures array but most of the time it's worse. Is it possible to set textures correctly with the function glDrawElements or not?
#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;
}
回答1:
You are trying to use only 8 vertices. To get correct texturing you must use 12 separate triangles, each of them with the "correct" texture coordinates. The thing is when you're trying to do the planar map onto something homeomorphic to the sphere (e.g., a cube in your case), you will get "troubles" like this.
So, split the cube into 12 triangles (yes, they will share coordinates) and calculate the texture coordinates with one of the mapping methods.
See here for mapping details:
http://local.wasp.uwa.edu.au/~pbourke/texture_colour/texturemap/
The answer to your question "Is it possible to set textures correctly with the function glDrawElements or not?" is "Yes, but you have to change the arrays' layout".
Even more, there's a solution already written down on this site: Problems texturing a cube
Detailed layout of the vertices and texture coordinates goes here: 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
来源:https://stackoverflow.com/questions/10401605/coord-texture-array-does-not-works-correctly-with-gldrawelements