내가 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의 렌더링 스레드에서 하나씩 실행되는 것과는 대조적으로 동시에 실행되면 아마도 가치있는 트레이드 오프 일 것입니다. 그러나 나는 어느 정도는 말할 수있는 수준의 전문 지식을 가지고 있지 않습니다.