여러 인덱스로 메시 렌더링
정점 데이터가 있습니다. 위치, 법선, 텍스처 좌표. .obj 파일이나 다른 형식에서로드했을 것입니다. 아마도 나는 큐브를 그리고있을 것입니다. 그러나 각 정점 데이터에는 자체 인덱스가 있습니다. OpenGL / Direct3D를 사용하여이 메시 데이터를 렌더링 할 수 있습니까?
가장 일반적인 의미에서는 아닙니다. OpenGL 및 Direct3D는 꼭지점 당 하나의 인덱스 만 허용합니다. 인덱스는 정점 데이터의 각 스트림에서 가져옵니다. 따라서 모든 고유 한 구성 요소 조합에는 고유 한 인덱스가 있어야합니다.
따라서 각면에 고유 한 법선이있는 큐브가있는 경우 위치와 법선 데이터를 많이 복제해야합니다. 큐브에는 8 개의 고유 한 위치와 6 개의 고유 한 법선 만 있더라도 24 개의 위치와 24 개의 법선이 필요합니다 .
가장 좋은 방법은 데이터가 더 커질 것이라는 사실을 받아들이는 것입니다. 많은 모델 형식이 여러 인덱스를 사용합니다. 이 버텍스 데이터를 사용하여 렌더링하기 전에 수정해야합니다. Open Asset Importer와 같은 많은 메시 로딩 도구가이 수정을 수행합니다.
GL 3.x 및 D3D10
D3D10 / OpenGL 3.x 급 하드웨어의 경우 수정 수행을 피하고 여러 색인화 된 속성을 직접 사용할 수 있습니다. 그러나 이렇게하면 렌더링 성능이 저하 될 수 있습니다.
다음 설명에서는 OpenGL 용어를 사용하지만 Direct3D v10 이상에는 동일한 기능이 있습니다.
아이디어는 정점 셰이더에서 다른 정점 속성에 수동으로 액세스하는 것입니다. 정점 속성을 직접 보내는 대신 전달되는 속성은 실제로 해당 특정 정점에 대한 인덱스입니다. 그런 다음 버텍스 셰이더는 인덱스를 사용하여 하나 이상의 버퍼 텍스처를 통해 실제 속성에 액세스합니다 .
속성은 여러 버퍼 텍스처에 저장되거나 모두 하나에 저장 될 수 있습니다. 후자가 사용되는 경우 셰이더는 버퍼에서 해당 속성의 시작 인덱스를 찾기 위해 각 인덱스에 추가 할 오프셋이 필요합니다.
일반 정점 속성은 여러 방법으로 압축 할 수 있습니다. 버퍼 텍스처는 압축 수단이 적어 상대적으로 제한된 수의 정점 형식 만 허용합니다 (지원하는 이미지 형식을 통해).
이러한 기술은 전체 정점 처리 성능을 저하시킬 수 있습니다. 따라서 압축 또는 최적화를위한 다른 모든 옵션을 모두 사용한 후 메모리가 가장 제한적인 상황에서만 사용해야합니다.
OpenGL ES 3.0은 버퍼 텍스처도 제공합니다. 더 높은 OpenGL 버전 은 더 나은 성능 특성을 가질 수있는 버퍼 텍스처가 아닌 SSBO 를 통해 버퍼 객체를 더 직접 읽을 수 있도록합니다 .
나는 다른 답변의 일부 진술과 약간 반대되는 이러한 종류의 반복을 줄일 수있는 방법을 찾았습니다 (그러나 여기에서 묻는 질문에 특별히 맞지 않습니다). 그러나 이것은 이 질문의 반복으로 생각되는 내 질문 을 해결합니다.
보간 한정자 에 대해 방금 배웠습니다 . 특히 "플랫". 정점 셰이더 출력에 플랫 한정자를 넣으면 도발하는 정점 만 해당 값을 조각 셰이더에 전달한다는 것이 제 이해입니다 .
이는이 인용문에 설명 된 상황을 의미합니다.
따라서 각면에 고유 한 법선이있는 큐브가있는 경우 위치와 법선 데이터를 많이 복제해야합니다. 큐브에는 8 개의 고유 한 위치와 6 개의 고유 한 법선 만 있더라도 24 개의 위치와 24 개의 법선이 필요합니다.
8 개의 정점을 가질 수 있습니다. 그 중 6 개는 고유 한 법선을 포함하고 2 개의 법선 값은 무시됩니다. "도발하는 정점"에 전체면에 적용 할 법선 데이터가 포함되도록 기본 색인을 신중하게 정렬하는 한, 그 중 6 개는 고유 한 법선을 포함하고 2 개의 법선 값은 무시됩니다.
편집 : 작동 방식에 대한 나의 이해 :
참조 URL : https://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices
'programing' 카테고리의 다른 글
boost :: scoped_ptr의 차이점 (0) | 2021.01.15 |
---|---|
ActiveSupport :: Memoizable은 어떤 Ruby memoize 패턴을 참조합니까? (0) | 2021.01.15 |
박쥐 파일의 이스케이프 퍼센트 (0) | 2021.01.15 |
세트 멤버의 TTL (0) | 2021.01.15 |
WebAPI와 WebAPI 2의 차이점은 무엇입니까? (0) | 2021.01.15 |