DirectX11 렌더링 파이프라인에서는 "State Object"를 통해 GPU가 그림을 어떻게 그릴지, 섞을지, 샘플링할지를 제어한다.
그 중 가장 자주 사용되는 3가지 상태 객체가 RasterizerState, SamplerState, BlendState다
Rasterizer 단계는 3D 공간의 정점(Vertex)와 2D픽셀(Pixel)로 변환하는 과정
RasterizerState는 "화면에 어떻게 그릴지를 정의한다.
| 항목 | 설명 |
|---|---|
| FillMode | 면을 채울지, 와이어프레임으로 그릴지 |
| CullMode | 앞/뒤면 제거 설정 |
| FrontCounterClockwise | 어떤 방향이 앞면인지 결정 |
| DepthClipEnable | Z-클리핑 사용 여부 |
| ScissorEnable | Scissor Test 사용 여부 |
| MultisampleEnable | 멀티 샘플 안티앨리어싱 활성화 |
| AntialiasedLineEnable | 선 그리기 시 안티앨리어싱 적용 여부 |
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D11_FILL_SOLID; // 실선
desc.CullMode = D3D11_CULL_BACK; // 뒷면 컬링
desc.FrontCounterClockwise = false; // 시계방향이 앞면
desc.DepthClipEnable = false; // 깊이버퍼 범위 밖 절단 활성화
desc.ScissorEnable = false; // 시저링 비활성화
desc.MultisampleEnable = false; // 멀티샘플링 비활성화
desc.AntialiasedLineEnable = false; // 앤티앨리어싱 비활성화
HRESULT hr = _device->CreateRasterizerState(&desc, _rasterizerState.GetAddressOf());
CHECK(hr);
SamplerState는 픽셀 셰이더에서 텍스터를 읽을 때 "어떤 방식으로 보간하고, 좌표가 벗어났을 때 어떻게 처리할지"를 정의
| 항목 | 설명 |
|---|---|
| Filter | 텍스처의 픽셀 보간 방식(POINT, LINEAR, ANISOTROPIC) |
| AddressU/V/W | 텍스처 좌표 범위 밖 처리 (WRAP, CLAMP, BORDER, MIRROR) |
| MipLODBias | MipMap 단계 보정값 |
| MaxAnisotropy | Anisotropic 필터링 강도 |
| CompairsonFunc | 깊이 비교 샘플링 시 사용 |
| BorderColor | BORDER 모드일 때 경계 색상 |
| MinLOD/MAxLOD | MipMap사용 범위 제한 |
D3D11_SAMPLER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER; // U축 경계처리
desc.AddressV = D3D11_TEXTURE_ADDRESS_BORDER; // V축 경계처리
desc.AddressW = D3D11_TEXTURE_ADDRESS_BORDER; // W축 경계처리
desc.BorderColor[0] = 1;
desc.BorderColor[1] = 0;
desc.BorderColor[2] = 0;
desc.BorderColor[3] = 1;
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; // 선형 필터링
desc.MaxAnisotropy = 16; // 이방성 필터링 샘플 개수
desc.MaxLOD = FLT_MAX;
desc.MinLOD = FLT_MIN;
desc.MipLODBias = 0.0f;
_device->CreateSamplerState(&desc, _samplerState.GetAddressOf());
픽셀 셰이더에서 계산된 출력 생상과 렌더 타겟(이미 화면에 그려진 색상)을 어떻게 합성할지 정의
| 항목 | 설명 |
|---|---|
| BlendEnable | 블렌딩 사용 여부 |
| SrcBlend / DestBlend | 색상 블렌딩 인자 |
| BlendOp | 색상 블렌딩 연산(ADD, SUBTRACT 등) |
| SrcBlendAlpha / DestBlendAlpha | 알파 블렌딩 인자 |
| BlendOpAlpha | 알파 블렌딩 연산 |
| RenderTargetWriteMask | 어떤 채널(RGBA)을 쓸지 |
D3D11_BLEND_DESC blendDesc = {};
blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
device->CreateBlendState(&blendDesc, &blendState);
[ Input Assembler ]
↓
[ Vertex Shader ]
↓
[ Rasterizer ] → (RasterizerState)
↓
[ Pixel Shader ] → (SamplerState)
↓
[ Output Merger ] → (BlendState)