본문 바로가기
서적 정리/DirectX11을 이용한 3D 게임 프로그래밍 입문

49.렌더 상태(Render State)

by 민돌이2 2022. 2. 9.

렌더 상태란 렌더링 파이프라인의 특정 측면의 구성에 쓰이는 관련 상태들을 의미한다. Direct3D는 렌더 상태를 상태 집합으로 묶어서 관리한다.

다음은 주요 상태 집합을 대표하는 인터페이스들이다.

  1. ID3D11RasterizerState : 파이프라인의 래스터라이저 단계를 구성하는 데 쓰이는 설정들을 묶은 상태 집합
  2. ID3D11BlendState : 혼합 연산을 구성하는 데 쓰이는 상태 집합(84장 참고)
  3. ID3D11DepthStencilState : 깊이, 스텐실 판정을 구성하는 데 쓰이는 상태 집합

 

지금은 래스터라이저단계에 초점을 두자. 래스터라이저단계의 구성을 위한 ID3D11RasterizerState 인터페이스를 생성할 때는 D3D11_RASTERIZER_DESC 구조체를 채워서 다음 메서드를 호출한다.

HRESULT ID3D11Device::CreateRasterizerState(
	const D3D11_RASTERIZER_DESC* pRasterizerDesc, 
	ID3D11RasterizerState** ppRasterizerState
);

1.pRasterizerDesc : 래스터라이저 상태 집합을 서술하는 구조체(*주 1)
2.ppRasterizerState : 생성된 래스터라이저 상태 개체에 대한 포인터 주소

 

래스터라이저 상태 개체를 생성했다면, ID3D11DeviceContext::RSSetState 메소드를 호출하여 장치에 새 상태 집합을 설정할 수 있다.

void ID3D11DeviceContext::RSSetState(ID3D11RasterizerState* pRasterizerState);

 

하나의 응용 프로그램에 여러 개의 서로 다른 ID3D11RasterizerState 객체가 필요할 수 있다. 예를 들어 와이어프레임 모드로 그리는 객체와 고형체로 그리는 객체가 구분되어 있을 때, 와이어프레임 객체를 먼저 그리고 래스터화기 상태를 바꾼 후 고형체 객체를 그리면 된다.

ID3D11RasterizerState* mWireframeRs; //와이어프레임 모드
ID3D11RasterizerState* mSolidRs; //고형체 모드

D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_RASTERIZER_DESC));
desc.FillMode = D3D11_FILL_WIREFRAME; //와이어프레임 모드 설정
desc.CullMode = D3D11_CULL_BACK; //후면 삼각형 제외
desc.FrontCounterClockwise = false; //삼각형의 정점의 순서가 시계방향이면 전면 삼각형
desc.DepthcilpEnable = true;

HR(md3dDevice->CreateRasterizerState(&desc, &mWireframeRs)); 

desc.FillMode = D3D11_FILL_SOLID; //고형체 모드 설정
HR(md3dDevice->CreateRasterizerState(&desc, &mSolidRs));

md3dImmediateContext->RSSetState(mWireframeRs); //래스터화기 상태를 와이어프레임 모드로
DrawWireframeObject(); //와이어프레임 객체 그리기

md3dImmediateContext->RSSetState(mSolidRs); //래스터화기 상태를 고형체 모드로
DrawSolidObject(); //고형체 객체 그리기

 

(*주 1)D3D11_RASTERIZER_DESC 구조체

래스터라이저 상태를 설명한다.

typedef struct D3D11_RASTERIZER_DESC 
{
	D3D11_FILL_MODE FillMode;
	D3D11_CULL_MODE CullMode;
	BOOL FrontCounterClockwise;
	INT DepthBias;
	FLOAT DepthBiasClamp;
	FLOAT SlopeScaledDepthBias;
	BOOL DepthClipEnable;
	BOOL ScissorEnable;
	BOOL MultisampleEnable;
	BOOL AntialiasedLineEnable;
} D3D11_RASTERIZER_DESC;

1.FillMode : 렌더링할 때 살용할 채우기 모드를 결정
2.CullMode : 지정된 방향을 향한 삼각형이 그려지지 않음을 결정
3.FrontCounterClockwise : 삼각형의 앞면 뒷면 결정
4.DepthBias : 픽셀에 추가된 깊이 값
5.DepthBiasClamp : 픽셀의 최대 깊이
6.SlopeScaledDepthBias : 픽셀의 기울기에 대한 스칼라값
7.DepthClipEnable : 깊이에 따라 클리핑을 활성화 여부
8.ScissorEnable : 가위-사각 컬링 활성화 여부
9.MultisampleEnable : 멀티 샘플 안티앨리어싱(MSAA) 렌더 대상에서 사변형 또는 알파 라인 안티앨리어싱 활성화 여부
10.AntialiasedLineEnable : 라인 안티앨리어싱 활성화 여부

728x90

댓글