[DirectX11] 6. 삼각형 – Vertex Shader에 대해 알아보자.

Vertex Shader에 대해서 알아보자. 이전글에서 정점 버퍼를 만들었다. 이 정점 버퍼의 내용으로 렌더링을 걸었을 때 가장 처음 가공을 시작하는 렌더링 파이프라인의 스테이지가 바로 이 Vertex Shader Stage이다. 이번글에는 HLSL로 작성된 1.쉐이더 파일을 컴파일한 후, 2. 컴파일된 내용을 쉐이더 객체로 생성하여 3. 렌더링 파이프라인에 연결하는 과정에 대해 알아볼 것이다.


우선 아주 간단한 형태의 정점 쉐이더 코드를 작성해보도록 하자.

HLSL
struct PixelIn
{
    float4 position : SV_POSITION;
    float4 color    : COLOR;
};

PixelIn VS( float4 position : SV_POSITION, float4 color : COLOR )
{
    PixelIn output;
    output.position = position;
    output.color    = color;

    return output;
}

코드를 보면 정점 쉐이더에서는 아무런 가공도 하지 않고 일단 들어오는 정점 데이터를 픽셀 쉐이더 입력 데이터로 바로 반환한다.

라이더의 파일 속성 - 빌드에서 제외 옵션

라이더에서는 위와 같이 파일의 속성에서 Build Action을 None으로 설정하면 된다.


쉐이더도 하나의 프로그램이라고 보면 된다. 우리가 코드를 작성하고 컴파일 과정을 거쳐 기계어로 바뀌듯이 쉐이더도 작성한 코드를 컴파일해서 GPU가 해석할 수 있는 쉐이더 프로그램으로 바꾸어야 한다. 컴파일된 쉐이더 프로그램은 ID3DBlob객체로 캐슁할 수 있다. 다음은 쉐이더를 컴파일 하는 코드이다.

C++
ID3DBlob* compiledShader = nullptr;
ID3DBlob* error          = nullptr;  
    
D3DCompileFromFile( Path, nullptr, nullptr, EntryPoint, ShaderModel, 0, 0, &compiledShader, &error );

Path

D3DCompileFromFile함수는 파일로부터 쉐이더를 컴파일하기 때문에 먼저 작성했던 쉐이더 코드를 파일로 저장해야 한다. 저장된 파일의 경로를 첫번째 파라메터로 넘겨준다.

EntryPoint

컴파일할 쉐이더 함수를 넣어준다. 지금은 정점 쉐이더를 컴파일하려 하므로 쉐이더 코드중에서 버택스 쉐이더 함수의 이름을 넣어준다. 위 쉐이더 코드에 따르면 VS를 넣어주면 된다.

ShaderModel

쉐이더도 추가되는 하드웨어의 기능에 따라 혹은 코드의 발전에 따라 여러 버전이 있다. 이 버전을 지정해주는 것이다.

레퍼런스는 마이크로 소프트를 참고하면 된다. 쉐이더 내용에 문제가 있어 컴파일을 제대로 못한 경우 내용을 ID3DBlob* error에서 받을 수 있다. 이를 문자열로 전환하여 에러 메세지를 확인할 수 있다.

C++
HRESULT hr = D3DCompileFromFile( Path, nullptr, nullptr, EntryPoint, ShaderModel, 0, 0, &compiledShader, &error )
if ( FAILED( hr ) )  
{  
    char* msg = (char * )error->GetBufferPointer();
}


정상적으로 컴파일된 쉐이더를 반환받았다면 이제 이것을 가지고 쉐이더를 생성하면 된다.

C++
ID3D11VertexShader* VertexShader = nullptr;

D3D11Device->CreateVertexShader( compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), nullptr, &VertexShader );


만들어진 쉐이더 객체를 렌더링에 사용하려면 렌더링 파이프라인에 연결해줘야 한다.

C++
D3D11DeviceContext->VSSetShader( VertexShader, nullptr, 0 );

이전글 : [DirectX11] 5. 삼각형 – Vertex Buffer에 대해 알아보자.
다음글 : [DirectX11] 7. 삼각형 – Input Layout에 대해 알아보자.

Leave a Comment