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;
};
< 실행 결과 >
참조
[Direct3D의 기초 - Direct3D의 그리기 연산] 효과 프레임워크
효과 프레임워크(effect framework)는 특정한 렌더링 효과를 구현하는데 함께 쓰이는 셰이더 프로그램들과 렌더 상태들을 효과(effect)라고 부르는 단위로 조직화하고 관리하는 틀을 제공하는 편의용
b-pic.tistory.com
728x90
'🎨DirectX' 카테고리의 다른 글
[DX] World행렬 (크기 변환 행렬) (0) | 2023.02.04 |
---|---|
[DX] 사각형 그리기, Index Buffer (0) | 2023.02.04 |
[DX] 컴퓨터 구조(CPU-RAM/GPU-VRAM), PrimitiveTopology (기본 도형 위상 구조) (0) | 2023.02.04 |
[DX] 렌더링 파이프라인, 공간변환 (0) | 2023.02.04 |
[DX] 정점(Vertex), NDC좌표계 (0) | 2023.02.04 |