2012-01-27 2 views
0

내 Render 클래스에 showMainMenu()라는 메서드가 있습니다. 에서 내가 할 비트 맵으로 렌더링 내의 ctor에서OpenGL은 메서드 내에서로드 된 텍스처 만 표시합니까?

Bitmap* bBall; 
Bitmap* bWall; 
Bitmap* bStart; 
Bitmap* bEnd; 
Bitmap* bHighscores; 
Bitmap* bHelp; 
Bitmap* bStar; 

을 내 텍스처를 정의한 렌더링 :

showMainMenu에서
this->bBall = new Bitmap("ball.bmp"); 
this->bEnd = new Bitmap("beenden.bmp"); 
this->bStart = new Bitmap("starten.bmp"); 
this->bStar = new Bitmap("star.bmp"); 
this->bHelp = new Bitmap("hilfe.bmp"); 
this->bHighscores = new Bitmap("highscores.bmp"); 
this->bWall = new Bitmap("wall.bmp"); 

() 나는 다음과 같은 방법으로 텍스처 바인딩 :

glEnable(GL_TEXTURE_2D); //Texturen aktivieren 

//draw Start button 
glBindTexture(GL_TEXTURE_2D, this->bStar->texture); 

그러나 내 디스플레이가 흰색으로 유지됩니다. ( 내 방법 내에서 텍스처를로드 할 때

Bitmap m = Bitmap("star.bmp"); 
glBindTexture(GL_TEXTURE_2D, m.texture); 

질감을 볼 수 있습니다. 왜 1 차가 작동하지 않습니까?

+2

여기에 갈 정보가 너무 적습니다. 어디서 텍스쳐 객체를 생성합니까? 어디에서 텍스쳐 데이터를로드합니까? 셰이더를 사용합니까? 그렇다면 샘플러를 어디서 보내십니까 ...? 문제를 보여주는 최소한의 작업 예제를 제거하십시오. – KillianDS

답변

2

OpenGL 컨텍스트를 만들기 전에 Bitmap 인스턴스를 만드는 것이 가장 좋습니다. 그러면 비트 맵 파일이로드되지만 텍스처 객체는 생성되지 않습니다. 이 문제를 해결하는 가장 쉬운 방법 : 비트 맵을 인스턴스화하면 (즉, 생성자에서) 파일 데이터를로드하고 텍스처 ID 변수를 0으로 설정합니다. bindTexture 메서드를 추가하면 glBindTexture가 호출됩니다 (어쨌든이 작업을 수행해야합니다. 가야한다). 또한 텍스처 ID가 0 인 경우 테스트를 추가하고 바인딩하기 전에 ID와 텍스처를 생성하십시오.

예 :

void Bitmap::bindTexture() 
{ 
    if(!textureID) { 
     glGenTextured(1, &textureID); 
     glBindTexture(GL_TEXTURE_..., textureID); 
     upload_texture_data(); 
    } else { 
     glBindTexture(GL_TEXTURE_..., textureID); 
    } 
} 

BTW : this->를 통해 클래스 멤버에 액세스하는 것은 나쁜 스타일로 간주하고, 그런 식으로 일을 할 이유가 전혀 없다됩니다. 심지어 this 포인터를 기본 클래스에 캐스트하면 암시 적 업 캐스팅이 가상의 전체 지점이기 때문에 가상 메서드를 제공하지 않습니다.

+0

if 내부에 텍스처 데이터를 업로드하기 전에 바인드하는 것을 잊지 마십시오. –

관련 문제