2011-12-29 6 views
0

OpenGL에서 2D 등각 투영 그리드입니다. (그림 : http://i.imgur.com/nUZax.png). 제발 실제 코드를 바르게 쓰지 전에 많은 것들이 그냥 시도하는 것입니다. 나는이 물건으로 손을 더럽 히려고 노력하고 있습니다.OpenGL, 등각 투영 2D 맵 및 텍스처

각 타일의 너비는 76 픽셀이고 높이는 38 픽셀입니다. 이제 저는 각각의 타일을 제가 만든 약간의 잔디 텍스처로 텍스처를 만들고 싶습니다. 그러나, 그것은 잘되지 않을 것입니다!

내 문제는 텍스처가 계속 엉망으로 보이고 있다는 것입니다. 크기가 절반 (예 : 절반 크기)보다 작으며 흰색으로 둘러싸여 있습니다. 이것은 텍스쳐를 적용 할 때 사용하는 코드입니다 (크기는 76x38입니다!).

void drawSquare(int x, int y) { 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glBegin(GL_QUADS); 
     glTexCoord2i(38, -19); glVertex2i(x+38, y); 
     glTexCoord2i(-38, 19); glVertex2i(x, y+19); 
     glTexCoord2i(38, -19); glVertex2i(x-38, y); 
     glTexCoord2i(-38, 19); glVertex2i(x, y-19); 
    glEnd(); 
} 

내가 이렇게 내 오르의 설정을 넣어, X를 계산 코드의 일부이며 Y.

for (int y = 1; y < gridY+1; y++) { 
    for (int x = 1; x < gridX+1; x++) { 
     drawSquare((x-y) * 38 + (SCREEN_SIZE_X/2), (x+y) * 19); 
    } 
} 

아마도 추가해야합니다.

glOrtho(0, SCREEN_SIZE_X, 0, SCREEN_SIZE_Y, -1, 1); 

나를 여기에 도움이 될 수

사람 (SCREEN_SIZE_X 및 SCREEN_SIZE_Y는 800 × 600 인)? 그 점은 크게 감사하겠습니다. 아마 그것을 더 분명하게하기 위해, 이것이 바로 지금처럼 보이는 방법입니다!

편집 : 일부 도움이 끝나면이 부분으로 변경되었습니다.

glBegin(GL_QUADS); 
//glColor3f(r, g, b); 
glTexCoord2f(0,1); glVertex2i(x+38, y); 
glTexCoord2f(1,1); glVertex2i(x, y+19); 
glTexCoord2f(1,0); glVertex2i(x-38, y); 
glTexCoord2f(0,0); glVertex2i(x, y-19); 
glEnd(); 

결과 : GL_TEXTURE_2D 사용시 http://i.imgur.com/sOqsH.png

답변

3

텍스처 좌표하지 -38에서 19까지, 0에서 1로 이동한다.

또한 glTexCoord2f()를 사용해야합니다.

편집 : 이 아마 가장 쉬운/가장 좋은 방법 : 단지 당신의 질감이 100 % 투명 모서리를 가지고 있는지 확인, 단일 쿼드로 전체 텍스처를 그릴, 투명성 (혼합)를 활성화!

참고 : 항상 전체 텍스처를 사용하기 때문에 glTexCoord2i()를 사용할 수 있습니다. 그러나 텍스처 맵을 만들려면 glTexCoord2f()가 필요합니다.

void drawSquare(int x, int y) { 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glBegin(GL_QUADS); 
     glTexCoord2i(0, 0); glVertex2i(x-38, y-19); 
     glTexCoord2i(1, 0); glVertex2i(x+38, y-19); 
     glTexCoord2i(1, 1); glVertex2i(x+38, y+19); 
     glTexCoord2i(0, 1); glVertex2i(x-38, y+19); 
    glEnd(); 
} 

기억 또한

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

, 당신은로드 확인 : 텍스처가 영점 좌표 (0,0 것은) 바닥으로하는 BlendMode을 설정하는 것을 잊지 말아, 또한

왼쪽입니다 알파 채널이 아직 작동하지 않는다면 알파 채널이 OpenGL 텍스처에 존재하는지 확인하십시오.

+0

나는 그것을 시도했지만 그때 텍스처는 여전히 모든 borked 나온다. 이 경우 어떻게 생겼는지 보여 줄 수 있어요. –

+0

텍스처 좌표를 0에서 1 사이로 고정 했습니까? 0과 1 만 사용하고 텍스처가 각 타일에 _ 완전하게 표시되는지 확인하십시오. 그렇지 않은 경우 다른 것이 잘못되었습니다 ... – Rookie

+0

스크린 샷과 코드가있는 원본 게시물을 업데이트했습니다. –