2013-04-18 3 views
0

내가 OpenGL ES 2.0 및 GLSL에 대해 점점 더 많은 관심을 가짐에 따라, 셰이더 프로그램이 하드웨어에서 어떻게 실행되는지 정확하게 묻고 있습니다. 나는 정점 및 프래그먼트 셰이더 프로그램의 개념을 잘 이해하고 있지만 금속에서 어떻게 작동하는지에 대해서는 여전히 분명하지 않다. 너무 자주 GPU에 대해 읽었을 때 나는 용어 ​​파이프 라인을 발견했으며 GPU에는 주어진 수의 파이프 라인이 있습니다.GLSL 셰이더 프로그램은 그래픽 하드웨어 파이프 라인에서 어떻게 실행됩니까?

파이프 라인이하는 일을 이해하고, (기하학적 프리미티브를 나타내는) 꼭지점 집합을 제공하고 주어진 매개 변수로 버텍스 쉐이더를 실행하고 버텍스 쉐이더의 출력을 기반으로 작업을 수행하는 고정 기능 하드웨어를 통해 버텍스 쉐이더의 출력을 보냅니다. 그 출력. 버텍스 쉐이더는 또한 프리미티브의 각 프래그먼트에 보간되어 프래그먼트 쉐이더에 입력되는 값을 출력하므로 공통 알고리즘을 사용하여 복잡한 렌더링을 쉽게 수행 할 수 있습니다.

GPU에 n 개의 파이프 라인이있는 경우, n 개의 파이프 라인 각각이 단일 기하학적 프리미티브의 셰이더 프로그램 인스턴스를 실행할 수 있다는 의미입니까?

OpenGL ES 2.0 프로그래밍 가이드 (쉰말러에 따르면 약 60 %)를 읽었지 만 여전히 개발력이 부족해이 질문에 대한 답을 놓칠 수 있습니다.

실용적인 이유 중 하나는 GPU 대신 CPU에서 수행해야하는 작업과 수행하지 말아야 할 작업에 관한 것입니다. 예를 들어, 단일 업데이트 및 스레드 렌더링을 수행하는 경우 CPU에서 벡터 곱셈을 수행하는 행렬을 수행하는 것이 현명한 일입니다. 모든 객체의 행에서 수행해야합니다. 또는 여러 기하학적 기본 요소의 드로잉을 실행하는 셰이더 프로그램을 다른 파이프 라인에서 동시에 수행 할 수있는 GPU로 아웃소싱하는 것이 더 낫습니다.

각 도면을 개별적으로 호출하는 대신 VBO를 사용하여 여러 개의 쿼드를 그리는 코드를 최적화하려고합니다. 그러나 이것이 배열 렌더링으로 간주되기 때문에 mvp 행렬이 대역폭에서 히트로 간주 될 수있는 쿼드의 4 개의 꼭지점마다 동일하더라도 모든 꼭지점을 GPU로 보내야합니다. 그러나 셰이더 프로그램이 CPU의 렌더링 스레드에서 하나씩 실행되는 것과는 대조적으로 동시에 실행되면 아마도 가치있는 트레이드 오프 일 것입니다. 그러나 나는 어느 정도는 말할 수있는 수준의 전문 지식을 가지고 있지 않습니다.

답변

0

PowerVR SGX 아키텍처와 관련된 특정 GPU에 대한 성능 최적화 문서를 찾았으므로 여기서 내 자신의 질문에 답을 볼 것입니다. 이 문서는 쉐이더 엔진 내에 여러 개의 멀티 스레드 실행 단위를 보여주기 때문에 이것이 파이프 라인이라는 용어의 의미라고 가정합니다. 아마도이 용어는 고정 기능 파이프 라인 일에 사용되었을 것입니다. 누구든지 저를 고쳐 주실 수 있습니다.

내 코드를 어떻게 최적화했는지에 관해서는 꽤 표준적인 방법이라고 생각합니다. 각 쿼드는 객체의 상태에 따라 변환되는 동일한 기본 정점으로 표시됩니다. 객체는 수행 한 모든 변환을 나타내는 행렬 집합을 유지합니다. GL로 보낼 때 객체가 유지하는 행렬로 기본 정점을 변환하고 ise 정점을 정점 셰이더로 보냅니다. 전 세계적으로 독립적이기 때문에 VP 매트릭스를 유니폼으로 보냅니다. 어쨌든 속성으로 GL에 행렬을 전송하는 방법이 없다는 것을 알았습니다. 대역폭에 대한 우려로 생각합니다.

관련 문제