RasterizerState, SampleState, BlendState

Jaemyeong Lee·2025년 3월 22일
0

수업


주제

DirectX11 렌더링 파이프라인 상태 설정 - RasterizerState, SamplerState, BlendState 완전 정복

DirectX11에서 GPU 렌더링 파이프라인 각 단계(RS, PS, OM)에 대응되는 세 가지 주요 상태 객체의 개념, 생성, 바인딩, 실험을 정리한다.


개념

🧱 RasterizerState (RS 단계)

  • 역할: 정점 셰이더(VS)에서 넘어온 삼각형 정보를 픽셀로 변환할 때의 방식 제어.
  • 주요 기능:
    • FillMode: 도형 내부를 색으로 채울지, 외곽선만 그릴지.
    • CullMode: 전면/후면 삼각형 중 어떤 걸 그릴지.
    • FrontCounterClockwise: 시계 방향 / 반시계 방향 정점을 앞면으로 인식할지 결정.

✅ 렌더링 최적화 및 디버깅(와이어프레임)에 활용.


🧪 SamplerState (PS 단계)

  • 역할: 픽셀 셰이더에서 텍스처를 샘플링할 때, UV 좌표의 해석 방식과 필터링 설정을 정의.
  • 주요 기능:
    • AddressU/V/W: UV가 0~1을 넘었을 때 어떻게 처리할지 (Wrap, Clamp, Mirror, Border).
    • BorderColor: Border 모드일 때 바깥 색상.
    • Filter: 텍스처 픽셀 간 보간 방식.

✅ 반복 텍스처, UV 확장, 경계 처리 등 텍스처 표현 조절에 필수.


🎨 BlendState (OM 단계)

  • 역할: 픽셀 셰이더에서 계산된 색상을 렌더 타겟의 기존 픽셀과 어떻게 혼합할지 정의.
  • 주요 기능:
    • SrcBlend, DestBlend, BlendOp: RGB 값 혼합 규칙.
    • SrcBlendAlpha, DestBlendAlpha, BlendOpAlpha: 알파 값 혼합 규칙.
    • RenderTargetWriteMask: 어떤 채널(RGBA)을 쓸지.

✅ 알파 투명도, 반투명 오브젝트, UI 반사, 그림자 등 시각 효과 구현의 핵심.


용어 정리

용어설명
FillMode삼각형 내부를 채우는 방식 (SOLID, WIREFRAME)
CullMode삼각형의 앞/뒤면 중 어느 쪽을 생략할지 (FRONT, BACK, NONE)
FrontCounterClockwise정점 나열 방향으로 앞면을 인식하는 기준
AddressU/V/WUV 좌표 초과 처리 방식 (WRAP, CLAMP, MIRROR, BORDER)
Filter텍스처 보간 방식 (POINT, LINEAR, ANISOTROPIC)
SrcBlend / DestBlend알파 블렌딩 시 원본/타겟 픽셀 가중치
BlendOp색상 합성 방식 (ADD, SUBTRACT, 등)
RenderTargetWriteMask어떤 색상 채널을 쓸지 (R, G, B, A 선택)

코드 분석

1️⃣ RasterizerState

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 → 반시계 방향이 앞면

2️⃣ SamplerState

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 → 텍스처가 대칭 반복됨 (거울 효과)

3️⃣ BlendState

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

  • 렌더링 방식(Fill, Cull, 방향성)을 설정해 디버깅 / 최적화에 필수.
  • 후면 컬링은 보이지 않는 면 생략으로 성능 향상.

SamplerState

  • 텍스처 UV 좌표 초과 처리 및 필터링 조절.
  • BORDER, MIRROR 등으로 시각적 패턴과 표현 방식 커스터마이징 가능.

BlendState

  • 픽셀 색상 혼합 규칙을 정의.
  • 알파 블렌딩으로 자연스러운 투명도, 그림자, 반사효과 구현 가능.

🎯 세 상태는 각각 RS → PS → OM 단계에 대응하며, 생성 → 바인딩 → 실험 순으로 구조화되어야 한다.

🎯 꼭 필요한 효과가 아니면 기본값으로도 동작하지만, 그래픽스 품질 향상과 최적화를 위해 반드시 익혀야 할 구성 요소들이다.


profile
李家네_공부방

0개의 댓글