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() 함수 수정

그려줄 정점의 갯수도 변경 


 

실행