> 백엔드 개발 > C++ > OpenGL 인덱스 버퍼에서 일치하지 않는 정점 및 일반 인덱스를 처리하는 방법은 무엇입니까?

OpenGL 인덱스 버퍼에서 일치하지 않는 정점 및 일반 인덱스를 처리하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-24 05:11:12
원래의
232명이 탐색했습니다.

How to Handle Mismatched Vertex and Normal Indices in OpenGL Index Buffers?

OpenGL 인덱스 버퍼: 서로 다른 인덱스 처리

3ds Max와 같은 타사 소프트웨어에서 사용자 정의 메시 데이터를 가져올 때 정점 및 일반 인덱스. OpenGL은 정점과 법선 모두에 대해 단일 인덱스 버퍼를 사용하기 때문에 이는 문제가 됩니다.

해결책 1: 정점과 법선 데이터 결합

한 가지 접근 방식은 정점 데이터와 일반 데이터를 모두 포함하는 결합 정점 버퍼입니다. 이를 위해서는 고유한(정점 인덱스, 법선 인덱스) 쌍을 식별하고 각 쌍에 대해 새 정점을 생성해야 합니다.

STL 맵을 사용하여 각(정점 인덱스, 법선 인덱스) 쌍에 대한 키를 생성합니다. 삼각형을 반복하고 각 모서리에서 (정점 인덱스, 법선 인덱스) 쌍을 검색하고 지도에 기존 항목이 있는지 확인합니다. 그렇지 않은 경우 CombinedVertices 배열의 해당 꼭지점과 법선 좌표를 사용하여 새 꼭지점을 만들고 지도를 업데이트하세요. 마지막으로, CombinedIndices 배열에 각 정점에 대한 결합 인덱스를 추가하세요.

샘플 의사 코드:

nextCombinedIdx = 0
indexMap = empty
for triangle in input file:
    for corner in triangle:
        vertexIdx = ...
        normalIdx = ...
        if key(vertexIdx, normalIdx) in indexMap:
            combinedIdx = indexMap[key(vertexIdx, normalIdx)]
        else:
            combinedIdx = nextCombinedIdx
            indexMap[key(vertexIdx, normalIdx)] = combinedIdx
            nextCombinedIdx = nextCombinedIdx + 1
            combinedVertices[combinedIdx] = inVertices[vertexIdx], inNormals[normalIdx]
        combinedIndices[combinedIdx] = combinedIdx
로그인 후 복사

해결책 2: 데이터 정렬

또는 정점/법선 데이터를 다음과 같이 정렬할 수도 있습니다. glDrawArrays와 호환되게 만드세요. 그러나 중복된 정점이 있는 경우 문제가 될 수 있습니다.

원래 정점 인덱스에서 새로 정렬된 인덱스로의 매핑을 생성해야 합니다. 중복된 정점을 발견하면 이전에 본 정점의 인덱스를 할당합니다. 그러나 이 접근 방식에는 광범위한 데이터 처리 및 재구성이 필요할 수 있습니다.

위 내용은 OpenGL 인덱스 버퍼에서 일치하지 않는 정점 및 일반 인덱스를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