디퍼 드 셰이딩 렌더러에서 지오메트리 패스에 대한 일반적인 렌더링 최적화 기술은 무엇입니까? [닫은]


16

OpenGL 3 및 C ++ (창 관리 용 glfw)을 사용하여 게임 엔진을 개발하고 있습니다. 나는 지금까지 발전했으며, 건전한 엔티티와 최적화를 제외한 대부분의 작업을 수행했습니다. 엔진은 지연 셰이딩을 사용하므로 지연 셰이딩 자체는 평균 GPU의 피곤한 프로세스이므로 가능한 한 렌더링 프로세스를 최적화하고 싶습니다.

현재 시스템은 렌더러와 현재 월드를 포함하는 장면으로 구성되며 월드는 엔티티와 조명 엔티티를 별도로 보유합니다 std::vectors.

따라서 기본적으로 Scene이 호출 될 때마다 ->render()Renderer를 호출하고 매개 변수로 월드를 전달하고 월드에서 엔티티 반복자를 가져 와서 FBO에 그린 다음 두 번째 패스를 위해 조명 엔티티를 통과합니다. 그리고 나는 이것으로 충분하지 않다고 생각합니다.

내 현재 알고리즘은 엔티티가 화면 공간에 없어도 모든 것을 반복합니다. 현재 렌더링 알고리즘을 최적화하여 보이는 객체에 대해서만 API 함수를 호출하는 방법을 생각하고 있습니다. 그래서 그러한 렌더러를 최적화하는 일반적인 기술은 무엇입니까?

답변:


41

디퍼 드 셰이딩은 나중 단계에 대한 실제 셰이딩 작업을 "지연"하는 기술 일뿐입니다. 10 개의 패스가 필요한 10 개의 조명을 렌더링하는 데 필요한 패스 수를 줄이는 것이 좋습니다 (예 :). 요점은 사용중인 렌더링 기술에 관계없이 렌더링 파이프 라인에서 처리 해야하는 객체 (정점, 법선 등)의 수를 줄이는 렌더링 최적화가 있습니다.

렌더링 최적화에 대한 사실상의 표준은 없지만, 특정 성능 특성을 달성하기 위해 상호 교환 가능하거나 함께 사용될 수있는 많은 기술이 있습니다. 각 기법을 사용하는 것은 렌더링되는 장면의 특성에 크게 좌우됩니다.

디퍼 드 렌더링은 조명 수가 증가 할 때 문제를 해결하려고합니다. 앞으로 렌더링에서는 패스 수가 폭발 할 수 있습니다.

이러한 기술은 지연 음영 부분을 직접 최적화하지는 않지만 설명에 따르면 지연 음영 부분은 문제가 아닙니다. 그러나 문제는 전체 장면을 렌더링 파이프 라인에 제출한다는 것입니다. 따라서 엔진은 결과를 g- 버퍼에 제출할 수 있도록 장면에서 처리해야합니다 (예 : 모든 1 억 개의 정점). 이러한 1 억 개의 정점은 대부분 사소하게 제거 될 수 있으며 전처리 정점 및 조각이 전달됩니다.

순방향 렌더러 N 정점의 경우 총으로 정점 스테이지에 의해 처리 될 vertex count*lights count과의 총량 프래그먼트 스테이지에 의해 fragments count*number Lights효과적으로 만이 감소 음영 지연, vertex count정점 스테이지와 fragments count해결 전에 프래그먼트 카운트 실제 음영. 그러나 여전히 N은 처리하기에 너무 많을 수 있습니다. 특히 대부분이 사소하게 추려 질 수 있습니다.

이는 포워드 렌더링 / 여러 패스의 경우 컬링을보다 효과적으로 만듭니다. 혼자 음영 지연된 것은 할 수 있기 때문에 그러나, 대부분의 엔진은 듀얼 렌더링 방법을 사용하는 것을 염두에 두어야 하지 투명 물체를 해결하는 최적화에게 필수을 사용하여이 만든다, 나는 그들 모두를하지 않는 상용 엔진 모르겠어요.

절두체 컬링

뷰 절두체에 완전히 또는 부분적으로 포함 된 객체 만 렌더링 파이프 라인에 제출하면됩니다. 이것은 프러스 텀 컬링의 기본 개념으로, 안타깝게도 메시가 뷰에 있는지 여부를 확인하는 것입니다. 프러스 텀은 값 비싼 작업 일 수 있습니다. 대신 엔진 설계자는 (AABB) 축 정렬 경계 상자 또는 경계 영역과 같은 대략적인 경계 볼륨을 사용합니다. 실제 메쉬를 사용하는 것만 큼 정확하지는 않지만 정확도 차이는 실제 메쉬를 확인하는 데 어려움이 없습니다.

