c++ - OpenGL 正在使用最后加载的纹理

标签 c++ opengl

编辑: 我把它缩小到这个:似乎如果我在我的函数中执行以下操作,然后在渲染器函数中永远不会再次调用 glBindTexture 它仍然会渲染...纹理...

NM->data = stbi_load ( FileBuf  , &NM->width , &NM->height , &NM->bit , 0 );
//glGenTextures ( 1 , &NM->texture [ 0 ] );                                 // ** OFF **
//glBindTexture ( GL_TEXTURE_2D, NM->texture [ 0 ] );                       // ** OFF **
//glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR );    // ** Enableing This Will Render White (no texture)
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR );      // ** Enableing This Will Render the texture for both objects *** SUPER WEIRD ***
// *** ALSO *** I dont ever call glBindTexture Again after this but still the object is being textured ***
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , NM->width , NM->width , 0 , GL_RGBA , GL_UNSIGNED_BYTE , NM->data );
stbi_image_free ( NM->data );

我一定是没理解什么,或者我的代码有很大错误。


我只是想获取加载和渲染 Material 的 WaveFront 对象。话虽如此,我只是想拼凑一些代码以更好地了解一切是如何工作的,这样我就可以回去重新编程一切。 (我在 window 上)

我可以从文件加载 .objects 甚至加载纹理...问题是,最后加载的纹理用于所有对象....

这里是 glIntercept 用于加载图像...

glGenTextures(1,05331C10)
glBindTexture(GL_TEXTURE_2D,1)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,05733040)
glGenTextures(1,05332780)
glBindTexture(GL_TEXTURE_2D,2)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,0573D040)

.. 来自:

NM->MapUsed = true;
sscanf ( coord [ i ]->c_str() , "map_Kd %s" , NM->map_Kd );
char FileBuf [ 256 ] = { 0x0 };
sprintf ( FileBuf , "C:\\OpenGL\\Debug\\%s" , NM->map_Kd );
NM->data = stbi_load ( FileBuf  , &NM->width , &NM->height , &NM->bit , 0 );
glGenTextures ( 1 , &NM->texture );
glBindTexture ( GL_TEXTURE_2D, NM->texture );
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , NM->width , NM->height , 0 , GL_RGBA , GL_UNSIGNED_BYTE , NM->data );
stbi_image_free ( NM->data );

上面的代码是我加载纹理的方式。 NM在VectorMaterialLibrary中是 vector 数组,而在ObjectLoader vector 中...

