이 지오메트리 셰이더가 왜 프로그램 속도를 너무 느리게합니까?


27

OpenGL 프로그램이 있고 터 레인 메쉬를 렌더링하고 있습니다. 꼭짓점 버퍼에서 꼭짓점을 바꾸고 조각 쉐이더에서 아직 색상을 지정하지는 않습니다. 한 번에 한 부분에 지오메트리 쉐이더를 추가하고 있습니다.

지오메트리 쉐이더를 추가하기 전에 파이프 라인의 프래그먼트 및 버텍스 쉐이딩 단계를 프로그래밍 할 때 약 30+의 프레임 속도를 얻었습니다. 나는 어떤 행복도 느낄 수 없었다. 지오메트리 셰이더를 추가 한 후 초당 약 5 프레임을 얻습니다. 왜? 지오메트리 쉐이더 전체입니다.

#version 420

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

void main()
{
    for (int i = 0; i < gl_in.length(); i++)
    {
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

이것이 지오메트리 셰이더없이 OpenGL이했던 것과 정확히 맞습니까?

답변:


40

이것이 지오메트리 셰이더없이 OpenGL이했던 것과 정확히 맞습니까?

아닙니다. GS는 기본 단계가 아닌 선택적 단계입니다.

OpenGL이 지오메트리 셰이더 를 실행하려면 " 기본 어셈블리 "를 수행해야합니다 . 를 통해 일련의 삼각형을 렌더링하면 GL_TRIANGLE_STRIPOpenGL은 인접한 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, 3post-T & L 캐시에서 4 개의 꼭짓점으로 변환됩니다. 그러나 GS의 정점 버퍼에는 이제 6 개의 정점이 있습니다. 사후 GS 버퍼는 더 많은 공간을 사용합니다. 따라서 T & L 최적화 된 삼각형 목록 또는 스트립을 올바르게 작성하는 데 어려움을 겪고 자신과 같은 패스 GS를 사용하면 기본적으로 해당 최적화로 인한 성능 향상의 약 절반이 죽었습니다.

쓸모는 없었지만 아프다.

이것에 덧붙여 많은 GL 3.x 급 GPU (일명 DX10)는 포스트 GS 버퍼가 다소 작습니다. 버퍼가 작을수록 동시에 활성화 할 수있는 GS 호출이 줄어 듭니다. 따라서 하드웨어가 GS에서 효과적으로 병목 현상을 일으 킵니다. 테셀레이션 은 4.x 급 하드웨어의 큰 특징 이므로 대부분의 이러한 하드웨어에는 더 많은 GS를 사용할 수 있도록 충분한 버퍼가 있습니다.

따라서 GS를 사용하면 코드 정점 처리에 병목 현상이 발생할 가능성이 높습니다. 물론 정점과 프래그먼트 셰이더를 더 복잡하게 만들면 언제든지 이점을 활용할 수 있습니다. 그 시점에서 무료 성능이기 때문입니다.

GS로 인한 속도 저하에 대한 자세한 내용은 이 기사를 참조하십시오 .

GS에 대한 기본 경험 규칙은 다음과 같습니다. GS를 사용하면 렌더링 속도가 빨라질 것이라고 생각하지 마십시오 . 할 수있는 일을 할 때 사용해야 합니다. 당신이하려는 것이 최적화라면, 다른 것을 사용하십시오.

이에 대한 일반적인 예외는 다음과 같습니다.


가장 높은 높이를 취하고 가장 낮은 높이를 빼서 각 다각형의 가파른 정도를 계산하려고합니다. 그러나 지오메트리 셰이더가 필연적으로이 정도 속도를 늦추면 버텍스 셰이더에서 창의적으로 할 수 있다고 생각합니다.
Avi

1
@Avi 삼각형의 가장 높은 점과 가장 낮은 점은 가파르 지 않습니다. 세 지점이 모두 필요합니다.
sam hocevar

2
개인적으로 저는 항상 GS보다 포인트 스프라이트에 인스 턴싱이 더 유용하다는 것을 알았습니다.
Maximus Minimus

1
포인트 스프라이트에 대한 예외는 layout(points) in;? 아니면 고정 출력 크기입니까? 아니면 둘 다?
Philip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.