전달 + 음영에 대한 전역 연결 목록을 만들려고하지만 구현 중에 어려움이있는그룹 간의 OpenGL Compute Shader 동기화
입니다.
compute shader의 각 그룹에는 공유 변수 인 로컬 인덱스 배열이 있으며이 배열의 길이는 가변입니다 (용량은 일정하지만 내용은 그렇지 않습니다). 다음은 그 예입니다 :
shared int array [1024]; // GLSL의 선언
공유 int 길이; // 작업 그룹의 공유 변수이기도합니다.
그룹 0 : 길이 = 4, 어레이 = 3, 5, 7, 1, -1, -1, -1, -1 ... (-1 = 유효하지 않음)
그룹 1 : 길이 = 2, 배열 = 1, 6, -1, -1, -1 ....
그룹 2 : 길이 = 1, 배열 = 8, -1, -1, -1, -1 .. ..
이제이 인덱스를 전역 인덱스 배열에 병합하고 싶습니다. 즉 셰이더 저장 버퍼 객체.
글로벌 인덱스 어레이 : 3, 5, 7, 1, 1, 6, 8, -1, -1, -1 ......
어려움 순서는 그룹 인덱스를 기반으로 다른 그룹간에 동기화하는 방법을 모르겠습니다. OpenGL의 barrier()는 동일한 그룹 내에서만 동기화를 보장하기 때문에.
다른 게시물에서 OpenGL은 다른 그룹 간의 동기화를 지원하지 않는다고합니다.
OpenGL Compute shader sync different work groups
그래서, 내 질문입니다. 어쨌든 내 목표를 달성 할 수 있습니까?
예를 들어 업데이트를 완료 한 최신 그룹 ID 및 전역 인덱스 배열의 오프셋과 같은 일부 셰이더 저장소 버퍼 개체를 선언 할 수 있습니까?
예 :이 시도가 작동 윌
unit latestGroupIDUpdated = -1; // a SSBO
unit globalIdxOffset = 0; // a SSBO
in each group:
while(myGroupId - 1 != latestGroupIDUpdated)
{ //keep waiting }
// my previous group has updated the global list
globalIdxOffset+= myArrayLength;
latestGroupIDUpdated = myGroupId;
//now start appending the local index array into global index array
? 아니면 실패하고 왜 그럴까요?
실패 할 경우 어떤 방법을 권장합니까? 당신은 1D에서 로컬 그룹을 조직처럼의 모양으로
"그룹"이라고하면 "작업 그룹"을 의미합니까? 그렇다면 작업 그룹은 다른 "길이"를 가질 수 없습니다. "길이"를 사용하면 그룹당 호출 수를 나타냅니다. –
예, 그룹은 작업 그룹을 의미합니다 –
그리고 다른 길이입니까? –