2017-12-14 37 views
0

OpenGL에서 텍스처를 두 개 이상 사용하는 데 문제가 있습니다. 필자는 두 개의 사각형을 그리는 테스트 프로그램을 작성했습니다. 난 그냥 하나의 다음의 텍스처 라이징 때, 모든 것이 잘 작동하지만 난 두 텍스처 경우, 결과 이잖아 다음 그게 전부OpenGL에서 텍스처 맵핑 버그 (다중 텍스처 사용)

unsigned int grass_height, grass_width, wall_height, wall_width; 
unsigned char *grass = loadBMP("./minegrama.bmp", &grass_height, &grass_width); 
unsigned char *wall = loadBMP("./mineleaves.bmp", &wall_height, &wall_width); 

glShadeModel(GL_SMOOTH); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 

glGenTextures(2, tex); 

glBindTexture(GL_TEXTURE_2D, tex[0]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, grass_width, grass_height, 0, GL_BGR, GL_UNSIGNED_BYTE, grass); 
gluBuild2DMipmaps(tex[0], GL_RGB, grass_width, grass_height, GL_RGB, GL_UNSIGNED_BYTE, grass); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, tex[1]); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, wall_width, wall_height, 0, GL_BGR, GL_UNSIGNED_BYTE, wall); 
gluBuild2DMipmaps(tex[1], GL_RGB, grass_width, grass_height, GL_RGB, GL_UNSIGNED_BYTE, wall); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

: 내가 텍스처를 초기화하는 데 사용하는 코드 그게

The underlying square is too big to be fully displayed

을 도면 코드 :

//Seta o MatrixMode pra usar texturas 
glMatrixMode(GL_TEXTURE); 
//INICIO DO CHAO 
glPushMatrix(); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, tex[0]); 
//Desenhar o chao; 
glColor3f(0, 0.39, 0); 
glBegin(GL_QUADS); 
glVertex3f(-30, -30, -0.001); 
glTexCoord3f(-30, -30, -0.001); 

glVertex3f(30, -30, -0.001); 
glTexCoord3f(30, -30, -0.001); 

glVertex3f(30, 30, -0.001); 
glTexCoord3f(30, 30, -0.001); 

glVertex3f(-30, 30, -0.001); 
glTexCoord3f(-30, 30, -0.001); 
glEnd(); 
glDisable(GL_TEXTURE_2D); 
glPopMatrix(); 
//FIM DO CHAO 


glPushMatrix(); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, tex[1]); 
glTranslatef(0, 0, 10); 
glBegin(GL_QUADS); 
glVertex3f(-1, -1, 0); glTexCoord3f(-1, -1, 0); //Especifica cada vértice 
glVertex3f(1, -1, 0); glTexCoord3f(1, -1, 0); 
glVertex3f(1, 1, 0); glTexCoord3f(1, 1, 0); 
glVertex3f(-1, 1, 0); glTexCoord3f(-1, 1, 0); 
glDisable(GL_TEXTURE_2D); 
glEnd(); 
glPopMatrix(); 
+1

텍스처 좌표가 약간 이상해 보입니다. 경우에 따라, 당신은 이것을 볼 수 있습니다 : [그래서 : 어떻게 OpenGL 텍스쳐 좌표가 작동합니까?] (https://stackoverflow.com/q/5532595/7478597). (이미지가 대개 2D이기 때문에 'glTexCoord3'을 사용하지 않았습니다.) ;-) – Scheff

답변

0

gluBuild2DMipmaps의 첫 번째 매개 변수가 잘못되었습니다. 매개 변수에 대한 documentation의 매개 변수 상태는 다음과 같습니다.

대상 텍스처를 지정합니다. GLU_TEXTURE_2D 여야합니다.

또한 텍스처 좌표가 좋지 않습니다. 현재 값을 사용하면 큰 직사각형의 텍스처가 60 번 반복됩니다. 또한 텍스처 좌표의 Z 값은 0.01가 아니라 0이어야합니다. 더 좋은 점은 2 차원 텍스처에 glTexCoord2f을 사용하는 것입니다.

+0

정말로 감사합니다! –