Quick Comparison
SRV -> shader가 resource를 읽음
RTV -> pixel shader 결과를 color target에 기록
DSV -> depth/stencil test와 기록
UAV -> shader의 unordered read/write. FL 11_0은 PS/CS, FL 11_1은 전 shader stageView는 resource 복사본이 아니라 특정 subresource와 format을 pipeline 역할에 맞게 해석하는 COM 객체입니다.
Resource와 View
Resource 생성 시 필요한 BindFlags를 선언해야 해당 view를 만들 수 있습니다. Typeless texture는 compatible typed view를 통해 depth write와 shader read처럼 여러 해석을 제공할 수 있습니다.
| Resource 모양 | View dimension에서 확인할 값 |
|---|---|
Texture2D | MipSlice 또는 MostDetailedMip·MipLevels |
Texture2DArray | mip 범위 + FirstArraySlice·ArraySize |
Texture2DMS | MS 전용 dimension, mip 선택 없음 |
Texture2DMSArray | MS array dimension + slice 범위 |
| Structured/typed buffer | format, FirstElement, NumElements |
| Raw buffer | raw-compatible format과 view flag |
SRV는 여러 mip을 읽을 수 있지만 RTV·DSV·UAV는 보통 기록할 특정 mip·slice 범위를 정합니다. UAV는 multisampled resource에 만들 수 없으며 depth resource는 DSV/SRV compatible typeless family를 사용합니다. Direct3D 11.0의 Feature Level 11_0은 UAV를 pixel·compute shader에서 8개까지 사용하고, Feature Level 11_1은 모든 shader stage에서 64개까지 사용합니다. Device가 실제로 선택한 feature level을 확인한 뒤 shader와 slot 배치를 정합니다. pDesc == nullptr로 기본 view를 만들 수 있는 경우도 resource format과 전체 subresource 해석이 의도와 맞는지 확인합니다.
R24G8_TYPELESS resource
-> D24_UNORM_S8_UINT DSV
-> R24_UNORM_X8_TYPELESS SRV정확한 format family와 feature support는 DXGI format 문서를 확인합니다.
Hazard
같은 subresource를 RTV·DSV·UAV로 쓰면서 SRV로 동시에 읽을 수 없습니다. Runtime이 conflicting binding을 null로 바꾸고 경고할 수 있지만 pass 전환에서 명시적으로 이전 view를 unbind하는 편이 안전합니다.
자주 틀리는 점
- View를 해제하면 underlying resource가 무조건 즉시 파괴된다고 생각하지 않습니다. 다른 reference가 남을 수 있습니다.
- DSV를 shader에 직접 bind하지 않고 별도 SRV가 필요합니다.
- UAV의 unordered는 thread 실행 순서가 없다는 뜻이지 data race가 자동 해결된다는 뜻이 아닙니다.
- Array·mip view 범위를 잘못 잡아 의도하지 않은 slice를 읽지 않게 합니다.
참고 링크
2 sources