루리코딩 세상

래스터라이즈(Rasterize)란? 본문

이론/DirectX

래스터라이즈(Rasterize)란?

루리딩 2025. 5. 30. 18:13

"래스터라이즈"는 래스터화라는 것을 의미한다. 래스터화는 백터 그래픽을 래스터 이미지(비트맵)으로

변환하는 작업을 의미한다. 쉽게 말해, 선이나 모양으로 이루어진 벡터 이미지를 픽셀로 구성된 이미지로

만드는 과정을 의미한다.


레스터화의 의미

벡터 그래픽을 래스터 이미지로 변환

레스터화는 벡터 그래픽(선, 곡선, 도형 등으로 표현된 이미지)를 래스터 이미지(픽셀로 구성된 이미지)로 변환하는 과정이다.

 

인쇄 및 편집 용이성

래스터화는 인쇄나 편집 소프트웨어에서 벡터 이미지를 픽셀 기반 이미지로 변환하여 인쇄 시 문제 발생 가능성을 줄이고,

편집 소프트웨어에서 다양한 효과를 적용할 수 있게 해준다.

 

에니메이션 및 게임 개발

래스터화는 에니메이션이나 게임 개발에서 2D 캐릭터나 배경을 만들 때 벡터 이미지를 래스터 이미지로 변환하여

랜더링 속도를 향상시키고, 다양한 효과를 적용할 수 있다.

 

폰트 래스터화

폰트도 벡터 형태로 저장되지만, 화면에 표시될 때는 래스터 이미지로 변환되어야 한다.

이 과정을 폰트 래스터화라고 한다.


RasterizerState : 래스터라이저 상태를 캡슐화한 클래스

GraphicsDevice : DirectX 장치 접근을 위해 사용하는 클래스 (예 : 싱글톤 형태)

Renderer 또는 RenderPipeline : 실제로 상태를 적용하는 곳


// RasterizerState.h

#pragma once
#include <d3d11.h>

class RasterizerState
{
public:
    enum class FillMode {
        Solid,
        Wireframe
    };

    enum class CullMode {
        None,
        Front,
        Back
    };

    RasterizerState();
    ~RasterizerState();

    bool Create(FillMode fill, CullMode cull, bool frontCCW = false);
    void Bind();

private:
    ID3D11RasterizerState* m_state = nullptr;
    D3D11_RASTERIZER_DESC m_desc;

    D3D11_FILL_MODE ToD3DFillMode(FillMode fill);
    D3D11_CULL_MODE ToD3DCullMode(CullMode cull);
};
// RasterizerState.cpp

#include "RasterizerState.h"
#include <stdexcept>
#include "GraphicsDevice.h" // 사용자 정의 싱글톤 클래스라 가정

RasterizerState::RasterizerState() { }

RasterizerState::~RasterizerState() {
    if (m_state) m_state->Release();
}

bool RasterizerState::Create(FillMode fill, CullMode cull, bool frontCCW) {
    m_desc = {};
    m_desc.FillMode = ToD3DFillMode(fill);
    m_desc.CullMode = ToD3DCullMode(cull);
    m_desc.FrontCounterClockwise = frontCCW;
    m_desc.DepthClipEnable = true;

    ID3D11Device* device = GraphicsDevice::Get()->GetDevice();
    HRESULT hr = device->CreateRasterizerState(&m_desc, &m_state);
    return SUCCEEDED(hr);
}

void RasterizerState::Bind() {
    ID3D11DeviceContext* context = GraphicsDevice::Get()->GetContext();
    context->RSSetState(m_state);
}

D3D11_FILL_MODE RasterizerState::ToD3DFillMode(FillMode fill) {
    switch (fill) {
        case FillMode::Wireframe: return D3D11_FILL_WIREFRAME;
        default: return D3D11_FILL_SOLID;
    }
}

D3D11_CULL_MODE RasterizerState::ToD3DCullMode(CullMode cull) {
    switch (cull) {
        case CullMode::Front: return D3D11_CULL_FRONT;
        case CullMode::Back: return D3D11_CULL_BACK;
        default: return D3D11_CULL_NONE;
    }
}
RasterizerState rasterState;
rasterState.Create(RasterizerState::FillMode::Solid, RasterizerState::CullMode::Back);
rasterState.Bind(); // GPU에 상태 적용

OOP에서 코드 재사용이 가능한 핵심 매커니즘 4가지,

1. 클래스(객체) 자체가 재사용 가능한 단위.

한 번 정의한 클래스를 여러 곳에서 객체로 만들어 쓴다.

 

2. 상속(Inheritance)

기존 클래스를 확장해서 새로운 기능을 가진 클래스를 만들 수 있다.

기존 코드를 건드리지 않고도 새로운 동작 추가 가능하다.

 

3. 다형성 (Polymorphism)

같은 타입의 포인터를 통해 서로 다른 기능의 객체들을 통합적으로 사용한다

조건에 따라 객체를 바꾸는 것만으로도 동작을 다르게 할 수 있다.

 

4. 컴포지션(Composition)

클래스 안에 다른 클래스를 포함시켜 구성함으로써 기능을 조합해 재사용한다.

다양한 기능을 가진 조합을 만들어내 보다 좋은 유틸리티성을 가진다.

 

재사용이 일어나는 실제 흐름

클래스 설계한 로직을 여러 객체에서 사용
상속 기존 클래스를 변경하지 않고 확장
다형성 여러 타입의 클래스를 같은 인터페이스로 다룸
컴포지션 필요한 기능을 조합하여 재사용