[英]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.