여기에 이미지 설명을 입력하십시오

바운딩 볼륨을 사용하더라도 실제로 각 볼륨을 확인할 필요는 없으며, 이를 통해 초기 컬링을 수행하기 위해 바운딩 볼륨 계층 을 구성 할 수 있습니다. 이를 사용하면 장면의 복잡성에 크게 의존합니다.

이것은 작은 엔진을위한 좋고 간단한 기술이며, 내가 사용한 모든 엔진에 거의 사용됩니다. 엔진에 매우 복잡한 장면을 렌더링 할 필요가 없으면 계층 구조없이 "일반"경계 볼륨 / 절두체 검사를 사용하는 것이 좋습니다.

경계 볼륨 계층

뒷면 컬링

어쨌든 보이지 않는면을 그리는 이유는 무엇입니까? 렌더링 API는 뒷면 컬링을 켜거나 끄는 인터페이스를 제공합니다. 특정 상황에서 뒷면을 그려야하는 일부 CAD 응용 프로그램과 같이 전원을 켜지 않는 강력한 이유가 없다면 반드시해야 할 일입니다.

폐색 컬링

Z- 버퍼를 사용하면 가시성 결정을 해결할 수 있습니다. 그러나 문제는 Z- 버퍼가 성능 측면에서 항상 크지는 않다는 것입니다 .Z- 버퍼는 파이프 라인의 후반 단계에서만 해결할 수 있기 때문에 폐색되는 객체는 래스터 화되고 Z- 버퍼에 쓰여질 수 있습니다. Z 테스트에 실패하기 전의 컬러 버퍼.

오 클루 전 컬링은 렌더링 절두체에있는 폐쇄 된 오브젝트를 컬링하기 위해 초기 테스트를 수행하여이를 해결합니다. 오 클루 전 컬링의 실제 구현 중 하나는 포인트 기반 쿼리를 사용하고 특정 포인트 뷰에서 특정 객체가 표시되는지 확인하는 것입니다. 최종 이미지에 기여하지 않는 조명을 컬링하는 데 사용될 수도 있습니다. 이는 지연된 엔진 렌더러에서 특히 유용합니다.

여기에 이미지 설명을 입력하십시오

그러한 기술의 위대한 실제 예는 GTA5에 있습니다. 고층 빌딩은 도시 중심에 계단식으로 배치되어 장식 일뿐 만 아니라 폐색 장치로도 작동하여 도시의 나머지 부분을 효과적으로 차단하고 래스터 화.

LOD

디테일의 정도

세부 수준은 널리 사용되는 기술이며, 메시가 장면에 덜 기여할 때 더 간단한 버전의 메시를 사용하는 것이 좋습니다. 두 가지 일반적인 구현이 있습니다. 하나는 더 이상 크게 기여하지 않을 때 더 간단한 것으로 메쉬를 전환합니다. 메쉬는 메쉬가 차지하고있는 거리 및 픽셀 수 (스 크리 영역)와 같은 요소에 따라 선택됩니다. 다른 버전은 메시를 동적으로 테셀 레이트하며, 이는 지형 렌더링에 널리 사용됩니다.

여기에 이미지 설명을 입력하십시오

이 모든 것이 작동하지 않으면 어떻게됩니까?

좋은 질문입니다.

가장 먼저해야 할 일은 그래픽 프로파일 러를 사용하여 응용 프로그램을 프로파일 링하고 병목 현상의 위치를 ​​확인하는 것입니다. 렌더링되는 내용이 변경되면 병목 현상이 변경 될 수 있습니다. 병목 현상은 CPU에서 실행되는 코드의 일부일 수도 있으므로이를 측정해야합니다.

그런 다음 병목 현상에 대한 최적화를 수행해야하며 이에 대한 정답이 없으며 하드웨어마다 다를 수 있습니다.

몇 가지 일반적인 GPU 최적화 트릭 :

  • 쉐이더에서 분기하지 마십시오.
  • 예를 들어 {VNT}동일한 배열 또는 {V},{N},{T}다른 배열에 인터리브 된 다른 정점 구조를 사용해보십시오 .
  • 장면을 앞뒤로 그립니다.
  • 예를 들어 이미지에 Z 테스트가 필요하지 않은 경우 Z 버퍼를 끄십시오.
  • 압축 된 텍스처를 사용하십시오.

