지연 렌더링 엔진의 장면 그래프


10

학습 연습으로 지연 렌더링 엔진을 작성했습니다. 이제이 엔진에 장면 그래프를 추가하고 싶지만이 작업을 수행하는 방법이 약간 당황 스럽습니다.

일반적인 (포워드 렌더링 엔진)에서는 장면 그래프 너비를 먼저 이동하고 어디서나 Draw ()를 호출하는 것보다 모든 항목 (모든 구현 IDrawable 및 IUpdateAble)을 장면 그래프에 추가합니다.

그러나 지연 렌더링 엔진에서는 그리기 호출을 분리해야합니다. 먼저 지오메트리, 그림자 캐스터, 라이트 (모두 다른 렌더 타겟)를 그려야합니다. 따라서이 경우에는 씬 그래프 위를지나 가기 만하면됩니다. 내가 보는 방식으로 전체 장면 그래프를 3 번 ​​이동하여 그려야하는 객체의 종류를 확인하거나 어떻게 든 서로 연결된 3 개의 별도 장면 그래프를 만들어야합니다. 이 두 가지 모두 나쁜 해결책 인 것처럼 보입니다. 씬 객체를보다 투명하게 처리하고 싶습니다.

내가 생각한 다른 솔루션은 장면 그래프를 정상적으로 여행하고 3 개의 별도 목록에 항목을 추가하고 기하학, 그림자 캐스터 및 조명을 분리 한 다음이 목록을 반복하여 올바른 물건을 그리는 것이 더 낫습니다. 매 프레임마다 3 개의 목록을 다시 채우는 것이 현명한가?

답변:


6

C ++ 프로젝트에서 사용한 접근법은 장면 그래프 (공간 인덱스가 있음)가 현재 시청 절두체에 따라 적중의 '표시 가능한'std :: vector를 채우는 것입니다. 이 보이는 목록은 장면 그래프에 의해 관리되므로 카메라가 움직일 때만 다시 계산됩니다. 그래프에서 움직이는 객체가이 목록에서 이동하고 필요에 따라 정렬되어 다시 병합 된 묘비 및 정렬되지 않은 변경 목록을 사용합니다.

보이는 항목의 목록은 먼저 셰이더 ID별로 정렬되고 각 유형 내에서 카메라와의 거리에 따라 정렬됩니다. 셰이더 ID는 지형이 먼저 정렬 된 다음 건물, 단위, 발사체 및 파티클 등 RTS가되도록 할당됩니다. 일부 모델에는 셰이더가 두 개 이상 있지만 기본 셰이더 만 광고합니다. 그리기 요청이있을 때 다른 셰이더로 그린 비트가 필요한 것 역시 다음 패스 단일 링크 목록에 추가됩니다.

따라서 그림은 한 번에 가시적 배열을 통과하고, 한 번에 다시 방문 할 해당 항목의 링크 된 목록이 만들어지고 두 번째 패스 등이 그려집니다.

앞뒤로 불투명 한 다음 투명하게 그리면 모든 것을 깔끔하게 유지할 수 있습니다.

이것은 아마도 셰이더 변경 횟수를 최소화하지는 않지만 구현하는 것은 상당히 간단하고 간단합니다.

나는 XNA와 이것이 어떻게 적용되는지 그리고 당신이 생성하는이 저수준 물건의 양에 대해 전혀 모른다. 그러나 재향 군인이 C ++ RTS에 대한이 접근 방식에 대해 어떻게 생각하는지 아는 것이 가장 흥미로울 것입니다.


윌,이 답변이 정말 마음에 들어요. 특히 지금까지 생각한 것과 완전히 다르기 때문입니다. 특히 반투명 객체를 생각할 때 귀하의 방법은 매우 제정신입니다. 방문 할 오브젝트에 대한 장면 그래프에서 (링크 된) 목록을 작성하는 것은 매우 좋은 생각입니다. 그리고 XNA에서 우리는이 저수준의 모든 것들도해야합니다 :).
Roy T.

3

내 제안은 당신이 묘사 한 것과 비슷한 특정 요구 사항에 맞춘 2 단계 접근법입니다. 그림자, 지오메트리, 라이트의 경우 각 렌더링 단계마다 장면 그래프와 "렌더링 컬렉션"이 필요합니다 (네 번째 투명 오브젝트 일 수 있습니다).

장면 그래프는 모든 유형의 관계를 기반으로 할 수 있지만 개인적 선호는 빠른 컬링을 위해 각 노드에 다른 노드가 포함될 수있는 공간 관계를 기반으로합니다.

렌더 컬렉션은 특정 단계에 맞게 조정 된 모든 유형의 데이터 구조 일 수 있습니다. 예를 들어, 섀도우 컬렉션은 z 초기 거부를 최대화하기 위해 깊이별로 정렬 된 목록 또는 트리 일 수 있습니다. 셰이더 (상태) 변경을 최소화하기 위해 셰이더 사용별로 지오메트리 컬렉션을 정렬 할 수 있습니다. 조명 컬렉션은 조명 거리, 크기 또는 이들의 조합으로 정렬 된 목록 또는 트리 일 수 있으므로 성능 문제가있는 경우 가장 효과적인 조명으로 만 조명 렌더링을 제한 할 수 있습니다.

어떤 데이터 구조를 선택하든 삽입 작업이 빠르며 풀링 및 기타 기술을 사용하여 각 프레임마다 이러한 목록을 지우고 채울 것이기 때문에 데이터 할당 / 파괴를 제거해야합니다.

이제는 모두 함께 묶는 것이 쉽습니다. 장면 그래프를 살펴보고 각 항목을 관련 렌더 컬렉션에 추가하십시오. 데이터 구조가 요구 사항에 따라 자동으로 새 항목을 정렬 / 구조화하는 데 도움이됩니다. 완료되면 필요한 순서로 렌더 컬렉션을 살펴보고 렌더링합니다.

데이터 구조에 빠른 삽입이 있고 가비지를 생성하지 않기 때문에 언급 한대로 목록을 다시 채우는 데 대한 페널티가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.