Quick Comparison
opaque: BlendEnable = FALSE
straight alpha: SrcAlpha, InvSrcAlpha
premultiplied alpha: One, InvSrcAlpha
additive: SrcAlpha/One 또는 One/One, 목적에 맞게 선택Texture RGB가 alpha를 이미 곱한 premultiplied 데이터인지 straight 데이터인지와 blend factor를 맞춰야 가장자리 halo가 생기지 않습니다.
색과 Alpha
Color와 alpha channel에는 별도 factor·operation을 지정할 수 있습니다. Render target alpha를 후속 composition에 사용한다면 단순히 color와 같은 식을 복사하지 말고 원하는 coverage·opacity 의미를 정합니다.
D3D11_BLEND_DESC 필드 | 기본값 | 언제 바꾸는가 |
|---|---|---|
AlphaToCoverageEnable | FALSE | MSAA foliage처럼 alpha를 sample coverage로 바꿀 때 |
IndependentBlendEnable | FALSE | 여러 RTV에 서로 다른 blend/write mask가 필요할 때 |
BlendEnable | FALSE | 현재 RTV에서 source·destination 결합이 필요할 때 |
SrcBlend / DestBlend | ONE / ZERO | straight·premultiplied·additive 식에 맞춤 |
BlendOp | ADD | 감산·최솟값·최댓값 결합이 필요할 때 |
SrcBlendAlpha / DestBlendAlpha | ONE / ZERO | 출력 alpha 의미를 color와 다르게 계산할 때 |
BlendOpAlpha | ADD | alpha channel 결합 operation을 바꿀 때 |
RenderTargetWriteMask | ALL | color channel 일부의 기록을 막을 때 |
위 값은 CD3D11_BLEND_DESC(D3D11_DEFAULT) 기준입니다. Raw D3D11_BLEND_DESC{}는 zero 초기화일 뿐 문서의 default state와 같지 않으므로 필요한 모든 field를 명시합니다.
일반 alpha blending은 순서에 의존하므로 transparent object를 대체로 뒤에서 앞으로 정렬하고 depth test는 유지하되 depth write는 끕니다. Additive effect는 순서 영향이 작지만 과노출과 tone mapping 결과를 확인합니다.
자주 틀리는 점
- Alpha texture만 있다고 자동으로 blending이 켜지지 않습니다.
- sRGB target에서 blend가 어느 color space에서 수행되는지 feature-level 계약을 확인합니다.
OMSetBlendState의 blend factor가 state에서BLEND_FACTOR를 쓸 때만 의미 있다는 점을 구분합니다.- 모든 material을 transparent queue에 넣어 early depth와 정렬 비용을 잃지 않습니다.
참고 링크
2 sources