在OpenGL中将纹理映射到顶点

Mapping a texture to vertices in OpenGL

本文关键字:顶点 纹理映射 OpenGL      更新时间:2023-10-16

我正在尝试使用OpenGL渲染纹理网格。目前,我的主要班级拥有一个由以下组成的状态:

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

vec3d是3D向量的实现——没有什么特别的——而face是一个包含3个整数的类,指向vertices中垂直线的索引。

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

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之间浮动的三元组列表。但是,不会应用颜色。我读了很多纹理贴图的例子,并试图做同样的事情,但没有成功。你知道我做错了什么吗?

从您的评论中可以看出,您使用了错误的OpenGL功能来实现您想要的功能。纹理是指通过使用例如uv坐标将2d图像粘贴到网格上。

您要做的是在每个顶点上指定一种颜色,因此需要启用GL_color_ARAY而不是GL_TEXTURE_CORD_ARAY,并为此使用相应的函数。

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

回答最后一条评论:

嗯,我从纹理文件中读取了这些颜色,这就是我的意思。有没有一种方法可以使用这样的数组以彩色显示我的网格?

是和否:当你这样做的时候,你很可能不会得到你期望的结果。通常,纹理中会有多个像素,这些像素应该映射到一个面上。对于顶点颜色,每个顶点只能应用一个颜色值,该值将在三角形上插值。看看如何将纹理应用于网格,你应该能够在互联网上找到很多资源。