지연된 렌더러를 만들고 있는데 씬에서 많은 양의 조명을 지원하기 위해 바둑판 식 지연 쉐이딩을 보았습니다.계산 쉐이더가없는 바둑판 식 지연 쉐이딩
OpenGL 3.3 하드웨어를 대상으로해야하며 GLSL 컴퓨팅 쉐이더를 지원하지 않는 것이 문제입니다.
일반 쉐이더로 타일 된 지연 쉐이딩을 구현할 수 있습니까?
지연된 렌더러를 만들고 있는데 씬에서 많은 양의 조명을 지원하기 위해 바둑판 식 지연 쉐이딩을 보았습니다.계산 쉐이더가없는 바둑판 식 지연 쉐이딩
OpenGL 3.3 하드웨어를 대상으로해야하며 GLSL 컴퓨팅 쉐이더를 지원하지 않는 것이 문제입니다.
일반 쉐이더로 타일 된 지연 쉐이딩을 구현할 수 있습니까?
바둑판 식 지연 렌더링은 엄격하게 이 아니며 컴퓨팅 쉐이더이 필요합니다. 그것이 필요한 것은 각 타일에 대해 일련의 조명이 처리된다는 것입니다. 계산 쉐이더는이를 수행하는 한 가지 방법 일뿐입니다.
대안은 CPU의 각 절두체에 대한 조명 목록을 작성한 다음 해당 데이터를 최종 사용을 위해 GPU에 업로드하는 것입니다. 분명히 CS 버전보다 훨씬 더 많은 메모리 작업이 필요합니다. 하지만 은 비싸기 때문에 이 아니므로 타일 크기로 쉽게 재생할 수 있습니다. 타일이 많을수록 CPU 작업이 많아지고 업로드 할 데이터는 많아 지지만 타일 당 조명 (일반적으로 말하면)이 적어지고 처리가 더 효율적으로 처리됩니다.
GL 3.3 클래스 하드웨어의 경우 한 가지 방법은 각 타일을 별도의 쿼드로 만드는 것입니다. 쿼드는 정점 별 매개 변수의 일부로 전체 조명 목록의 일부분에 대한 시작 인덱스와 처리 할 전체 조명 수를 제공합니다. 거기에는 전역 적으로 액세스 가능한 배열이 있으며, 각 타일에는 처리 할 배열의 연속 영역이 있습니다.
이 배열은 실제 조명 자체 일 수도 있고 두 번째 (훨씬 더 작은) 조명 배열의 인덱스 일 수도 있습니다. 액세스에서 추가적인 간접 참조가 필요한지 여부를 알기 위해 차이를 측정해야합니다.
조명 및 타일 수에 따라 상당히 커질 수 있으므로 기본 배열은 아마도 buffer texture이어야합니다. 간접 루트를 사용하면 실제 라이트 데이터의 배열이 균일 한 블록에 맞을 가능성이 큽니다. 그러나 두 경우 모두 업로드 할 때 버퍼 스트리밍 기술을 사용해야 할 것입니다.
나는 그렇게 생각하지 않는다. 지연 렌더링을 수행하려면 동일한 작업 그룹 (예 : 일반적인 가시 광선 목록을 저장해야 함)의 쉐이더 호출간에 통신해야하며, 계산 쉐이더 없이는 불가능합니다. – BDL
음 ... 괜찮습니다. 그때 어떤 제안? 내가 생각하고 있던 또 다른 접근법은 가벼운 양이지만, 많은 조명과 함께 잘 확장되지 않는다고 생각합니다. – zeb