C++ OpenGL纹理绑定/渲染
这是我第一次尝试使用纹理贴图 这是我的实现: 全局字段:C++ OpenGL纹理绑定/渲染,c++,qt,opengl,textures,texture-mapping,C++,Qt,Opengl,Textures,Texture Mapping,这是我第一次尝试使用纹理贴图 这是我的实现: 全局字段: GLuint texture[big]; // Storage for some Textures int globalcounter; 网格绘制: ApplyMaterial(mesh->Materials()); //set material properties,works fine DrawSingleObject(*mesh); 绘制方法: DrawSingleObject(Mesh&
GLuint texture[big]; // Storage for some Textures
int globalcounter;
网格绘制:
ApplyMaterial(mesh->Materials()); //set material properties,works fine
DrawSingleObject(*mesh);
绘制方法:
DrawSingleObject(Mesh& p){
QList<Face>& faces=p.Faces();
int NumberOfFaces=faces.count();
QList<Vector3D>& normals =p.Normals();
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glGenTextures(1, &texture[globalcounter]); // Create The Texture
glBindTexture(GL_TEXTURE_2D, texture[globalcounter]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256 , 256 , 0, GL_RGB, GL_UNSIGNED_BYTE, p.Mat().GetTexture()->Data() );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
for (int t = 0; t < NumberOfFaces; ++t) {
Face& f = faces[t];
GLenum face_mode;
int* lista=f.arrayVertici;
const QList<Vector3D> vertices=p.Vertices();
int* listaNorm=f.normalIndex;
switch(f.VertexNumber) {
case 1:
face_mode = GL_POINTS;
glBegin(face_mode);
if(hasNormals)
glNormal3fv(&((normals[listaNorm[0]]).pos[0]));
glTexCoord2f(?);
glVertex3fv(&vertices[lista[0]].pos[0]);
break;
case 2:
face_mode = GL_LINES;
glBegin(face_mode);
if(hasNormals){
glNormal3fv(&((normals[(f.normalIndex)[0]]).pos[0]));
glTexCoord2f(?);
glVertex3fv(&vertices[lista[0]].pos[0]);
glNormal3fv(&((normals[(f.normalIndex)[1]]).pos[0]));
glTexCoord2f(?);
glVertex3fv(&vertices[lista[1]].pos[0]);
}
else{
glVertex3fv(&vertices[lista[0]].pos[0]);
glVertex3fv(&vertices[lista[1]].pos[0]);
}
break;
case 3:
face_mode = GL_TRIANGLES;
glBegin(face_mode);
if(hasNormals){
glNormal3fv(&normals[(f.normalIndex)[0]].pos[0]);
glTexCoord2f(?);
glVertex3fv(&vertices[lista[0]].pos[0]);
glNormal3fv(&normals[(f.normalIndex)[1]].pos[0]);
glTexCoord2f(?);
glVertex3fv(&vertices[lista[1]].pos[0]);
glNormal3fv(&normals[(f.normalIndex)[2]].pos[0]);
glTexCoord2f(?);
glVertex3fv(&vertices[lista[2]].pos[0]);
}
else{
glVertex3fv(&vertices[lista[0]].pos[0]);
glVertex3fv(&vertices[lista[1]].pos[0]);
glVertex3fv(&vertices[lista[2]].pos[0]);
}
break;
default: face_mode = GL_POLYGON; break;
}
glEnd();
}
glDisable(GL_TEXTURE_2D);
}
纹理具有以下字段:
Texture* mTexture;
QImage* mImage;
a dedicated pointer to mImage->bits()
纹理现在已正确加载到mImage
问题:
- 绑定:在顶点绘制之前绑定纹理正确吗?这是正确的实现吗
- 你能解释一下如何使用Vector3D纹理坐标在特定网格上加载纹理吗?我想我的主要问题是我在面上迭代渲染,而纹理的顶点列表是通用的(绑定到网格而不是面)
GL_TEXTURE_WRAP_S
和GL_TEXTURE_WRAP_T
()。请注意,使用glGenTextures
创建的纹理需要使用glDeleteTextures
释放,以避免内存泄漏。最好在draw函数之外创建纹理,然后重用它或在内容更改时更新其数据。即使在你的帮助下调用了DrawSingleObject
,代码看起来也会更好。我已经编写了一些伪代码,希望现在可以(现在不能直接测试):记住每次更改加载的模型时都要释放纹理内存。我需要使用glTexCoord2f(t1,t2)在一个不平凡的对象上加载纹理。我了解它在立方体上的用途,但我不知道如何在像面这样的模型上使用它(想象一个网格有一个纹理和许多顶点)。有一些顶点坐标我必须附加纹理,但如何选择值t1,t2对于原始邮政编码的每个面?@nicolagenesin嗯,纹理坐标的处理方式与法线一样。您可以从文件中读取它们(使用复杂网格(如人脸),也可以在运行时生成它们(有许多不同的纹理投影方法)。但通常,如果您自己生成网格,则您只能自己生成纹理坐标。通常,如果你从文件中读取网格,你也应该从中读取纹理坐标。至于你的具体情况,“我认为我的主要问题是我在面上进行迭代渲染,而纹理的顶点列表是通用的(绑定到网格而不是面)。”我真的不知道你在使用什么API,但如果你将位置和法线绑定到面
s,那么你也应该将纹理坐标绑定到它。如果不是这样,那么您应该咨询编写该类的人(或文档),并询问他们如何使用该类。
QImage* mImage;
a dedicated pointer to mImage->bits()