我尝试使用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之间浮点数的三元组列表。但是,不应用颜色。我阅读了许多纹理映射的例子,并尝试做同样的事情,没有运气。我知道我做错了什么?
答案 0 :(得分:1)
从您的评论中可以看出,您使用了错误的OpenGL功能来实现您的目标。纹理化意味着通过使用例如2d将2d图像粘附到网格上。 UV坐标。
您正在做的是在每个顶点上指定颜色,因此您需要启用GL_COLOR_ARRAY而不是GL_TEXTURE_COORD_ARRAY并使用相应的函数。
另外一个提示:如果你从头开始学习OpenGL,你应该考虑只使用现代的OpenGL(3.2 +)
回答最后的评论:
好吧,我从纹理文件中读取了那些颜色,这就是我的意思。有没有办法使用这样的数组来显示我的网格颜色?
是和否:在执行此操作时,您很可能无法获得预期的结果。通常,纹理中应该有多个像素映射到面。对于顶点颜色,您只能在每个顶点应用一个颜色值,并在三角形上进行插值。看看如何将纹理应用于网格,你应该能够在互联网上找到很多资源。