조각 쉐이더는 두 개의 원자 카운터를 사용합니다. 첫 번째가 증가하거나 증가하지 않을 수도 있고 두 번째 증가 할 수도 있고 그렇지 않을 수도 있습니다 (둘 다 결코 증가하지 않을 수도 있음). 카운터를 수정하기 전에 카운터의 현재 값이 항상 읽혀지고 나중에 카운터가 수정되면 이전에 읽은 값이 일부 사용자 지정 논리에 사용됩니다. 이 모든 일은 (대부분 언롤 가능) 루프에서 발생합니다.조각 쉐이더에서 GLSL 원자 카운터 (및 분기)
구상 대략 이런 흐름 : 몇 가지 작은 unrollable 루프에서
- 는 (컴파일 시간 해석을 const) 0-20위한 AC1 및 AC2 에 대한
- GET 카운터 값을 말한다 일부
- 체크 값 :
- 경우 X : 인덱스 AC1,
- 다른 증분 AC1에 uimage1D_A에서 설정 텍셀 : 인덱스에 uimage1D_B에서 설정 텍셀 (imgwidth-AC2-1) 증가 AC2
질문 : 셰이더는 현재 카운터 값을 쿼리합니다. 항상 "최신"값을 얻나요? 현재 조각 및 차후 GPU 및 드라이버에 관해서 만 말하면서 조각 쉐이더의 방대한 병렬 처리를 여기서 잃어 버릴 수 있습니까? 분지로서는
(만약 X) - I는 (uniform
) uint
에 다른 (readonly restrict uniform
) uimage1D
의 텍셀을 비교한다. 그래서 하나의 피연산자는 분명히 균일 한 스칼라이지만 다른 하나는 이미지가 균일하지만 imageLoad().x
입니다 -이 종류의 분기는 여전히 "완전히 병렬화"되어 있습니까? 두 지점이 각각 정확히 두 개의 거의 동일한 지침임을 알 수 있습니다. "완벽하게 최적화 된"GLSL 컴파일러를 가정 할 때, 이런 종류의 분기가 실속을 초래할 가능성이 있습니까?
해명에 대한 감사 및 경고 수 있습니다 uimage1D_A을 acessing 있습니다 제안합니다 :) – metaleap