2010-01-09 2 views
0

Ok ... 6 개의 다른 법선을 가지고 있지만 실제로는 48면 (한면에 8 개의면)에 가까운 비교적 간단한 솔리드가 있다고 가정하면 얼굴 사이에 공유 꼭지점이 많이 있습니다. OpenGL에서 렌더링하는 가장 효율적인 방법은 무엇입니까?Normals 렌더링을 사용하는 OpenGL ES 다각형

배열의 정점을 배치 한 다음 인덱스 배열을 사용하여 렌더링 할 수 있다는 것을 알고 있지만 법선을 변경하기 위해 렌더링 단계를 중단해야합니다 (예 : 보통 1 ... 8면 렌더링). .. normal normal 2 ... render 8 faces, etc.) 그 때문에 나는 인덱스 배열 배열을 유지해야한다. 안좋다!

내가 할 수있는 다른 방법은 별도의 정상 및 정점 배열 (또는 심지어 interleave)을 사용하는 것입니다. 그러나 이것은 법선과 정점의 일대일 비율이 필요하다는 것을 의미합니다. 즉 법선이 될 것입니다. 그들이 필요로하는 것보다 8 배 더 중복! 구형 또는 곡면을 가진 무언가에, 각 정상은 확률이 높습니다, 그러나 이것을 위해, 실제로 기억의 낭비 같이 보인다.

완벽한 세계에서 정점을 갖고 싶습니다. 그리고 정상적인 배열의 길이가 다른데, 삼각형이나 쿼드를 그릴 때 그 정점에 대한 각 배열의 인덱스를 지정해야합니다.

이제 OBJ 파일 형식을 사용하면 ... 정점 배열과 길이가 다른 일반 배열을 지정할 수 있습니다. 그러면 렌더링 할면을 지정할 때 꼭지점과 일반 인덱스를 지정할 수 있습니다. 텍스처를 사용하는 경우 UV coord) 완벽한 솔루션처럼 보입니다! 48 개의 정점들만 있지만 8 개의 법선들만 있으면, 모양의면들을 정의하는 인덱스의 쌍. 하지만 OpenGL ES에서 렌더링하는 방법을 잘 모르겠습니다. (다시 'ES'에 주목하십시오.) 현재 저는 법선을 1 대 1로 역 정규화해야합니다 (SQL은 유감스럽게 생각합니다). 정점 배열, 렌더링. 그냥 나에게 메모리 낭비.

누구에게 도움이됩니까? 나는 여기서 아주 간단한 것을 놓치기를 바란다.

마크

답변

1

아무 것도 없습니다. 이것은 대부분의 하드웨어가 작동하는 방식이기 때문에 사양이 작동하는 방식입니다 (일명 완벽한 하드웨어가 완벽한 것은 아닙니다).

색인 배열을 지원하는 하드웨어를 구현하는 복잡성에 대해서는 다루지 않지만 잃을 가능성이있는 최적화를 지적 하겠습니다. GL은 단일 색인을 잠재적으로 게시물의 색인으로 사용합니다 -vertex 변환 캐시를 사용하여 다음 반복에서 정점을 다시 변환 할 필요가 없습니다. 최적화를 인덱스 세트를 사용하여 훨씬 더 복잡하게 만듭니다.

메모리 절약에 대해 : 귀하의 경우, 4 개의 쿼드, 8 개의 삼각형을 사용하는 대략 각 큐브에 대해 이야기하고있는 것입니다. 그래서 우리는 9 * 6 = 54 개의 고유 한 꼭지점을 말합니다. 위치 및 법선 만있는 경우 54 * 4 * 3 * 2 = 1296 B 정점 데이터 + 2 * 48 * 3 = 288 B의 인덱스 데이터 (속성 기본 유형은 4 바이트, 인덱스는 GLushort로 가정)입니다. 총 1584B. 그것은 위치와 법선에 대해서도 최적이 아닌 데이터 형식을 가정합니다. 대안은 약 26 * 4 * 3 (pos) + 8 * 4 * 3 (norm) + 2 * 48 * 3 * 2 = 312 + 96 + 576 = 984B입니다. 따라서이 고안된 사례에 약 0.5kB를 절약했습니다. 이 속성을 더 많은 메모리 절약 유형에 전달하면 다음과 같이됩니다. 648 + 288 = 936 vs 156 + 48 + 576 = 780 ... 차이가 무시되기 시작합니다.

왜 내가이 문제를 제기할까요? 메모리 소비 최적화를 원하면 속성 데이터 유형을 살펴야하기 때문입니다.

마지막으로, 실용적인 3D 세계 (즉, 상자가 아닌)에서 자신을 알아 차렸을 때 이러한 메커니즘의 절약은 낮을 수 있습니다. 아주 적은 속성 만 공유 할 수 있습니다.

+0

좋아, 모델을 더 간단하게하십시오. 테이프 롤처럼 펼쳐지는 사각형의 스트립이 있습니다. 두 번째 테이프를 두 번째 테이프처럼 모서리 아래쪽에 추가하면 모든 꼭지점이 '접기'아래로 공유됩니다. 그러나 법선 때문에 꼭지점을 공유 할 수 없으므로 이제 버텍스 데이터의 메모리가 33 % 증가합니다. (즉, b와 c가 똑같은 버텍스이고 다른 법선 일지라도 ab를 누른 다음 cd를가집니다. 기술적으로 단일 스트립의 쿼드를 사용하더라도 얼굴을 원하지 않으면 똑같은 문제가 발생합니다. 부드럽지만 오히려 편평합니다. (꼭지점을 부드럽게하면 부드럽게됩니다.) – MarqueIV

+0

또한 꼭지점이 3D 공간의 같은 위치에 있기 때문에 꼭지점 변환을 잃지 않습니다. 내가 명령을 그들에게 영향을주지 않는 그들을 그리기로 선택하고 그게 정확히 DrawElements 명령을 무엇입니까? .. 비아 색인? 결국 내가 참조하는 10 가지 작업에서 사용하는 하나의 색인을 가지고 인덱스를 사용하면 위의 명령문과 정확히 반대되는 점인 10에 반대되는 해당 정점에 대한 계산/최적화가 하나만 있지 않습니까? – MarqueIV

+0

지형과 비슷하게 들릴 수 있습니다. 대부분의 경우 법선을 공유해야합니다 지형 테이프 롤에. "평면"을 원한다면 오히려 예외는 내 메시지에서 말한 것입니다. post-vertex transform에 관해서 : 정점 위치 출력이 normal에 의존한다면? 꼭 꼭지점 입력 위치만을 기반으로 계산 된 것은 아닙니다. 그리고 나는 현재 내가 사용하고있는 최적화를 설명하는 것일뿐입니다 (크기는 대개 작습니다. 특히 지형 스트립이 길면 항상 그다지 치지는 않습니다). – Bahbar