2015-01-10 3 views
0

텍스처가 변경되지 않고 그 이유가 확실하지 않습니다. 이 내 텍스처 Loader.hOpenGL이 텍스처를 변경하지 않습니다

class TextureLoader 
{ 
private: 
    GLuint* Texture; 
    std::map<std::string, GLuint*> TextureMap; 
public: 
    TextureLoader(){}; 
    ~TextureLoader() 
    { 
     delete Texture; 
    } 
    bool LoadTexture(std::string Source); 
    GLuint* GetImage(std::string TextureID);  
    bool CheckTextureExsist(std::string TextureID); 
}; 

이것은 CPP입니다.

bool TextureLoader::LoadTexture(std::string Source) 
{ 
    //Bind the texture to load in. 
    Texture = new GLuint; 
    glGenTextures (1, Texture); 
    glBindTexture (GL_TEXTURE_CUBE_MAP, *Texture); 

    glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE); 
    glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); 
    glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 

    //Width, Height and Components of the image. 
    int x, y, n; 

    //Set pixel format 
    int force_channels = 4; 

    //Load data into the char. 
    unsigned char* image_data = stbi_load (
     Source.c_str(), &x, &y, &n, force_channels); 

    //Check too see if the image loaded. 
    if (!image_data) { 
     fprintf (stderr, "ERROR: could not load %s\n", Source); 
     return false; 
    } 

    //Copy the image data to the selected target. 
    glTexImage2D (
     GL_TEXTURE_2D, 
     0, 
     GL_RGBA, 
     x, 
     y, 
     0, 
     GL_RGBA, 
     GL_UNSIGNED_BYTE, 
     image_data 
     ); 
    free (image_data); 

    TextureMap.insert(std::pair<std::string, GLuint*>(Source,Texture)); 
    return true; 
} 

GLuint* TextureLoader::GetImage(std::string TextureID) 
{ 
    return TextureMap.find(TextureID)->second; 
} 

bool TextureLoader::CheckTextureExsist(std::string TextureID) 
{ 

    if(TextureMap.find(TextureID) == TextureMap.end()) 
    { 
     return false; 
    } 
    else 
     return true; 
} 

이것은 내가 그리는 방법입니다.

glBindTexture(GL_TEXTURE_2D, *TextureID); 
    glMaterialfv(GL_FRONT , GL_AMBIENT, Ambient); 
    glMaterialfv(GL_FRONT , GL_DIFFUSE, Diffuse); 
    glMaterialfv(GL_FRONT , GL_SPECULAR, Specular); 
    glMaterialf(GL_FRONT , GL_SHININESS, Shininess); 

    glVertexPointer(3,GL_FLOAT,0,&Vertices[0]); 
    glNormalPointer(GL_FLOAT,0,&Normals[0]); 
    glTexCoordPointer(2,GL_FLOAT,0,&TextureCoords[0]); 

    glPushMatrix(); 
    glScalef(Scale[0],Scale[1],Scale[2]); 
    glTranslatef(Translate[0],Translate[1],Translate[2]); 
    glRotatef(Rotate[0],Rotate[1],Rotate[2],Rotate[3]);  
    glDrawArrays(GL_TRIANGLES, 0,(GLsizei)(Vertices.size()/3)); 
    glPopMatrix(); 
    glBindTexture(GL_TEXTURE_2D, NULL); 

TextureID가 텍스처 핸들의 포인터를 전달받습니다. 핸들은 런타임 동안 다른 핸들로 변경되지만 텍스처 핸들에 관계없이로드 된 마지막 텍스처를 그립니다.

+0

왜 'GL_TEXTURE_CUBE_MAP'과 (과) GL_TEXTURE_2D를 혼합하고 있습니까? 그것은 아마도 문제 일 것입니다. 또한 왜 'Texture' 멤버 변수를 포인터로 만들었습니까? GLuint에서'glGenTextures (1, & Texture)'를 호출하면됩니다. – Overv

+0

'GL_TEXTURE_CUBE_MAP'은 어디에 있나요? Texture를 'Texture = new GLuint;'라는 포인터로 설정하면 새 주소가 생성됩니다. TextureMap.insert (std :: pair (Source, Texture));를 호출했을 때 현명하게 동일한 메모리 주소를 계속 푸시하고 새로운 텍스쳐가 모두로드 될 때 텍스처가 변경됩니다. 현재 텍스처가 푸시 될 때마다 '텍스처'는 매번 다른 메모리 주소입니다. – Student123

+0

'LoadTexture'함수의 4 번째 줄에 있습니다. 당연히'GLuint *'대신'GLuint'를 저장하도록지도를 변경해야합니다. – Overv

답변

2

문제는 LoadTexture 기능에 GL_TEXTURE_CUBE_MAP에 구속력 :

glBindTexture(GL_TEXTURE_2D, *Texture); 

에 나는 또한 대신 GLuint*GLuint를 사용하여지도에 그것을 저장하는 것이 좋습니다 것이라고

glBindTexture (GL_TEXTURE_CUBE_MAP, *Texture); 

변경. glGenTextures이 포인터를 취하는 유일한 이유는 GLuint의 배열에도 출력 할 수 있기 때문입니다.

관련 문제