简体   繁体   中英

OpenGL is using the last texture loaded

Edit: Ive narrowed it down to this: It seems like if I do the below in my function, and then in the renderer function never call glBindTexture again it will still render... the textures...

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 );

I must not be understanding something, or I have a big error in my code.


I am just trying to get WaveFront objects with materials loaded, and rendered. With that said, Im just trying to piece together some code to get a better understanding of how everything works so I can go back and reprogram everything. (I am on windows)

I can load .objects from files and even load textures... Problem is, the last texture loaded is used for all objects....

here it glIntercept for loading the images...

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)

.. From:

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 );

The above code is how I am loading the texture. NM is in a vector array in VectorMaterialLibrary, and that is in 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();
            }
        }
    }

}

Also, the glintercept for the render (took the last image1 call and the start of 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()

Im wondering where I went wrong. I really just want this to work so I can recode the framework from scratch again.

If you need further code, I can post it, but I dont want a big wall!!!

// Edit, manually doing the following.. bad

// 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;
                }
            }

But the object is STILL the same texture...

Here is a picture of something I am rendering. Notice everything is the same color... The two cubes in the middle should be two different colors, and the other objects are also taking the same texture... here are the two textures (scaled down ofc)

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 **

I hate to do this, but after a couple days debugging and going over my OpenGL booklets I have answered my own question.

The problem with my code was based on the .obj format and how I am ordering the faces. In .obj format each .obj is incremented... example:

OBJECT ONE

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

OBJECT TWO

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

How I was storing the Vertex/VertexTexture/VertexNormals, were correct, but my loop was starting from 0 on the second object, meaning I was actually recreating the first objects all over again, thus it applied the last texture...

To anyone else: Please be aware of how your program is storing and reading things.

A couple days of work with only a single line of code changed to make it functional... yippie.

It would be nice if there were a way to make sure blender did not do this...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM