이것이 지오메트리 셰이더없이 OpenGL이했던 것과 정확히 맞습니까?
아닙니다. GS는 기본 단계가 아닌 선택적 단계입니다.
OpenGL이 지오메트리 셰이더 를 실행하려면 " 기본 어셈블리 "를 수행해야합니다 . 를 통해 일련의 삼각형을 렌더링하면 GL_TRIANGLE_STRIP
OpenGL은 인접한 3 개의 정점을 개별 삼각형으로 변환하기 위해 내부 작업을 수행하여 와인딩 순서를 적절하게 수정합니다.
일반적으로 GS를 사용하지 않는 경우이 프로세스는 한 번 수행됩니다. 그러나 GS를 사용할 때는 GS가 실행되기 전에 GS를 수행해야합니다. 그러나 GS는 완전히 다른 기본 유형 (예 : 쿼드)을 출력 할 수 있기 때문에 GS 후에도 수행해야합니다 .
이제 시스템은 기본적으로 아무것도 할 일이 없습니다. 결국 OpenGL은 GS가 아무것도 하지 않는다고 가정 할 수 없습니다 (결정할 수없는 문제입니다).
또한 GS가있는 경우 여러 최적화가 더 이상 작동하지 않습니다. 인덱스 렌더링을 고려하십시오.
요소 배열 버퍼의 각 인덱스는 꼭짓점 셰이더에서 동일한 출력을 생성합니다. 따라서 GPU는 종종 이러한 출력을 post-T & L 캐시에 캐시합니다 . 캐시에 이미있는 인덱스를 발견하면 VS가 다시 실행되지 않습니다. 캐시에서 데이터를 가져옵니다.
"그것"은 무엇입니까? "It"은 ... 기본 어셈블리 단위 입니다. 예, GS를 사용할 때 두 번 실행됩니다. 인덱스 캐싱 물건? GS 의 입력 에만 작동합니다 .
그렇다면 GS의 결과는 어떻게됩니까? 글쎄, 그것은 하드웨어에 달려있다. 그러나 어떤 종류의 메모리 버퍼로 들어가야합니다. 그리고 거기에는 문제가 있습니다 : 그 버퍼는 전혀 인덱스되지 않습니다. glDrawArrays 상황과 같습니다.
따라서 인덱스 버퍼를 보내면 0, 1, 2, 0, 2, 3
post-T & L 캐시에서 4 개의 꼭짓점으로 변환됩니다. 그러나 GS의 정점 버퍼에는 이제 6 개의 정점이 있습니다. 사후 GS 버퍼는 더 많은 공간을 사용합니다. 따라서 T & L 최적화 된 삼각형 목록 또는 스트립을 올바르게 작성하는 데 어려움을 겪고 자신과 같은 패스 GS를 사용하면 기본적으로 해당 최적화로 인한 성능 향상의 약 절반이 죽었습니다.
쓸모는 없었지만 아프다.
이것에 덧붙여 많은 GL 3.x 급 GPU (일명 DX10)는 포스트 GS 버퍼가 다소 작습니다. 버퍼가 작을수록 동시에 활성화 할 수있는 GS 호출이 줄어 듭니다. 따라서 하드웨어가 GS에서 효과적으로 병목 현상을 일으 킵니다. 테셀레이션 은 4.x 급 하드웨어의 큰 특징 이므로 대부분의 이러한 하드웨어에는 더 많은 GS를 사용할 수 있도록 충분한 버퍼가 있습니다.
따라서 GS를 사용하면 코드 정점 처리에 병목 현상이 발생할 가능성이 높습니다. 물론 정점과 프래그먼트 셰이더를 더 복잡하게 만들면 언제든지 이점을 활용할 수 있습니다. 그 시점에서 무료 성능이기 때문입니다.
GS로 인한 속도 저하에 대한 자세한 내용은 이 기사를 참조하십시오 .
GS에 대한 기본 경험 규칙은 다음과 같습니다. GS를 사용하면 렌더링 속도가 빨라질 것이라고 생각하지 마십시오 . 할 수있는 일을 할 때 사용해야 합니다. 당신이하려는 것이 최적화라면, 다른 것을 사용하십시오.
이에 대한 일반적인 예외는 다음과 같습니다.