Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL纹理绑定/渲染_C++_Qt_Opengl_Textures_Texture Mapping - Fatal编程技术网

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纹理坐标在特定网格上加载纹理吗?我想我的主要问题是我在面上迭代渲染,而纹理的顶点列表是通用的(绑定到网格而不是面)

是的,在绘制应将纹理映射到其上的对象之前,需要绑定纹理。对于纹理坐标,通常使用二维坐标,其形式称为标准化坐标-其范围为0.0-1.0,超出此范围的任何内容都会受到称为环绕的影响。有关详细信息,请查阅
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()