2013-02-27 6 views
1

이것은 내가 겪어 본 큰 문제이다.LWJGL glTranslate 이상한 일을하고있다

glTranslate를 사용하여 여러 타일을 렌더링하려고하지만 x, y 좌표로 그리기 기능을 호출 할 때 타일이 이상하게 배치됩니다 (공백을 원하지 않음).

다음과 같은 현상이 발생합니다.

그리기 : 여기

Drawing multiple tiles but having problems

내 코드입니다

public void draw(float Xa, float Ya) { 

    GL11.glTranslatef(Xa, Ya, 0); 


    if(hasTexture) { 
    Texture.bind(); 

    GL11.glBegin(GL11.GL_QUADS); 
     GL11.glColor3f(0.5f, 0.5f, 1); 
     GL11.glTexCoord2f(0, 0); 
     GL11.glVertex2f(0, 0); 
     GL11.glTexCoord2f(0, 1); 
     GL11.glVertex2f(0, S); 
     GL11.glTexCoord2f(1, 1); 
     GL11.glVertex2f(S, S); 
     GL11.glTexCoord2f(1, 0); 
     GL11.glVertex2f(S, 0); 

     GL11.glEnd(); 
    } 

내 렌더링 코드 :

public void a() throws IOException { 
    GL11.glTranslatef(0, 0, -10); 
    int x = 0; 
    while (x < World.BLOCKS_WIDTH - 1) { 
     int y = 0; 
     while (y < World.BLOCKS_HEIGHT - 1) { 
      blocks.b[data.blocks[x][y]].draw(x, y); 
      y++; 
     } 
     x++; 
} 

오류가 (눈에 보이는 것들 제외)이없는

답변

4

현재 변환을 초기화하거나 푸시/팝하는 것으로 보이지 않습니다. 따라서 번역은 누적되어 더 큰 값으로 번역 할 때 점점 더 멀리 떨어져 나가는 효과를 만들어냅니다.

블록이 10 단위 떨어져 있다고 가정 해 보겠습니다. 첫 번째는 (0, 0), 다음 (0, 10), 다음 (0, 20), (0, 30) 등으로 변환됩니다.

그러나 번역이 뷰 매트릭스에 누적 될 때 실제로 얻을 수있는 것은 (0,0), (0,10), (0,30), (0,60) 등의 번역입니다.

복잡한 것은 일련의 단순한 이산 단계에서 변형. 그러나 각각의 변형이있는 여러 객체를 렌더링하려면 각 객체 사이에 어떤 형태의 재설정이 필요합니다.

전체 행렬을 다시 초기화 할 수는 있지만 약간 깔끔하며 이전에 수행 한 다른 변환 (예 : 카메라 등)을 파악해야합니다.

대신 현재 행렬을 스택에 "밀어 넣거나"수행 할 로컬 변환을 수행하고, 항목을 렌더링 한 다음 행렬을 "팝"하여 다시 시작할 수 있습니다. 다음 객체를 렌더링합니다.

이 기능은 이후 버전의 GL에서 사용되지 않습니다. 보다 현대적인 API를 사용하면 쉐이더를 사용하고 계산할 수있는 변환을 제공 할 수 있습니다.

+0

감사합니다. 이것이 정확히 무엇입니까? – teenHack42

+0

모든 opengl translate 함수는 실제로 행렬 계산입니다. OpenGL은 변환 행렬의 스택을 유지 관리하며 변환 작업은이 스택 맨 위에있는 행렬에 적용됩니다. glPushMatrix는 최상위 행렬의 복사본을 스택에 넣고, glPopMatrix는 그것을 제거합니다. 이것을 언두 메커니즘으로 생각할 수 있습니다. –