2012-06-21 2 views
0

GLSL ES에서 여러 조각 쉐이더를 순서대로 작성할 수 있습니까? 나는 S2가 두 개의 쉐이더 S1과 S2를 사용하기를 원한다. 예를 들어 두 차례 콘볼 루션을 순차적으로 적용하고 싶습니다.이 경우 두 번째 콘볼 루션은 여러 픽셀 위치에서 첫 번째 콘볼 루션 출력에 액세스해야합니다.순서대로 셰이더를 구성 할 수 있습니까?

답변

1

예. 그러나 두 가지 기술 중 하나를 사용해야합니다. 가장 쉬운 방법은 다중 패스 렌더링이라고합니다. S1에서 결과를 텍스처로 렌더링 한 다음 S1의 결과를 보유하고있는 텍스처에서 S2를 렌더링합니다. 그러나 이것은 GPU로 가능한 병렬 처리를 제거하기 때문에 약간 비효율적입니다. 그래서 종종 pipeling이라는 것을 사용하는 것이 좋습니다. 이것은 좀 더 복잡합니다.

  1. 2 * N 개의 텍스처를 만듭니다. 여기서 N은 셰이더의 수입니다. 이는 각 셰이더가 읽기 및 쓰기 텍스처를 모두 가질 수 있도록하기위한 것입니다.
  2. 모든 셰이더를 한 번에 렌더링하고 그 전에 셰이더의 읽기 텍스처를 읽고 텍스처를 쓰도록 작성하십시오.
  3. 각 프레임의 끝에서 읽기 및 쓰기 텍스처를 바꿉니다.

이 결과로 동시에 여러 번의 반복이 계산됩니다. 그러나 각 반복은 N 회 반복 후에 완료됩니다.

+0

니스! 두 방법 모두 이해하지만 왜 후자가 이전 방법보다 빠릅니까? 파이프 라이닝 방식에서는 쉐이더 작업이 각 노드에서 수행되는 모든 작업의 ​​비용과 동일한 시간이 걸리는 경우가 아닌 반면 다중 패스 렌더링에서는 비용이 한 번의 작업에 대한 비용 일뿐입니다. 다중 패스 렌더링의 N 번 실행이 파이프 라이닝의 한 반복만큼 빠르기 때문에 오버 헤드가 발생했기 때문입니까? –

+0

@AlexFlint GPU는 종종 꽤 깊은 파이프 라인을 가지고 있으며, 일반적으로 픽셀 렌더링이 끝나기 전에 다른 것들의 렌더링을 시작할 수 있습니다. 방금 렌더링 된 텍스처에서 렌더링을 렌더링하면 해당 텍스처에서 렌더링이 완료 될 때까지 그래픽 파이프 라인이 정지 될 수 있습니다. 예를 들어 iPhone에서 정점은 한 프레임에서 처리되고 다음 프레임에서는 조각이 처리됩니다. 따라서 첫 번째 기술을 사용하면 3 프레임의 렌더링 프레임을 필요로하게되어이 경우 최대 FPS가 30으로 줄어 듭니다. 이것은 glReadPixels 같은 것들이 느린 것과 같은 이유입니다. –

+0

아, 알겠습니다. 설명 할 시간을 내 주셔서 대단히 감사합니다. 정말로 도움이됩니다! –

관련 문제