繁体   English   中英

在OpenGL中将纹理映射到顶点

[英]Mapping a texture to vertices in OpenGL

我正在尝试使用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_ARRAY而不是GL_TEXTURE_COORD_ARRAY并为此使用相应的功能。

另一提示:如果要从头开始学习OpenGL,则应考虑仅使用现代OpenGL(3.2+)

要回答最后一条评论:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM