2017-11-16 10 views
0

내 응용 프로그램에는 나중에 쉐도 잉을 위해 뎁쓰 버퍼 만 쓰는 쉐이더가 있습니다. 또한 깊이가 값을 던져 버릴 수 있으므로 깊이가 모든 후속 드로 콜에 영향을 미치지 않는 전체 화면 쿼드를 렌더링하는 다른 셰이더가 있습니다. 응용 프로그램을 가정현대 하드웨어의 glColorMask()/glDepthMask() 성능 향상?

나는 그림자 맵 쉐이더에 대한 쓰기 컬러 버퍼 (glColorMask(all to GL_FALSE))를 사용하지 않으면 내가 어떤 추가 성능을 얻을 수 및 깊이 버퍼가 전체 화면에 대한 (glDepthMask()에) 작성됩니다, (지금까지 오년 전에 생산) 현대 하드웨어에서 실행 쿼드 쉐이더?

즉, 이러한 함수는 실제로 일부 메모리 연산을 비활성화하거나 렌더링 파이프 라인의이 부분에서 고정 비트 연산 논리에 사용되는 일부 마스크 비트를 변경합니까?

테스트에 관한 동일한 질문입니다. 모든 조각이 깊이 테스트를 통과 할 것이라는 것을 미리 아는 경우 깊이 테스트를 비활성화하면 성능이 향상됩니까?

내 FPS 측정 값은 큰 차이가 없지만 다른 컴퓨터에서 다를 수 있습니다.

마지막으로 깊이/색상 테스트/쓰기가 비활성화되어 렌더링 속도가 빨라지면 얼마나 빨리 실행됩니까? gl 함수 호출 오버 헤드로 인해이 성능 향상이 무효화되지 않습니까?

답변

2

귀하의 질문에 매우 중요한 것이 누락되었습니다 : 당신이해야 할 뭔가.

모든 조각에는 색상과 깊이 값이 있습니다. FS가 값을 생성하지 않더라도 여전히 값이 있습니다. 색상은 glDrawBuffers 통해 컬러 버퍼로 라우팅

  1. : 따라서, 각 단편은 오랫동안 같이 이들 값을 기록한다 폐기되지 제조.
  2. FBO에 적절한 색상/깊이 버퍼가 부착되어 있습니다.
  3. 색상/깊이 쓰기 마스크를 사용하여 마스크를 쓸 수 있습니다.

그래서 렌더링 중이고 그 중 하나를 쓰고 싶지 않거나 깊이 버퍼에 쓰지 않으려면이 중 하나를 수행해야합니다. # 1 또는 # 2 변경은 OpenGL에서 수행 할 수있는 가장 많은 중량 작업 중 하나 인 FBO 상태 변경입니다. 따라서 FBO를 변경하거나 쓰기 마스크를 변경해야합니다. 후자는 항상보다 성능 친화적 인 작업입니다.

어쩌면 귀하의 응용 프로그램은 GPU 나 CPU에 이러한 변경 사항을 충분히 강조하지 않을 수도 있습니다. 그러나 일반적으로 쓰기 마스크를 변경하는 것은 FBO를 사용하는 것보다 좋은 아이디어입니다.

모든 조각이 깊이 테스트를 통과한다는 것을 미리 아는 경우 깊이 테스트를 사용하지 않으면 성능이 향상 될 것입니까?

다른 상태를 동시에 변경하고 있습니까, 아니면 관심있는 유일한 상태입니까?

이러한 선험적 인 성능 질문을 보는 좋은 방법 중 하나는 Vulkan 또는 D3D12를보고 API에서 필요한 것을 확인하는 것입니다. 파이프 라인 상태를 변경하면 큰 문제가 있습니다. 그러나 두 가지 상태를 바꾸는 것은 하나의 것보다 큰 거래가 아닙니다.

따라서 깊이 테스트를 변경하면 다른 상태 (블렌드 모드, 셰이더 등)가 변경되는 것과 관련이 있습니다. 더 이상 손상을주지 않을 것입니다.

동시에 이 문제가 될 정도로 성능이 중요하면 응용 프로그램 테스트를 수행해야합니다. 그리고 이것을 구현 한 후에 모든 관심있는 하드웨어에서이를 수행해야합니다. 그리고 코드는 필요에 따라 하나에서 다른 것으로 쉽게 전환 할 수있을만큼 유연해야합니다.

+0

FBO 상태 변경이 "OpenGL에서 가장 많은 작업 중 무엇입니까"에 대해 자세히 설명해 줄 수 있습니까? – lisyarus

+0

@lisyarus : "왜"는 본질적으로 부적합합니다. [OpenGL 성능 개발에 대해 잘 알고있는 사실] (https://www.youtube.com/watch?v=-bCeNzgiJ8I)입니다. 성능 특성을 변경하기 위해 할 수있는 일은 없습니다. 알고리즘이 허용하는 최선의 방법으로 FBO 변경을 피할 수 있습니다. –