🎨DirectX

[DX] Shader Code, 쉐이더 기초 작성 (정점 출력 쉐이더 코드)

공대 컴린이 2023. 2. 4. 18:58
728x90

📄 04_Vertex.fx File

// 정점이 입력될 자료형을 정의
struct VertexInput
{
    float4 Position : Position; // 위치 값 하나를 입력받을 것이다.
    // : 뒤에 있는 Position은 어떤 용도로 사용할 것인지를 정의하는 용도이기 때문에
    // 대소문자 구분 없이 사용이 가능하다
    // 다른 벡터는 모두 float3(Vector3)를 사용하지만, Position만 float4(Vector4)를 사용한다.
};

// 정점쉐이더로 부터 Out될 자료형을 정의
struct VertexOutput
{
    float4 Position : SV_Position; // 위치 값 하나를 전달해줄 것이다.
};

// Vertex Shader 정의
// 반환 값을 VertexOutput으로 설정하고 입력받은 VertexInput을 전달받아 반환한다.
VertexOutput VS(VertexInput input)
{
    VertexOutput output;
    output.Position = input.Position;
    
    return output;
}

// Pixel Shader 정의
// 렌더링 파이프라인에서 VS -> RS -> PS 과정이 있지만, RS는 쉐이더 코드를 따로 작성하지 않고
// 나중에 어떤식으로 래스터라이징 하라는 상태만 전달해준다.
// Vertex Shader에서 넘겨준 VertexOutput 자료가 래스터라이징을 통해 Pixel Shader로 전달된다.
float4 PS(VertexOutput input) : SV_Target
{
    // float4는 쉐이더 자료형인데, Vertex에서 사용할 땐 x,y,z,w 값이 되고
    // Pixel에서 사용할 땐 r,g,b,a 인 컬러 값이 된다.
    return float4(1, 0, 0, 1); // 빨간색으로 반환
}

float4 PS2(VertexOutput input) : SV_Target
{
    return float4(0, 1, 0, 1); // 초록색으로 반환
}

float4 PS3(VertexOutput input) : SV_Target
{
    return float4(0, 0, 1, 1); // 파란색으로 반환
}

// 효과 프레임워크의 기법 중 하나
// technique11은 적어도 하나의 pass를 포함한다.
technique11 T0
{
	// pass는 함수들을 편하게 번호로 지정하여 사용할 수 있도록 도와준다.
    pass P0
    {
    	// DX11: 5_0 버전 사용, DX10: 4_0 버전 사용
        SetVertexShader(CompileShader(vs_5_0, VS())); // 쉐이더 버전과 컴파일할 쉐이더명 입력
        SetPixelShader(CompileShader(ps_5_0, PS()));
    }

    pass P1
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS2()));
    }
}

technique11 T1
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS3()));
    }
}

📄 Vertex_Line.cpp

#include "stdafx.h"
#include "Vertex_Line.h"

void Vertex_Line::Initialize()
{
	shader = new Shader(L"04_Vertex.fx");

	vertices[0].Position = Vector3(0.0f, 0.0f, 0.0f);
	vertices[1].Position = Vector3(1.0f, 0.0f, 0.0f);

	// 뭔가를 그릴 수 있도록 CPU로 데이터를 넘겨주는 것
	D3D11_BUFFER_DESC desc;
	ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
	desc.ByteWidth = sizeof(Vertex) * 2; // 그려질 자료형 크기
	desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // 그려질 용도

	D3D11_SUBRESOURCE_DATA subResource = { 0 };
	subResource.pSysMem = vertices;// 정점을 그릴 데이터의 시작주소

	Check(D3D::GetDevice()->CreateBuffer(&desc, &subResource, &vertexBuffer));
}

void Vertex_Line::Destroy()
{
	SafeDelete(shader); // new로 생성한 것은 Delete로 지운다
	SafeRelease(vertexBuffer); // I자가 붙은 것은 Release로 지운다
}

void Vertex_Line::Update()
{
}

void Vertex_Line::Render()
{
	UINT stride = sizeof(Vertex); // 정점 하나의 크기
	UINT offset = 0;

	D3D::GetDC()->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
	D3D::GetDC()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);

	//shader->Draw(0, 0, 2); // 빨간색 출력
	//shader->Draw(0, 1, 2); // 초록색 출력
	shader->Draw(1, 0, 2); // 파란색 출력
}

📄 Vertex_Line.h

#pragma once
#include "Systems/IExecute.h"

class Vertex_Line : public IExecute
{
public:
	virtual void Initialize() override;
	virtual void Ready() override {}
	virtual void Destroy() override;
	virtual void Update() override;
	virtual void PreRender() override {}
	virtual void Render() override;
	virtual void PostRender() override {}
	virtual void ResizeScreen() override {}

private:
	Shader* shader;

	Vertex vertices[2];
	ID3D11Buffer* vertexBuffer;
};

< 실행 결과 >


참조

https://b-pic.tistory.com/116

 

[Direct3D의 기초 - Direct3D의 그리기 연산] 효과 프레임워크

효과 프레임워크(effect framework)는 특정한 렌더링 효과를 구현하는데 함께 쓰이는 셰이더 프로그램들과 렌더 상태들을 효과(effect)라고 부르는 단위로 조직화하고 관리하는 틀을 제공하는 편의용

b-pic.tistory.com

 

728x90