DirectX/DirectX 2D
DX_1 배경 화면 & Line
컴맹학자
2022. 11. 6. 19:45
728x90
1. HLSL
솔루션 탐색기 영역에서 텍스트 생성 -> Effect.hlsl
※ 확장명 까지 쳐야 텍스트 파일에서 hlsl 파일 유형으로 변해진다.
hlsl 파일 수정
※ Shader Type이랑 Model을 지정
코드 작성
더보기
struct VertexInput
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
struct PixelInput
{
float4 Position : SV_POSITION;
float4 Color : COLOR0;
};
PixelInput VS(VertexInput input)
{
PixelInput output;
output.Position = input.Position;
output.Color = input.Color;
return output;
}
float4 PS(PixelInput input) : SV_TARGET
{
return input.Color;
}
2. Device.cpp
InitDirct3D() 함수 수정
※ om set ~ Create Viewport 작성하는 중간에 작성
더보기
void InitDirct3D(HINSTANCE hInstance)
{
//OM Set
~
//Create Shaders
{
//Vs Blob
hr = D3DX11CompileFromFile
(
L"Effect.hlsl", 0, 0,
"VS", "vs_5_0", //컴파일러 버젼
0, 0, 0,
&VsBlob, //컴파일 결과값 저장장소
0, 0
);
assert(SUCCEEDED(hr));
//Ps Blob
hr = D3DX11CompileFromFile(
L"Effect.hlsl", 0, 0,
"PS", "ps_5_0", //컴파일러 버젼
0, 0, 0,
&PsBlob, //컴파일 결과값 저장장소
0, 0
);
assert(SUCCEEDED(hr));
//Vertext Shader
hr = Device->CreateVertexShader(
VsBlob->GetBufferPointer(), // 시작 위치
VsBlob->GetBufferSize(), // 끝나는 지점
NULL,
&VertexShader
);
assert(SUCCEEDED(hr));
//Pixel Shader
hr = Device->CreatePixelShader(
PsBlob->GetBufferPointer(), // 시작 위치
PsBlob->GetBufferSize(), // 끝나는 지점
NULL,
&PixelShader
);
assert(SUCCEEDED(hr));
//VS, PS Shader 셋팅
DeviceContext->VSSetShader(VertexShader, 0, 0);
DeviceContext->PSSetShader(PixelShader, 0, 0);
}
//Create Viewport
~
}
Running() 함수 수정
기존에 죽였던 4개의 함수 활성화
Destroy() 수정
void Destroy()
{
SwapChain->Release();
Device->Release();
DeviceContext->Release();
RTV->Release();
VertexShader->Release();
PixelShader->Release();
VsBlob->Release();
PsBlob->Release();
}
3. Scene.cpp
더보기
#include "Device.h"
void InitScene()
{
}
void DestroyScene()
{
}
void Update()
{
}
void Render()
{
D3DXCOLOR bgcolor = D3DXCOLOR(0.22f, 0.27f, 0.44f, 1.0f); // 배경색
DeviceContext->ClearRenderTargetView(RTV, (float*)bgcolor); //앞
{
// 이 안에서 그리기
}
SwapChain->Present(0, 0); //
}
실행
dx통해서 배경색상을 씌워줌
4. Line 그리기
Device.cpp 수정
더보기
#include "Device.h"
ID3D11Buffer* vertexBuffer = NULL;
ID3D11InputLayout* inputLatout = NULL;
struct Vertex
{
Vector3 Position;
};
//hlsl 연결
D3D11_INPUT_ELEMENT_DESC layoutDesc[] = {
{
"POSITION", //hlsl VS변수에 있는 SemanticName
0,
DXGI_FORMAT_R32G32B32_FLOAT,
0,
0,
D3D11_INPUT_PER_VERTEX_DATA,
0,
},
{
"COLOR", //SemanticName
0,
DXGI_FORMAT_R32G32B32_FLOAT,
0,
12, // 끊어줄 단위
D3D11_INPUT_PER_VERTEX_DATA,
0,
}
};
void InitScene()
{
Vertex vertices[2];
vertices[0].Position = Vector3(0.0f, 0.0f, 0.0f);
vertices[1].Position = Vector3(0.5f, 0.5f, 0.0f);
//Create VertexBuffer (desc -> SUBRESOURCE -> create buffer)
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.Usage = D3D11_USAGE_DEFAULT; // CPU는 쓸수 없지만 GPU는 쓸수 있음
desc.ByteWidth = sizeof(Vertex) * 2; // 버퍼의 크기를 잡아줌
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; // 사용 용도
//버퍼에 값을 넣고 넘겨줄 정의
D3D11_SUBRESOURCE_DATA data;
ZeroMemory(&data, sizeof(D3D11_SUBRESOURCE_DATA));
data.pSysMem = vertices; // 처음 시작 주소
HRESULT hr = Device->CreateBuffer(&desc, &data, &vertexBuffer);
assert(SUCCEEDED(hr));
}
//Create InputLayout
{
HRESULT hr = Device->CreateInputLayout(
layoutDesc,
2, // 정의된 갯수 (Semantic 갯수)
VsBlob->GetBufferPointer(),
VsBlob->GetBufferSize(),
&inputLatout
);
assert(SUCCEEDED(hr));
}
}
void DestroyScene()
{
inputLatout->Release();
vertexBuffer->Release();
}
void Update() {}
void Render()
{
D3DXCOLOR bgcolor = D3DXCOLOR(0.22f, 0.27f, 0.44f, 1.0f); // 배경색
DeviceContext->ClearRenderTargetView(RTV, (float*)bgcolor); //앞
{
//그려주는 코드
UINT stride = sizeof(Vertex); //간격(보폭, 인덱스 나눠줄 크기)
UINT offset = 0; //시작점
DeviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
DeviceContext->IASetInputLayout(inputLatout);
DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP);
//최종적으로 그려주는 코드 (파이프 라인을 호출)
DeviceContext->Draw(2, 0);
}
SwapChain->Present(0, 0); //백퍼에 위에 내용 보냄
}
실행
중심점으로 부터 x, y 0.5 만큼의 선을 그려줌
5. 삼각형 그리기
삼각형 원리는 시작 ~ 끝을 알리는 정점을 그리기 위해 총 4개의 정점이 필요함
Vertex 구조체에 Color 변수 셋팅
InitScene() 수정
삼각형을 그리기 위해 4개의 정점과 각각의 정점이 가질 색상도 지정
배열의 크기가 달라 졌으므로 Buffer의 크기도 변경
Render() 함수 수정
그려줄 정점의 갯수도 변경
실행