몇 가지 일반적인 CPU 최적화 트릭 :

  • 작은 기능에는 인라인 기능을 사용하십시오.
  • 가능하면 SIMD (단일 명령 다중 데이터)를 사용하십시오.
  • 캐시에 친숙하지 않은 메모리 점프를 피하십시오.
  • "올바른"양의 데이터가있는 VBO를 사용하십시오. (하드웨어에 따라 다름) 드로우 콜이 적을수록 좋습니다.

그러나 병목 현상이 지연된 쉐이딩에 있다면 어떻게해야합니까?

이 경우 디퍼 드 셰이딩이 라이트에 더 관심이 있기 때문에 가장 분명한 부분은 실제 셰이딩 계산을 최적화하는 것입니다. 계속 지켜봐야 할 몇 가지 사항 :

  • 실제로 최종 이미지에 영향을주는 조명을 렌더링합니다. 다시 말해, 기여하지 않는 조명을 끄십시오. 앞에서 언급 한 오 클루 전 컬링을 사용하여 효과적으로 구현할 수 있습니다.
  • 이 라이트에는 반사 또는 다른 구성 요소가 필요합니까? 아마.
  • 이 빛이 그림자를 드리 우나요? 일부 조명은 그림자를 드리울 필요가 없습니다.
  • 이 가벼운 기여를 미리 계산할 수 있습니까? 움직이지 않으면 아마도 일부 측면이 사전 계산 될 수 있습니다.

죄송합니다. 디퍼 드 셰이딩과는 아무런 관련이 없습니다. 실제로 기술이 효과적으로 완화시키는 정확한 성능 문제이므로, 가장 유용한 최적화 방법은 조명 비용이 아닌 경우 조명 패스에 초점을 두어야합니다. 지배적 인 시간 테이커, 지연된 쉐이딩은 아마도 잘못된 선택 일 것입니다.
MickLH

@MickLH 불행하게도, 당신은 그 질문을 읽지 않았을 것입니다. 그의 문제는 그가 매번 전체 장면을 반복한다는 것입니다. 그리고 그는 음영 처리에 관한 병목 현상을 언급하지 않았습니다. 처음에는 디퍼 드 쉐이딩이 많은 조명 / 재료가있을 때 패스 폭발 문제를 해결한다고 언급했습니다. 그러나 나는 이것이 셰이딩 기술에 관계없이 모든 엔진에 대한 필수 최적화라고 덧붙였습니다. 이것이 기술이 완화하는 정확한 문제라는 점에 대해서는 강력하게 동의하지 않기 때문에 여기서 모든 요점을 해결할 수는 없습니다 (개념)
concept3d

예를 들어 절두체 컬링없이 지연된 엔진을 구축하는 것은 정말 어리석은 일이므로 엔진은 결과를 g- 버퍼에 제출할 수 있도록 예를 들어 (1 억 버텍스) 처리합니다. 다른 음영 처리는 다른 문제를 해결하지만, 그의 문제는 아니었고, 그의 문제는 모든 지오메트리를 파이프 라인에 제출하는 것이 었습니다.
concept3d

조명 계산에서 일부 최적화가 발생해야한다는 부분에 동의하지만 조명 계산이 지배적이지 않은 경우 지연되는 것이 잘못된 방법입니다. 그러나 다시 그의 문제는 아니었다.
concept3d

성능 최적화 문제가 지연된 음영 처리와 관련이 없음 을 보여주지 않았기 때문에 이러한 최적화가 지연된 렌더러에 실제로 가장 효과적이지 않다는 것을 확인하면 다운 보트를 취소합니다 .
MickLH

6

문제는 디퍼 드 셰이딩과 관련이 없으므로 특정 부분의 속도를 높이기 전에 렌더러의 기본 핵심 요소를 구현해야합니다.

concept3d의 설명을 마치고 실제로 전체 래스터 화 패스와 달리 지연된 셰이더 자체 를 최적화해야하는 경우 타일 ​​기반 지연 음영을 구현할 수 있습니다.

당신이 동적 조명의 수에 의해 제한되지 않는 경우에 당신은 당신이 전혀 연기 음영을 사용하는 이유를 고려해야한다, 그러나 당신이 경우에 있습니다 당신은 전장 3 가능하게하는 최적화를 시도 할 것입니다. (공개 PDF의 슬라이드 10에 힌트가 있습니다 : http://dice.se/wp-content/uploads/GDC11_DX11inBF3_Public.pdf )

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