DirectX11 렌더링 파이프라인 상태 설정 - RasterizerState, SamplerState, BlendState 완전 정복
DirectX11에서 GPU 렌더링 파이프라인 각 단계(RS, PS, OM)에 대응되는 세 가지 주요 상태 객체의 개념, 생성, 바인딩, 실험을 정리한다.
FillMode: 도형 내부를 색으로 채울지, 외곽선만 그릴지.CullMode: 전면/후면 삼각형 중 어떤 걸 그릴지.FrontCounterClockwise: 시계 방향 / 반시계 방향 정점을 앞면으로 인식할지 결정.✅ 렌더링 최적화 및 디버깅(와이어프레임)에 활용.
AddressU/V/W: UV가 0~1을 넘었을 때 어떻게 처리할지 (Wrap, Clamp, Mirror, Border).BorderColor: Border 모드일 때 바깥 색상.Filter: 텍스처 픽셀 간 보간 방식.✅ 반복 텍스처, UV 확장, 경계 처리 등 텍스처 표현 조절에 필수.
SrcBlend, DestBlend, BlendOp: RGB 값 혼합 규칙.SrcBlendAlpha, DestBlendAlpha, BlendOpAlpha: 알파 값 혼합 규칙.RenderTargetWriteMask: 어떤 채널(RGBA)을 쓸지.✅ 알파 투명도, 반투명 오브젝트, UI 반사, 그림자 등 시각 효과 구현의 핵심.
| 용어 | 설명 |
|---|---|
| FillMode | 삼각형 내부를 채우는 방식 (SOLID, WIREFRAME) |
| CullMode | 삼각형의 앞/뒤면 중 어느 쪽을 생략할지 (FRONT, BACK, NONE) |
| FrontCounterClockwise | 정점 나열 방향으로 앞면을 인식하는 기준 |
| AddressU/V/W | UV 좌표 초과 처리 방식 (WRAP, CLAMP, MIRROR, BORDER) |
| Filter | 텍스처 보간 방식 (POINT, LINEAR, ANISOTROPIC) |
| SrcBlend / DestBlend | 알파 블렌딩 시 원본/타겟 픽셀 가중치 |
| BlendOp | 색상 합성 방식 (ADD, SUBTRACT, 등) |
| RenderTargetWriteMask | 어떤 색상 채널을 쓸지 (R, G, B, A 선택) |
ComPtr<ID3D11RasterizerState> _rasterizerState = nullptr;
void Game::CreateRasterizerState()
{
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D11_FILL_SOLID;
desc.CullMode = D3D11_CULL_BACK;
desc.FrontCounterClockwise = false;
HRESULT hr = _device->CreateRasterizerState(&desc, _rasterizerState.GetAddressOf());
CHECK(hr);
}
Render()에서 바인딩
_deviceContext->RSSetState(_rasterizerState.Get());
실험 결과
FillMode = WIREFRAME → 윤곽선만 보임CullMode = FRONT → 시계방향 정점이 컬링되어 안 보임FrontCounterClockwise = true → 반시계 방향이 앞면ComPtr<ID3D11SamplerState> _samplerState = nullptr;
void Game::CreateSamplerState()
{
D3D11_SAMPLER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER;
desc.AddressV = D3D11_TEXTURE_ADDRESS_BORDER;
desc.AddressW = D3D11_TEXTURE_ADDRESS_BORDER;
desc.BorderColor[0] = 1; // 빨강 RGBA
desc.BorderColor[1] = 0;
desc.BorderColor[2] = 0;
desc.BorderColor[3] = 1;
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
desc.MaxAnisotropy = 16;
desc.MinLOD = FLT_MIN;
desc.MaxLOD = FLT_MAX;
desc.MipLODBias = 0.0f;
_device->CreateSamplerState(&desc, _samplerState.GetAddressOf());
}
Render()에서 바인딩 (PS 단계)
_deviceContext->PSSetSamplers(0, 1, _samplerState.GetAddressOf());
실험 결과
Address = BORDER → UV 1 초과 영역이 빨간색으로 채워짐Address = MIRROR → 텍스처가 대칭 반복됨 (거울 효과)ComPtr<ID3D11BlendState> _blendState = nullptr;
void Game::CreateBlendState()
{
D3D11_BLEND_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AlphaToCoverageEnable = false;
desc.IndependentBlendEnable = false;
auto& target = desc.RenderTarget[0];
target.BlendEnable = true;
target.SrcBlend = D3D11_BLEND_SRC_ALPHA;
target.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
target.BlendOp = D3D11_BLEND_OP_ADD;
target.SrcBlendAlpha = D3D11_BLEND_ONE;
target.DestBlendAlpha = D3D11_BLEND_ZERO;
target.BlendOpAlpha = D3D11_BLEND_OP_ADD;
target.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
HRESULT hr = _device->CreateBlendState(&desc, _blendState.GetAddressOf());
CHECK(hr);
}
Render()에서 바인딩 (OM 단계)
_deviceContext->OMSetBlendState(_blendState.Get(), nullptr, 0xFFFFFFFF);
✅ RasterizerState
✅ SamplerState
BORDER, MIRROR 등으로 시각적 패턴과 표현 방식 커스터마이징 가능.✅ BlendState
🎯 세 상태는 각각 RS → PS → OM 단계에 대응하며, 생성 → 바인딩 → 실험 순으로 구조화되어야 한다.
🎯 꼭 필요한 효과가 아니면 기본값으로도 동작하지만, 그래픽스 품질 향상과 최적화를 위해 반드시 익혀야 할 구성 요소들이다.