간단한 대답은 각 드로우 콜 사이에서 변경하는 것입니다. 셰이더 설정, 주전자 그리기, 다른 셰이더 설정, 다른 주전자 그리기.
블러, 글로우 등과 같은 하나의 오브젝트에만 여러 셰이더를 적용해야하는 복잡한 작업에 적합합니다. 기본적으로 텍스처에 렌더링 된 모든 것이 있습니다. 그런 다음 다른 셰이더를 사용하는 동안 해당 텍스처가 적용된 전체 화면에 쿼드를 렌더링합니다.
예를 들어 글로우 효과를 렌더링하려면 먼저 일반 비 광택 장면을 렌더링 한 다음 텍스처에서 빛을 내기 위해 채색하려는 색상의 실루엣 만 렌더링 한 다음 블러 셰이더로 전환하고 비 광택 장면에 텍스처가 적용된 쿼드.
디퍼 드 셰이딩 ( Deferred shading) 이라는 또 다른 기술이있어 장면을 조명없이 렌더링하고 나중에 화면 공간에 적용 할 수 있습니다. 핵심 목표는 픽셀 당 조명 비용을 줄이는 것입니다.
일반적으로 화면에 표시되는 컬러 버퍼를 렌더링합니다. 디퍼 드 셰이딩을 사용하면 하나의 쉐이더 패스에 컬러 버퍼와 노멀 및 깊이 버퍼를 렌더링합니다 (노멀 및 높이 매핑과 같이 텍스처에 노말 벡터와 깊이를 저장할 수 있음).
즉, 모든 픽셀에 대해 가장 투명하지 않은 지오메트리 (눈에서 깊이 또는 거리)의 가장 가까운 부분의 위치와 색상을 알 수 있습니다. 이 때문에 렌더링하는 모든 객체의 보이는 각 픽셀 대신 화면의 각 픽셀에 조명을 적용 할 수 있습니다. 장면이 앞뒤 순서로 완벽하게 렌더링되지 않으면 일부 오브젝트가 다른 오브젝트 위에 그려집니다.
그림자의 경우 실제로는 빛의 관점에서 깊이 버퍼 만 렌더링 한 다음 해당 깊이 정보를 사용하여 빛이 비추는 곳을 해결하십시오. 이를 쉐도우 매핑 (Shadow Mapping)이라고합니다 (기하 도형의 실루엣을 만들고 돌출시키는 섀도우 볼륨이라는 또 다른 방법이 있지만 여전히 쉐이더를 사용하게됩니다).
최신 OpenGL (3.0+) 에서는 Renderbuffers Objects가 첨부 된 Framebuffer Object 를 사용합니다 . 렌더 버퍼는 텍스처처럼 취급 될 수 있기 때문입니다. 1 개의 셰이더 렌더를 여러 개의 다른 렌더 버퍼로 렌더링하는 것과 같은 작업을 수행 할 수 있습니다 (따라서 텍스처를 렌더 할 필요가없고 노멀을 선택한 다음 글로우 구성 요소).하지만 기본 연습은 여전히 동일합니다.
또한 오버 헤드를 줄이기 위해 가능한 한 많은 쉐이더 스위치 수를 최소화하는 것이 바람직합니다. 따라서 일부 엔진은 동일한 재질로 모든 것을 그룹화하여 한 번에 모두 그릴 수 있습니다.