DirectX/DirectX 3D_(구)

03_Triangle, Rect

컴맹학자 2021. 6. 28. 21:19
728x90

TriangleListDemo.cpp, h

더보기
#include "stdafx.h"
#include "TriangleListDemo.h"

void TriangleListDemo::Initialize()
{
	shader = new Shader(L"02_Pass.fx");

	//triangle 1
	{
		vertices[0].Position = Vector3(-0.5f, +0.0f, 0);
		vertices[1].Position = Vector3(+0.0f, +0.5f, 0);
		vertices[2].Position = Vector3(+0.5f, +0.0f, 0);

		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(Vertex) * 3;
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

		D3D11_SUBRESOURCE_DATA data = { 0 };
		data.pSysMem = vertices;

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

	//triangle 2
	{
		vertices2[0].Position = Vector3(-0.5f, -0.5f, 0);
		vertices2[1].Position = Vector3(+0.0f, +0.0f, 0);
		vertices2[2].Position = Vector3(+0.5f, -0.5f, 0);

		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(Vertex) * 3;
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

		D3D11_SUBRESOURCE_DATA data = { 0 };
		data.pSysMem = vertices2;

		Check(D3D::GetDevice()->CreateBuffer(&desc, &data, &vertexBuffer2));
	}

}

void TriangleListDemo::Destroy()
{
	SafeDelete(shader);
	SafeRelease(vertexBuffer);
	SafeRelease(vertexBuffer2);
}

void TriangleListDemo::Update()
{

}

void TriangleListDemo::Render()
{
	UINT stride = sizeof(Vertex);
	UINT offset = 0;

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

	shader->Draw(0, 0, 3);

	static Color Color = D3DXCOLOR(1, 1, 1, 1);
	static UINT Pass = 0;
	ImGui::InputInt("Pass", (int*)&Pass);
	Pass = (UINT)Math::Clamp((float)Pass, 0, 3);

	ImGui::ColorEdit3("Color", (float*)&Color);
	shader->AsVector("Color")->SetFloatVector(Color);


	D3D::GetDC()->IASetVertexBuffers(0, 1, &vertexBuffer2, &stride, &offset);
	shader->Draw(0, Pass, 3);
}

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

class TriangleListDemo : public IExecute
{
public:
	virtual void Initialize() 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:
	struct Vertex
	{
		Vector3 Position;
	};

private:
	Shader* shader;

	Vertex vertices[3];
	ID3D11Buffer* vertexBuffer;

	Vertex vertices2[3];
	ID3D11Buffer* vertexBuffer2;
};

 

RectDemo.cpp, h

더보기
#include "stdafx.h"
#include "RectDemo.h"

void RectDemo::Initialize()
{
	//Performance per;
	//per.Start();
	shader = new Shader(L"03_Rect.fxo");

	//float t = per.End();
	//wstring str = to_wstring(t);
	//MessageBox(D3D::GetDesc().Handle, str.c_str(), L"", MB_OK);

	//triangle 1
	{
		vertices[0].Position = Vector3(+0.0f, +0.0f, +0.0f);
		vertices[1].Position = Vector3(+0.0f, +0.5f, +0.0f);
		vertices[2].Position = Vector3(+0.5f, +0.0f, +0.0f);
		vertices[3].Position = Vector3(+0.5f, +0.0f, +0.0f);
		vertices[4].Position = Vector3(+0.0f, +0.5f, +0.0f);
		vertices[5].Position = Vector3(+0.5f, +0.5f, +0.0f);

		D3D11_BUFFER_DESC desc;  
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(Vertex) * 6;
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

		D3D11_SUBRESOURCE_DATA data = { 0 };
		data.pSysMem = vertices;

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

}

void RectDemo::Destroy()
{
	SafeDelete(shader);
	SafeRelease(vertexBuffer);
}

void RectDemo::Update()
{
	if (Keyboard::Get()->Press(VK_RIGHT))
		vertices[0].Position.x += 2.0f * Time::Delta();
	if (Keyboard::Get()->Press(VK_LEFT))
		vertices[0].Position.x -= 2.0f * Time::Delta();

	D3D::GetDC()->UpdateSubresource(vertexBuffer, NULL, NULL, &vertices, 0, 0);

}

void RectDemo::Render()
{
	UINT stride = sizeof(Vertex);
	UINT offset = 0;

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

	static UINT Pass = 0;
	ImGui::InputInt("Pass", (int*)&Pass);
	Pass = (UINT)Math::Clamp((float)Pass, 0, 1);

	shader->Draw(0, Pass, 6);
}

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

class RectDemo : public IExecute
{
public:
	virtual void Initialize() 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:
	struct Vertex
	{
		Vector3 Position;
	};

private:
	Shader* shader;

	Vertex vertices[6];
	ID3D11Buffer* vertexBuffer;

};

03_Rect.fx

더보기
struct VertexInput
{
    float4 Position : Position;
};

struct VertexOutput
{
    float4 Position : SV_Position;
};

//RS 셋팅
RasterizerState RS
{
    Fillmode = WireFrame; // Wire(선)
};

VertexOutput VS(VertexInput input)
{
    VertexOutput output;

    output.Position = input.Position;

    return output;
}

float4 PS(VertexOutput input) : SV_Target
{
    return float4(1, 0, 0, 1);
}


technique11 T0
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS()));
        
    }

    pass P1
    {
        SetRasterizerState(RS);
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS()));
    }

}

Main.cpp

더보기

 

 

 


실행 1

실행 2

 


추가 

2D에선 좌표계를 오른손 좌표계를 사용 했지만

3D에선 왼손 좌표계를 사용함

 

fx파일을 fxo 파일로 바꿔주는 셋팅 구현

효과 : 실행 할떄 마다 fx파일을 다시 읽고 컴파일 한다면 fxo파일은 미리헤더 컴파일 처럼 사용하게 되서

읽어지는 속도가 상승

'DirectX > DirectX 3D_(구)' 카테고리의 다른 글

07_Camera  (0) 2021.06.30
06_Grid  (0) 2021.06.30
05_Index  (0) 2021.06.30
04_World  (0) 2021.06.28
01_셋팅 및 02_Vertex  (0) 2021.06.28