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가 텍스처 핸들의 포인터를 전달받습니다. 핸들은 런타임 동안 다른 핸들로 변경되지만 텍스처 핸들에 관계없이로드 된 마지막 텍스처를 그립니다.
왜 'GL_TEXTURE_CUBE_MAP'과 (과) GL_TEXTURE_2D를 혼합하고 있습니까? 그것은 아마도 문제 일 것입니다. 또한 왜 'Texture' 멤버 변수를 포인터로 만들었습니까? GLuint에서'glGenTextures (1, & Texture)'를 호출하면됩니다. – Overv
'GL_TEXTURE_CUBE_MAP'은 어디에 있나요? Texture를 'Texture = new GLuint;'라는 포인터로 설정하면 새 주소가 생성됩니다. TextureMap.insert (std :: pair (Source, Texture));를 호출했을 때 현명하게 동일한 메모리 주소를 계속 푸시하고 새로운 텍스쳐가 모두로드 될 때 텍스처가 변경됩니다. 현재 텍스처가 푸시 될 때마다 '텍스처'는 매번 다른 메모리 주소입니다. –
Student123
'LoadTexture'함수의 4 번째 줄에 있습니다. 당연히'GLuint *'대신'GLuint'를 저장하도록지도를 변경해야합니다. – Overv