void Renderer() {

    updatecam();

    // all My Objects
    for ( int i = 0 ; i < ObjectLoader.size() ; i++ ) {
        sObjectLoader *TempObject = ObjectLoader [ i ];

        if ( TempObject->MTLFile ) {
            for ( int z = 0 ; z < TempObject->VectorMaterialLibrary.size() ; z++ ) {
                sMaterialLibrary *TempMaterial = TempObject->VectorMaterialLibrary [ z ];
                if ( strcmp ( TempMaterial->newmtl , TempObject->usemtl ) == 0 ) {
                    if ( TempMaterial->MapUsed ) {
                        glBindTexture ( GL_TEXTURE_2D, TempMaterial->texture );  // *** This Dings 1/2 respectively ***
                    }
                    break;
                }
            }
        }

        for ( int z = 0 ; z < TempObject->_3f.size() ; z++ ) {
            s3f *Temp3f = TempObject->_3f [ z ];
            if ( Temp3f->GL_TYPE == GL_QUADS ) {
                glBegin ( GL_QUADS );
                if ( Temp3f->boolvn ) {
                    glNormal3f ( Temp3f->vn [ 0 ] , Temp3f->vn [ 1 ] , Temp3f->vn [ 2 ] );
                }
                if ( Temp3f->boolv ) {
                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 0 ] , Temp3f->vt [ 1 ] );
                    glVertex3f ( Temp3f->v [ 0 ] , Temp3f->v [ 1 ] , Temp3f->v [ 2 ] );

                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 2 ] , Temp3f->vt [ 3 ] );
                    glVertex3f ( Temp3f->v [ 3 ] , Temp3f->v [ 4 ] , Temp3f->v [ 5 ] );

                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 4 ] , Temp3f->vt [ 5 ] );
                    glVertex3f ( Temp3f->v [ 6 ] , Temp3f->v [ 7 ] , Temp3f->v [ 8 ] );

                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 6 ] , Temp3f->vt [ 7 ] );
                    glVertex3f ( Temp3f->v [ 9 ] , Temp3f->v [ 10 ] , Temp3f->v [ 11 ] );
                }
                glEnd();
            } else {
                glBegin ( GL_TRIANGLES );
                if ( Temp3f->boolvn ) {
                    glNormal3f ( Temp3f->vn [ 0 ] , Temp3f->vn [ 1 ] , Temp3f->vn [ 2 ] );
                }
                if ( Temp3f->boolv ) {
                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 0 ] , Temp3f->vt [ 1 ] );
                    glVertex3f ( Temp3f->v [ 0 ] , Temp3f->v [ 1 ] , Temp3f->v [ 2 ] );

                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 2 ] , Temp3f->vt [ 3 ] );
                    glVertex3f ( Temp3f->v [ 3 ] , Temp3f->v [ 4 ] , Temp3f->v [ 5 ] );

                    if ( Temp3f->boolvt ) glTexCoord2f ( Temp3f->vt [ 4 ] , Temp3f->vt [ 5 ] );
                    glVertex3f ( Temp3f->v [ 6 ] , Temp3f->v [ 7 ] , Temp3f->v [ 8 ] );
                }
                glEnd();
            }
        }
    }

}

此外,渲染的 glintercept(获取最后一个 image1 调用和 image2 的开始...)

glBegin(GL_TRIANGLES) Textures[ (0,1) ] 
glNormal3f(0.000000,0.000000,-1.000000)
glTexCoord2f(1.000000,0.000000)
glVertex3f(1.892851,-0.950534,-3.331728)
glTexCoord2f(1.000000,1.000000)
glVertex3f(-0.107149,-0.950534,-3.331728)
glTexCoord2f(0.000000,1.000000)
glVertex3f(-0.107149,1.049466,-3.331728)
glEnd()
glBindTexture(GL_TEXTURE_2D,2)
glBegin(GL_TRIANGLES) Textures[ (0,2) ] 
glNormal3f(0.000000,-1.000000,-0.000000)
glTexCoord2f(0.000000,0.000000)
glVertex3f(1.892851,-0.950534,-3.331728)
glTexCoord2f(1.000000,0.000000)
glVertex3f(1.892851,-0.950534,-1.331729)
glTexCoord2f(0.000000,1.000000)
glVertex3f(-0.107149,-0.950534,-3.331728)
glEnd()

我想知道我哪里做错了。我真的只是希望它能正常工作,这样我就可以再次从头开始重新编写框架。

如果你需要进一步的代码,我可以贴出来,但我不想要一堵大墙!!!

//编辑,手动执行以下操作..不好

// I only have 2 objects with this test, and 2 materials...
                if ( testing ) {
                    glGenTextures ( 2 , Gtextures );    // ********Global
                    testing = false;
                    NM->data = stbi_load ( FileBuf  , &NM->width , &NM->height , &NM->bit , 0 );
                    glBindTexture ( GL_TEXTURE_2D, Gtextures[0] );
                    glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
                    glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
                    glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , NM->width , NM->height , 0 , GL_RGBA , GL_UNSIGNED_BYTE , NM->data );
                    stbi_image_free ( NM->data );
                } else {
                    NM->data = stbi_load ( FileBuf  , &NM->width , &NM->height , &NM->bit , 0 );
                    glBindTexture ( GL_TEXTURE_2D, Gtextures[1] );
                    glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
                    glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
                    glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , NM->width , NM->height , 0 , GL_RGBA , GL_UNSIGNED_BYTE , NM->data );
                    stbi_image_free ( NM->data );
                }

