Quick Flow
패스 A: 이미지 A에 출력 → 패스 종료
패스 B: 이미지 A를 읽고 이미지 B에 출력
다음 반복: A/B의 읽기·쓰기 역할 교체같은 이미지에 쓰면서 동시에 그 이미지를 샘플링하는 피드백을 기본 방식으로 사용하지 않습니다. 명령 순서가 있다는 사실만으로 같은 draw의 읽기·쓰기 충돌이 해결되지는 않습니다.
패스 계약
| 패스가 정할 것 | 확인할 내용 |
|---|---|
| 출력 | FBO·첨부·draw buffer·크기·샘플 수 |
| 입력 | 텍스처·sampler·유닛·읽을 레벨·레이어 |
| 상태 | viewport·깊이·블렌드·스텐실·scissor·write mask |
| 프로그램 | 실제 입력과 출력 타입·uniform |
| 다음 소비자 | 샘플링·blit·readback·image/SSBO 접근 |
그림자 패스는 깊이 이미지를 쓰고 조명 패스가 그 이미지를 읽습니다. 후처리는 장면 색을 다른 대상으로 변환합니다. 알고리즘은 달라도 출력과 입력을 구분하는 자원 계약은 같습니다.
Ping-pong 예제
반복 0: textureA → shader → FBO(textureB)
반복 1: textureB → shader → FBO(textureA)
반복 2: textureA → shader → FBO(textureB)두 이미지의 크기·형식이 효과의 요구에 맞아야 합니다. 마지막 반복 결과가 A인지 B인지 추적하고, resize하면 두 저장소를 함께 갱신합니다. 단순히 텍스처 유닛 번호를 바꾸는 것으로 실제 FBO 첨부가 바뀌지는 않습니다.
Barrier가 필요한 경우
같은 컨텍스트의 일반적인 선행 FBO 출력과 후속 별도 패스 샘플링은 명령 순서에 따라 처리됩니다. 모든 패스 사이에 glFinish나 memory barrier를 넣지 않습니다. 반면 image load/store·SSBO 같은 비일관 메모리 접근은 메모리 가시성의 소비자별 barrier 조건을 따라야 합니다.
4.5 또는 ARB_texture_barrier는 제한된 렌더링 피드백 패턴을 허용하는 경로입니다. glTextureBarrier 한 번으로 임의의 같은 이미지 read/write가 안전해진다고 해석하지 않습니다. 읽는 texel·쓰는 영역·호출 사이의 제약을 명세로 확인하고, 기본 3.3 문서에서는 이미지 분리·ping-pong을 사용합니다.
실패와 버전 이관
FBO가 COMPLETE여도 sampler가 현재 출력 이미지를 가리키거나, 이전 패스의 viewport·blend가 남으면 결과가 잘못됩니다. 같은 텍스처의 레벨·레이어·view를 달리 쓴 경우도 실제 저장소 겹침과 피드백 규칙을 따져야 합니다.
구형 복사 기반 효과를 FBO로 옮길 때는 결과 이미지뿐 아니라 지우기·깊이·색 공간의 순서를 함께 옮깁니다. 패스가 구현할 효과의 원리는 Graphics 후처리와 그림자 매핑에서 확인할 수 있습니다.
참고 링크
4 sources