[DX] RasterizerState, SamplerState, BlendState

vector·2025년 10월 23일

DirectX11 렌더링 파이프라인에서는 "State Object"를 통해 GPU가 그림을 어떻게 그릴지, 섞을지, 샘플링할지를 제어한다.
그 중 가장 자주 사용되는 3가지 상태 객체가 RasterizerState, SamplerState, BlendState

RasterizerState - 삼각형을 화면에 그리는 방법 제어

Rasterizer 단계는 3D 공간의 정점(Vertex)2D픽셀(Pixel)로 변환하는 과정
RasterizerState는 "화면에 어떻게 그릴지를 정의한다.

주요 역할

항목설명
FillMode면을 채울지, 와이어프레임으로 그릴지
CullMode앞/뒤면 제거 설정
FrontCounterClockwise어떤 방향이 앞면인지 결정
DepthClipEnableZ-클리핑 사용 여부
ScissorEnableScissor 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 - 텍스터를 생플링하는 방법 제어

SamplerState는 픽셀 셰이더에서 텍스터를 읽을 때 "어떤 방식으로 보간하고, 좌표가 벗어났을 때 어떻게 처리할지"를 정의

주요 역할

항목설명
Filter텍스처의 픽셀 보간 방식(POINT, LINEAR, ANISOTROPIC)
AddressU/V/W텍스처 좌표 범위 밖 처리 (WRAP, CLAMP, BORDER, MIRROR)
MipLODBiasMipMap 단계 보정값
MaxAnisotropyAnisotropic 필터링 강도
CompairsonFunc깊이 비교 샘플링 시 사용
BorderColorBORDER 모드일 때 경계 색상
MinLOD/MAxLODMipMap사용 범위 제한

코드 예시

	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());

BlendState - 픽셀 생상을 섞는 방법 제어

픽셀 셰이더에서 계산된 출력 생상과 렌더 타겟(이미 화면에 그려진 색상)을 어떻게 합성할지 정의

주요 역할

항목설명
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)
profile
게임 클라이언트 프로그래머 준비중 (공부 및 기록용)

0개의 댓글