**

for ( int z = 0 ; z < TempObject->VectorMaterialLibrary.size() ; z++ ) {
                sMaterialLibrary *TempMaterial = TempObject->VectorMaterialLibrary [ z ];
                if ( strcmp ( TempMaterial->newmtl , TempObject->usemtl ) == 0 ) {
                    if ( TempMaterial->MapUsed ) {
                        //mbci ( "Changing Texture" , i );
                        //mbci ( "Gtextures [ i ]" , Gtextures [ i ] );
                        glBindTexture ( GL_TEXTURE_2D, Gtextures [ i ] );  // ** I only have 2 objects so this works for loading the 2 textures...
                        //glBindTexture ( GL_TEXTURE_2D, TempMaterial->texture );
                    }
                    break;
                }
            }

但对象仍然是相同的纹理...

这是我正在渲染的图片。注意一切都是相同的颜色......中间的两个立方体应该是两种不同的颜色,其他物体也采用相同的纹理......这是两个纹理(按比例缩小)

What I See http://i.stack.imgur.com/s1NXn.png ** No Idea **
Cube UV1 http://i.stack.imgur.com/s44Tb.png ** This is loaded first**
Cube UV2 http://i.stack.imgur.com/8KXdo.png ** This is loaded last **

最佳答案

我讨厌这样做,但经过几天的调试和阅读我的 OpenGL 小册子后,我已经回答了我自己的问题。

我的代码的问题是基于 .obj 格式以及我如何对面进行排序。在 .obj 格式中,每个 .obj 都会递增...示例:

对象一

f 5/1/1 6/2/1 1/3/1
f 6/1/2 7/2/2 2/3/2
f 7/1/3 8/2/3 3/3/3
f 8/1/4 5/2/4 4/3/4
f 1/1/5 2/2/5 4/3/5
f 8/1/6 7/2/6 5/3/6
f 6/2/1 2/4/1 1/3/1
f 7/2/2 3/4/2 2/3/2
f 8/2/3 4/4/3 3/3/3
f 5/2/4 1/4/4 4/3/4
f 2/2/5 3/4/5 4/3/5
f 7/2/6 6/4/6 5/3/6

对象二

f 9/5/7 10/6/7 12/7/7
f 13/5/8 16/6/8 14/7/8
f 9/5/9 13/6/9 10/7/9
f 10/5/10 14/6/10 11/7/10
f 11/5/11 15/6/11 12/7/11
f 13/5/12 9/6/12 16/7/12
f 10/6/7 11/8/7 12/7/7
f 16/6/8 15/8/8 14/7/8
f 13/6/13 14/8/13 10/7/13
f 14/6/10 15/8/10 11/7/10
f 15/6/11 16/8/11 12/7/11
f 9/6/12 12/8/12 16/7/12

我存储 Vertex/VertexTexture/VertexNormals 的方式是正确的,但是我的循环是从第二个对象上的 0 开始的,这意味着我实际上是重新创建了第一个对象,因此它应用了最后一个纹理...

致其他人:请注意您的程序如何存储和读取内容。

几天的工作,只更改了一行代码以使其正常运行...yippie。

如果有一种方法可以确保 blender 不会这样做,那就太好了......

关于c++ - OpenGL 正在使用最后加载的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21231046/

相关文章:

C++如何在实例之间访问类成员函数

c++ - 在其成员函数返回之前删除对象是未定义的行为吗?

c++ - opengl不画任何东西

c++ - 在 Tile Map 上绘制 Sprite

c++ - 如何使用 sort 对类中的 vector 进行排序

c++ - 左值的正确引用

c++ - Boost 库 iostream::copy 不起作用

opengl - OpenGL纹理和对象流

c++ - Opengl 中的纹理采样

c++ - TrueType 字体缩放会导致文本模糊?