在OpenGL中将纹理映射到顶点

时间:2014-11-04 16:05:14

标签: c++ opengl texture-mapping

我尝试使用OpenGL渲染纹理网格。目前,我的主要班级由以下国家组成:

  • std::vector<vec3d> vertices
  • std::vector<face> mesh
  • std::vector<vec3d> colors

vec3d是3D向量的实现 - 没有什么特别的 - 和face一个类,它包含指向vertices中顶点索引的3个整数。

到目前为止,我使用以下代码(工作正常)渲染了没有纹理的网格:

glShadeModel(params.smooth ? GL_SMOOTH : GL_FLAT);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

/*This is my attempt to add the texture
 *
 *if (_colors.size() != 0) {
 *  cout << "Hello" << endl;
 *  glClientActiveTexture(GL_TEXTURE0);
 *  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 *  glTexCoordPointer(3,GL_FLOAT,0,&_colors[0].x);
}*/
glNormalPointer(GL_FLOAT,0,&normals[0].x);
glVertexPointer(3,GL_FLOAT,0,&vertices[0].x);

glDrawElements(GL_TRIANGLES,mesh.size()*3,GL_UNSIGNED_INT,&mesh[0].v1);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

我的纹理存储在colors中,作为0到1之间浮点数的三元组列表。但是,不应用颜色。我阅读了许多纹理映射的例子,并尝试做同样的事情,没有运气。我知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

从您的评论中可以看出,您使用了错误的OpenGL功能来实现您的目标。纹理化意味着通过使用例如2d将2d图像粘附到网格上。 UV坐标。

您正在做的是在每个顶点上指定颜色,因此您需要启用GL_COLOR_ARRAY而不是GL_TEXTURE_COORD_ARRAY并使用相应的函数。

另外一个提示:如果你从头开始学习OpenGL,你应该考虑只使用现代的OpenGL(3.2 +)

回答最后的评论:

  

好吧,我从纹理文件中读取了那些颜色,这就是我的意思。有没有办法使用这样的数组来显示我的网格颜色?

是和否:在执行此操作时,您很可能无法获得预期的结果。通常,纹理中应该有多个像素映射到面。对于顶点颜色,您只能在每个顶点应用一个颜色值,并在三角形上进行插值。看看如何将纹理应用于网格,你应该能够在互联网上找到很多资源。