【问题标题】:Texturing 3d Object with UV Map OpenGL使用 UV 贴图 OpenGL 纹理化 3d 对象
【发布时间】:2014-06-25 19:02:18
【问题描述】:

我在使用 UV 贴图渲染 3D 对象时遇到问题。

首先,我的对象在 Wavefront 模型中。我使用解析器将整个文件拆分为顶点、法线、面和 texCoords。解析 file.obj 后,我拥有了所有这些。

问题是最终结果中没有出现纹理,而是没有纹理的对象。

这是初始化函数:

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);

}

我知道我可能错过了一些东西,但尽管我阅读了很多教程,但我无法解决这个问题。

谁能帮我解决这个问题?

【问题讨论】:

  • 好吧,如果你想使用纹理,你必须先加载它...当你将任何东西绑定到纹理缓冲区时,你的代码中没有位置。跨度>
  • @PawełStawarz 我从波前文件中获取 UV 坐标。
  • UV 坐标与纹理不同。纹理是位图,UV 坐标将位图的像素映射到 hte 网格的点。单独的 UV 坐标不会对您的模型进行纹理处理。这里有一些读物:en.wikipedia.org/wiki/UV_Mapping
  • 感谢您的回答@PawełStawarz。我不得不根据您的建议阅读更多内容,并将导入的位图和 uv 坐标的信息结合起来。终于解决了我的问题。

标签: c++ opengl texture-mapping 3d-rendering


【解决方案1】:
glNormal3f(...);
glVertex3f(...);
glTexCoord2f(...);  // this will affect the *next* vertex

错误的顺序。

glVertex 命令在 glBegin/glEnd 对中用于指定 点、线和多边形的顶点。 当前颜色、法线、纹理 glVertex 时,坐标和雾坐标与顶点相关联 被调用。

您需要调用glTexCoord()之前您希望它属于的glVertex()

glNormal3f(...);
glTexCoord2f(...);
glVertex3f(...);

您似乎也从未在任何地方绑定纹理对象(通过glBindTexture())。您需要绑定一个纹理对象,以便 OpenGL 知道要从哪个纹理中采样。

【讨论】:

  • 感谢您的回答。我更改了订单,但没有任何区别。又没有纹理了。
  • glBindTexture() 带参数位图图像解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2021-08-31
  • 2015-04-16
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多