[英]Texturing 3d Object with UV Map OpenGL
我在使用UV Map渲染3D對象時遇到問題。
首先,我的對象是Wavefront模型。我使用解析器將整個文件拆分為頂點,法線,面和texCoords。 解析file.obj之后,我擁有了所有這些。
問題在於紋理不會出現在最終結果中,而是沒有紋理的對象。
這是init函數:
int init()
{
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
cout << "SDL error: " << SDL_GetError() << endl;
return false;
}
// SDL Window crap
createWindow(screenWidth, screenHeight, 32, false, "WaveFront Object Loader");
reshape(screenWidth, screenHeight);
// OpenGL init
// Stuff
glShadeModel(GL_SMOOTH);
glClearColor(0.2f, 0.2f, 0.2f, 0.0f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
// Face culling (for textures)
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
// Lighting
GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
// Object loader
if(!model.load("BallForRenderl.obj"))
{
cout << "Could not load model" << endl;
return false;
}
return true;
}
這是繪制場景的函數:
void draw(){
glPushMatrix();
// clear the screen & depth buffer
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
// set the perspective projection
glCallList(g_persp);
// set the camera position
gluLookAt( 0, 1, -20, // eye pos
0, 0, 0, // aim point
0, 1, 0); // up direction
glRotatef(angle, 0.0, 0.5, 1.0);
glColor4f(1.0, 1.0, 1.0, 1.0);
glScalef(0.2,0.2,0.2);
model.draw();
// set the orthographic projection
glCallList(g_ortho);
// 2D/text *****************************************
glPopMatrix();
// Commented out because we call it in our idle() function - maintains framerate independance
// SDL_GL_SwapBuffers();
}
這是繪制模型的函數:
void WFObject::draw(){
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glEnable(GL_TEXTURE_2D);
glColor3f(1.0,1.0,1.0);
glBegin(GL_TRIANGLES);
for(int f = 0; f < faces.size(); f++)
{
glNormal3f(normals[faces[f].vn1 - 1].x, normals[faces[f].vn1 - 1].y, normals[faces[f].vn1 - 1].z);
glVertex3f(vertices[faces[f].v1 - 1].x, vertices[faces[f].v1 - 1].y, vertices[faces[f].v1 - 1].z);
glTexCoord2f(texCoords[faces[f].vt1 - 1].u,texCoords[faces[f].vt1 - 1].v);
//printf("%f %f \n",texCoords[faces[f].vt1 - 1].u,texCoords[faces[f].vt1 - 1].v);
glNormal3f(normals[faces[f].vn2 - 1].x, normals[faces[f].vn2 - 1].y, normals[faces[f].vn2 - 1].z);
glVertex3f(vertices[faces[f].v2 - 1].x, vertices[faces[f].v2 - 1].y, vertices[faces[f].v2 - 1].z);
glTexCoord2f(texCoords[faces[f].vt2 - 1].u,texCoords[faces[f].vt2 - 1].v);
//printf("%f %f \n",texCoords[faces[f].vt2 - 1].u,texCoords[faces[f].vt2 - 1].v);
glNormal3f(normals[faces[f].vn3 - 1].x, normals[faces[f].vn3 - 1].y, normals[faces[f].vn3 - 1].z);
glVertex3f(vertices[faces[f].v3 - 1].x, vertices[faces[f].v3 - 1].y, vertices[faces[f].v3 - 1].z);
glTexCoord2f(texCoords[faces[f].vt3 - 1].u,texCoords[faces[f].vt3 - 1].v);
//printf("%f %f \n",texCoords[faces[f].vt3 - 1].u,texCoords[faces[f].vt3 - 1].v);
//printf("\n");
}
glEnd();
glDisable(GL_TEXTURE_2D);
}
我知道也許我錯過了一些東西,但是盡管我閱讀了很多教程,但我還是無法解決。
誰能幫我這個?
glNormal3f(...);
glVertex3f(...);
glTexCoord2f(...); // this will affect the *next* vertex
順序錯誤。
glVertex命令用於glBegin / glEnd對中,以指定點,線和面的頂點。 調用glVertex時,當前顏色,法線,紋理坐標和霧坐標與該頂點關聯。
您需要在希望它屬於的glVertex()
glTexCoord()
之前調用glTexCoord()
:
glNormal3f(...);
glTexCoord2f(...);
glVertex3f(...);
您似乎也從來沒有在任何地方綁定紋理對象(通過glBindTexture()
)。 您需要綁定一個紋理對象,以便OpenGL知道要從中采樣的紋理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.