-
[DirectX11] RasterizerState, SamplerState, BlendState2024년 02월 08일
- 유니얼
-
작성자
-
2024.02.08.:58
728x90DirectX 11로 게임 엔진 아키텍처 만들기
안녕하세요! 최근에 DirectX 11을 공부하면서 그래픽 프로그래밍의 세계에 발을 들였습니다. DirectX 11에서는 렌더링 과정을 다양한 '상태'를 통해 제어할 수 있는데요, 이번에는 그 중에서도 특히 중요한 세 가지 상태인 RasterizerState, SamplerState, BlendState에 대해 학습한 내용을 공유하고자 합니다. 이 상태들을 어떻게 설정하고 적용하는지에 따라, 우리가 만드는 그래픽의 품질과 성능이 크게 달라진다는 것을 알게 되었습니다.
참고강의 링크:
1. RasterizerState
RasterizerState는 3D 모델의 폴리곤이 어떻게 렌더링될지 결정합니다. 즉, 폴리곤의 채워진 부분을 어떻게 그릴지, 어떤 면을 제거할지(컬링), 그리고 폴리곤의 전면이 어느 방향인지를 설정할 수 있습니다.
// RasterizerState 생성 void Game::CreateRasterizerState() { D3D11_RASTERIZER_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.FillMode = D3D11_FILL_SOLID; // 폴리곤을 완전히 채움 desc.CullMode = D3D11_CULL_BACK; // 뒷면을 컬링하여 렌더링 최적화 desc.FrontCounterClockwise = false; // 전면 정점의 순서를 시계 방향으로 정의 // RasterizerState 객체 생성 HRESULT hr = _device->CreateRasterizerState(&desc, _rasterizerState.GetAddressOf()); // 오류 검사... }
2. SamplerState
SamplerState는 텍스처가 어떻게 샘플링될지를 결정합니다. 텍스처의 주소 모드, 필터링 방식, 경계 색상 등을 설정하여, 텍스처가 어떻게 렌더링될지 제어할 수 있습니다.
void Game::CreateGeometry() { { _vertices.resize(4); // 삼각형을 구성할 세 개의 정점 //13 //02 // 첫 번째 정점: 위치와 색상 설정 _vertices[0].position = Vec3(-0.5f, -0.5f, 0.f); // 화면 중앙 좌측 하단 _vertices[0].uv = Vec2(0.f, 5.f); // UV 좌표 수정 => 1/5 배율 // 두 번째 정점: 위치와 색상 설정 _vertices[1].position = Vec3(-0.5f, 0.5f, 0.f); // 화면 중앙 상단 _vertices[1].uv = Vec2(0.f, 0.f); // 세 번째 정점: 위치와 색상 설정 _vertices[2].position = Vec3(0.5f, -0.5f, 0.f); // 화면 중앙 우측 하단 _vertices[2].uv = Vec2(5.f, 5.f);// UV 좌표 수정 => 1/5 배율 // 네 번째 정점: 위치와 색상 설정 _vertices[3].position = Vec3(0.5f, 0.5f, 0.f); // 화면 중앙 우측 하단 _vertices[3].uv = Vec2(5.f, 0.f);// UV 좌표 수정 => 1/5 배율 } //...이하 동일 } // SamplerState 생성 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.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; // 선형 필터링으로 부드러운 텍스처 표현 // SamplerState 객체 생성 HRESULT hr = _device->CreateSamplerState(&desc, _samplerState.GetAddressOf()); // 오류 검사... }
3. BlendState
BlendState는 픽셀 색상이 어떻게 혼합될지 결정합니다. 이는 특히 투명도나 반투명 효과를 구현할 때 중요한 설정입니다.
// BlendState 생성 void Game::CreateBlendState() { D3D11_BLEND_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.RenderTarget[0].BlendEnable = true; // 블렌딩을 활성화하여 투명 효과 가능 desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; // 소스 알파 값을 사용한 블렌딩 desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; // 목적지 알파의 역값과의 블렌딩 // BlendState 객체 생성 HRESULT hr = _device->CreateBlendState(&desc, _blendState.GetAddressOf()); // 오류 검사... }
4. 렌더링
- RasterizerState (래스터라이저 상태): 래스터라이저 단계는 정점 쉐이더 실행 후, 픽셀 쉐이더 실행 전에 위치합니다. 이 단계에서는 폴리곤의 채우기 방식, 컬링 모드 등 래스터라이저 상태를 설정합니다. 이 설정은 정점이 화면에 어떻게 그려질지 결정하는 중요한 역할을 합니다.
- SamplerState (샘플러 상태): 샘플러 상태는 픽셀 쉐이더 단계에서 호출되며, 텍스처 샘플링 방식을 결정합니다. 샘플러는 픽셀 쉐이더가 텍스처를 어떻게 읽을지(예: 필터링, 경계 처리) 지정합니다.
- BlendState (블렌드 상태): 블렌드 상태는 출력 병합(OM) 단계에서 설정되며, 이는 렌더링 파이프라인의 마지막 단계입니다. 블렌드 상태는 여러 렌더링 소스로부터 온 픽셀 데이터가 최종적으로 어떻게 조합될지를 결정합니다. 이는 투명도, 반투명 효과 등을 구현할 때 필수적입니다.
void Game::Render() // 렌더링 함수 구현 { RenderBegin(); // 렌더링 시작 전 설정 // 렌더링 할 내용 // IA - VS - RS - PS - OM { uint32 stride = sizeof(Vertex); // 정점 데이터의 크기 uint32 offset = 0; // 버퍼 시작 위치 // 입력 어셈블러(IA) 스테이지 설정 _deviceContext->IASetVertexBuffers(0, 1, _vertexBuffer.GetAddressOf(), &stride, &offset); _deviceContext->IASetIndexBuffer(_indexBuffer.Get(), DXGI_FORMAT_R32_UINT, 0); _deviceContext->IASetInputLayout(_inputLayout.Get()); _deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 정점 쉐이더(VS) 스테이지 설정 _deviceContext->VSSetShader(_vertexShader.Get(), nullptr, 0); _deviceContext->VSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf()); // 래스터라이저(RS) 스테이지 설정 _deviceContext->RSSetState(_rasterizerState.Get()); // 래스터라이저 상태 설정 // 픽셀 쉐이더(PS) 스테이지 설정 _deviceContext->PSSetShader(_pixelShader.Get(), nullptr, 0); _deviceContext->PSSetShaderResources(0, 1, _shaderResourceView.GetAddressOf()); _deviceContext->PSSetShaderResources(1, 1, _shaderResourceView2.GetAddressOf()); _deviceContext->PSSetSamplers(0, 1, _samplerState.GetAddressOf()); // 출력 병합(OM) 스테이지 설정 _deviceContext->OMSetBlendState(_blendState.Get(), nullptr, 0xFFFFFFFF); // 정점들을 그리는 명령 _deviceContext->DrawIndexed(_indices.size(), 0, 0); } RenderEnd(); // 렌더링 후 처리 }
결론
이렇게 RasterizerState, SamplerState, 그리고 BlendState를 설정하는 방법을 학습하며, DirectX 11에서 제공하는 렌더링 파이프라인의 세밀한 제어가 얼마나 중요한지 깨달았습니다. 이 상태들을 적절히 활용하면, 보다 풍부하고 다채로운 그래픽 효과를 구현할 수 있습니다.
반응형다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드
받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이
감지되어도 모달 창이 표시되지 않습니다.)