일정한 조건이 셰이더 전환보다 비용이 많이 듭니까?


14

일반적으로 셰이더에서 분기하는 것은 좋은 생각이 아닙니다. 그러나 이제는 전체 그리기 호출과 관련하여 일정한 조건을 가진 쉐이더가 있습니다. 따라서 실행되는 분기는 하나의 드로우 콜에 대해 항상 동일합니다.

이러한 브랜치 유형이 브랜치가없는 다중 셰이더를 사용하는 것보다 비용이 많이 듭니까?



내 질문에 대한 답변에서 알 수 있듯이 조각은 "워프"또는 "파면"으로 그룹화되며 해당 그룹의 모든 조각이 동일한 분기를 사용하는 경우 해당 분기 만 실행됩니다.
Martin Ender

그러나 조각과 다른 쉐이더는 어떻습니까?
nikitablack


1
나는 이것이 복제본이 아니라고 생각하지만, 결정되기 전에 무엇을 요청하고 있는지 명확히하기 위해 편집해야합니다. 일부 예제 코드 또는 비교되는 두 옵션에 대한 설명은 많은 도움이 될 것입니다.
trichoplax

답변:


13

최신 하드웨어에서는 그룹의 모든 호출이 동일한 경로를 따르는 경우 사용되지 않은 경로는 평가되지 않습니다.

의사 코드에서 :

if(cond){
   res = ...
}else{
   res = ...
}

된다

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

어디 anyInvocationARB쉐이더의 호출이 같은 사실이 경우는 true 될 것입니다 cond(OpenGL을 확장에서 ARB_shader_group_vote ).

cond가 유니폼에서만 파생되는 경우 드라이버는 렌더링을 시작하기 전에 조건을 최적화하고 평가하고 if를 올바른 분기로 이동합니다. OpenGL에는 균일 한 서브 루틴이라는 기능이있어 명시 적으로 만들 수 있습니다.


4
이것은 사실이지만, 그것은이다 없는 성능을 위해 고려해야 할 유일한 것은. GPU는 여전히 셰이더 당 리소스를 정적으로 예약하므로 두 분기를 모두 실행하는 것처럼 여전히 리소스를 사용하여 점유를 해칠 수 있습니다.
John Calsbeek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.