버텍스 및 프래그먼트 셰이더의 속도를 개별적으로 프로파일 링하려면 어떻게해야합니까?


11

내 버텍스 또는 프래그먼트 셰이더가 렌더링 파이프 라인에 병목 현상이 있는지 확인하는 방법을 알고 싶습니다.

OpenGL 명령 사이에서 클럭 체크 포인트를 얻기 위해 대상 glQueryCounter과 함께 사용 하는 것에 대해 읽었 GL_TIMESTAMP지만 다른 유형의 쉐이더를 구별하지는 않습니다.

예를 들어 GPU의 한 프레임이 렌더링하는 데 8ms가 걸리는 경우 정점 셰이더가 7ms, 프래그먼트 셰이더가 1ms를 사용했다고 말할 수 있습니까?

답변:


12

정점 및 프래그먼트 셰이더는 순차적으로 실행되지 않고 동시에 실행되며 GPU는 자동으로 이들 사이에로드 밸런스를 수행하므로 하나의 경우 7ms, 다른 하나의 경우 1ms와 같은 특정 타이밍을 의미있게 할당 할 수 없습니다.

그러나 병목 현상이있는 위치를 측정하기위한 간단한 실험을 수행 할 수 있습니다. 모든 드로우 콜에 대해 뷰 프로젝션 매트릭스를 모두 0으로 설정하십시오. 이렇게하면 모든 정점이 출력 위치를 0으로 만들고 모든 삼각형이 축퇴합니다. 따라서 모든 버텍스 쉐이더 작업을 유지하면서 모든 래스터 화 및 프래그먼트 셰이딩을 단락시킵니다 (셰이더 컴파일러는 런타임에 매트릭스가 0으로 설정 될지 모르기 때문에 아무것도 최적화 할 수 없습니다).

행렬을 0으로하여 성능을 측정하면 GPU에서 동시 래스터 화 또는 조각 음영 작업없이 정점 셰이더 만 실행하는 데 필요한 시간이 표시됩니다. 그런 다음이를 각 패스의 일반 렌더링에 필요한 시간과 비교할 수 있습니다. 두 번 비슷한 경우 패스는 아마도 정점에 바인딩되어있을 것입니다. 제로 매트릭스 렌더링이 훨씬 빠르면 아마도 픽셀 바운드 일 것입니다. 중간 결과를 얻을 수도 있습니다. 작업이 둘 사이에 균등하게 나뉘어져 있음을 나타냅니다.

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