2013-01-24 1 views
5

큐브를 텍스처링하는 가장 좋은 방법은 무엇입니까 (최저 메모리, 가장 빠른 속도)?OpenGL에서 큐브를 텍스처링하는 가장 좋은 방법

데이터 구조체 :

GLfloat Cube::vertices[] = 
{-0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 1.0f, 0.5f, -0.5f, 1.0f, 0.5f, 
    -0.5f, 1.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, -0.5f, 
    0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 1.0f, 0.5f, 
    -0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f 
    }; 

GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0 
          }; 

GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0, 
            8,9,10,11, 12,13,14,15}; 

그리기 기능 :

 glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glColor3f(1.0f, 1.0f, 1.0f); 

     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     //glDisableClientState(GL_COLOR_ARRAY); 
     glDisable(GL_TEXTURE_2D); 

당신이 결과를 볼 수 있듯이이 올바른지 : cube

만에 잠시 후에 나는이 해결책을 찾을 수 있습니다 rech이 결과 나는 일부 정점을 재정의해야합니다 (vertices 배열에 16 3D 점이 있습니다) 그렇지 않으면 텍스처가 th에 매핑되지 않습니다. e DrawElement 함수.

누군가가 꼭지점 배열에서 큐브를 텍스처링하는 더 좋은 방법을 알고 있습니까?

+3

왜 "가장 빠른/가장 낮은 메모리"가 필요합니까? 10 억 개의 큐브가 화면에 나타날 계획입니까? 또한, "정점 재정의"란 무엇을 의미합니까? –

+0

큐브 텍스처를 설정 한 후 fps가 감소합니다 (60에서 40까지). "vertices"배열의 일부 정점을 재정의했습니다. 그 배열에 16 점 (3D)이 밀접하게 보이지만 큐브 8을 정의하는 것으로 충분합니다. – Luca

+2

여러분은 매우 잘못된 것을하고 있습니다. 아마도 큐브가 아니기 때문에, 8 또는 16 버텍스는 별 차이가 없습니다. 또한 각 꼭지점이 3 개의면을 연결하고 모두 서로 다른 uv 좌표를 가지고 있다고 가정하면이 "여분의"꼭지점이 필요합니다. 확실하지는 않지만 glTexParameteri를 한 번만 호출하면됩니다. 텍스처를 만들 때 그것이 루프에 있다면 감속의 원인 일 수 있습니다. –

답변

1

OpenGL과 함께 작업하면서 같은 문제가 발생했습니다. 내 연구에 따르면 각 정점에는 하나의 텍스처 좌표 만있을 수 있으므로 다른 방법은 없다고 지적했습니다.

0

음, 버텍스 쉐이더가 텍스처 좌표를 처리하는 큐브 맵 텍스처를 사용할 수 있습니다.

out vec2 texcoords; 
texcoords=normalize(vertex_data.xy) 

필요 없음을 정점을 재정의, 또한 버텍스 버퍼 오브젝트를 사용하여 성능을 향상시킬 수 있습니다 : 당신이 텍스 좌표를 생성 할 일은 당신의 버텍스 쉐이더에서이 줄을 추가합니다.

+0

내게는 쉐이더를 사용하는 것이 빠르다. – Luca

+0

나는 "나를 위해 일찌기"라는 것이 무엇을 의미하는지 모르겠다. – debonair

+0

나는 openGl 세계에서 처음이다. 기초를 배운다. – Luca

관련 문제