2016-07-20 4 views
0

큐브를 렌더링하고 모든면에 단일 텍스처를 적용하려고했습니다. 뿐만 아니라 얼굴의 정점 인덱스를 넘겨서 작은 정점을 사용할 수도 있습니다. 예 :GLES20 텍스처 데이터가 꼭지점 인덱스와 연결되지 않는 이유는 무엇입니까?

정점 :

static final float FACE_VERTEX[] = { 
     // front 
     0.0f, 1.0f, 1.0f,  //0 
     0.0f, 0.0f, 1.0f,  //1 
     1.0f, 0.0f, 1.0f,  //2 
     1.0f, 1.0f, 1.0f,  //3 

     //back 
     1.0f, 1.0f, 0.0f,  //4 - 3 
     1.0f, 0.0f, 0.0f,  //5 - 2 
     0.0f, 0.0f, 0.0f,  //6 - 1 
     0.0f, 1.0f, 0.0f,  //7 - 0 
}; 

인덱스 :

static final int FACE_INDEX[] = { 
     //front 
     0,1,2, 0,2,3, 
     //back 
     4,5,6, 4,6,7, 

     //left 
     7,6,1, 7,1,0, 

     //right 
     3,2,5, 3,5,4, 

     //top 
     4,7,0, 4,0,3, 

     //bottom 
     1,6,5, 1,5,2 

}; 

텍스처 맵핑 데이터 :

final int textureCoordinateData[] = 
     { 
       // Front face 
       0,0, 0,1, 1,1, 1,0, 
       //back 
       0,0, 0,1, 1,1, 1,0, 
       //left 
       0,0, 0,1, 1,1, 1,0, 
       //right 
       0,0, 0,1, 1,1, 1,0, 
       //top 
       0,0, 0,1, 1,1, 1,0, 
       //bottom 
       0,0, 0,1, 1,1, 1,0, 
       //top 
       0,0, 0,1, 1,1, 1,0, 
       //bottom 
       0,0, 0,1, 1,1, 1,0, 


     }; 

질감이 상하 제외 큐브의 모든 측면에 렌더링 . 표면의 픽셀의 첫 번째 행이 (스크린 샷 참조) 전체의 표 리면을 따라 표현된다 : I은 GPU에 정점/색인/텍스쳐 데이터를 저장하는 VBOs 사용하고

enter image description here

텍스쳐 데이터 (큐브 모델 다소 성가신) 인덱스에 의해 계산되지 않고 통과 정점 데이터에 매핑되어야하기 때문에, 그리고

glDrawElements(GL_TRIANGLES, indexLength, GL_UNSIGNED_INT, 0); 

으로 렌더링 그러나이 문제가된다.

내 질문은 : - 가능하면 낮은 꼭지점 데이터를 유지하고 텍스처를 인덱스 데이터에 매핑하는 방법이 있습니까? - 질감 맵핑 문제를 해결하기 위해 36 개의 꼭지점을 만들었지 만 (반복되는 경우도 있지만) 큐브 렌더링에 올바른 인덱스를 만들었지 만 glDrawArrays을 사용하는 것보다 여전히 빠릅니까? 또는 glDrawArrays으로 가서 어쨌든 색인 데이터를 휴지통으로 보내야합니까?

(내 질문에 대답하지 않았다)

관련 질문 :

OpenGL ES - texture map all faces of an 8 vertex cube?

당신은 대답의 첫 번째 코멘트를 읽는다면 : 당신은 당신이 24를 사용할 필요가 무슨 뜻 이죠

을 정점? 을 복제해야한다면 인덱스 버퍼를 사용하는 지점은 무엇입니까? 그렇다면 은 GPU에 반복 데이터를 보내고 있습니까?

답변

1

사실 24 정점 미만의 텍스처 좌표로 큐브를 그리는 방법은 없습니다. 그것은 ... OpenGL에서 정점 속성 (위치, 텍스처 좌표, 법선 등)의 고유 한 조합 인 정점을 정의하는 정의를 사용할 때 24 개의 정점을 가지고 있기 때문입니다.

위치 및 텍스처 좌표만으로 숫자를 약간 줄일 수 있습니다. 케이스의 텍스처 좌표는 0과 1의 값 조합입니다. 각면의 텍스처 방향에 대해 신경 쓰지 않으면 예를 들어 인접한 세면 모두의 텍스처 좌표에 (0, 0)을 사용하는 1 개의 정점을 가질 수 있습니다. 물론 모든 정점에 대해 그렇게 할 수는 없지만 정점의 수를 다소 줄일 수 있습니다.

그래서 가치있는 색인을 사용하고 있습니까?지금까지 이미 알았 듯이 인덱스를 사용할 때 24 개의 꼭지점을 쉽게 사용할 수 있지만 glDrawArrays()을 가장 직접적으로 사용하는 36 개의 꼭지점이 필요합니다. GL_TRIANGLES과 함께 단일 그리기 호출을 기본 유형으로 사용합니다. 따라서 정점 수를 줄입니다.

glDrawArrays()으로 각기 다른 드로 콜을 사용하는 경우이를 24 개의 꼭지점으로 줄일 수 있고 GL_TRIANGLE_STRIP 프리미티브 유형을 사용하여 4 개의 꼭지점이있는면을 그립니다. 이 경우 6 회의 무승부 전화가 발생하며 많은 작은 무승부 전화가 발생하는 것은 바람직하지 않습니다.

큐브의 경우에 의심 스러울지라도 인덱스 버퍼는 일반적으로 매우 유용합니다. 큐브는 마치 작고 단순한 모양이므로 꼭지점을 보내는 방식으로는 어쨌든 큰 차이를 만들 수 없습니다.

대부분의 경우 복잡한 표면을 정의하는 정점이 훨씬 더 많은 복잡한 모양을 사용하게됩니다. 이 경우 동일한 정점 (텍스처 좌표가 동일한)은 대부분 삼각형으로 공유됩니다. 일반 메쉬 스케치 :

_____________ 
| /| /| /| 
|/|/|/| 
|/__|/__|/__| 
| /| /| /| 
|/|/|/| 
|/__|/__|/__| 

내부 정점이 각각 6 개의 삼각형으로 공유되는 것을 볼 수 있습니다. 따라서 상대적으로 크고 매끄러운 표면의 경우 일반적으로 정점 공유를 통해 정점 수를 약 6 배로 줄일 수 있습니다. 이는 인덱스 배열을 사용하면 수행 할 수 있습니다. 지오메트리가 충분히 큰 경우 메모리 사용을 거의 6 배로 줄이는 것이 상당한 이득이 될 수 있습니다.