DirectX/DirectX 3D_(구)

05_Index

컴맹학자 2021. 6. 30. 18:17
728x90

IndexDemo.cpp, h

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

void IndexDemo::Initialize()
{
	shader = new Shader(L"04_World.fxo");

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

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

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

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

	//Create IndexBuffer
	{
		indices[0] = 0;
		indices[1] = 1;
		indices[2] = 2;
		indices[3] = 2;
		indices[4] = 1;
		indices[5] = 3;

		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.ByteWidth = sizeof(UINT) * 6;
		desc.BindFlags = D3D11_BIND_INDEX_BUFFER;

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

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

	D3DXMatrixIdentity(&world);
}

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

void IndexDemo::Update()
{
	if (Keyboard::Get()->Press(VK_LSHIFT))
	{
		if (Keyboard::Get()->Press(VK_RIGHT))
			world._11 += 2.0f * Time::Delta();
		else if (Keyboard::Get()->Press(VK_LEFT))
			world._11 -= 2.0f * Time::Delta();

		if (Keyboard::Get()->Press(VK_UP))
			world._22 += 2.0f * Time::Delta();
		else if (Keyboard::Get()->Press(VK_DOWN))
			world._22 -= 2.0f * Time::Delta();
	}
	else
	{
		if (Keyboard::Get()->Press(VK_RIGHT))
			world._41 += 2.0f * Time::Delta();
		else if (Keyboard::Get()->Press(VK_LEFT))
			world._41 -= 2.0f * Time::Delta();

		if (Keyboard::Get()->Press(VK_UP))
			world._42 += 2.0f * Time::Delta();
		else if (Keyboard::Get()->Press(VK_DOWN))
			world._42 -= 2.0f * Time::Delta();
	}

	shader->AsMatrix("World")->SetMatrix(world);
	shader->AsMatrix("View")->SetMatrix(Context::Get()->View());
	shader->AsMatrix("Projection")->SetMatrix(Context::Get()->Projection());

}

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

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

	static UINT Pass = 0;
	ImGui::InputInt("Pass", (int*)&Pass);
	Pass %= 2;

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

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

class IndexDemo : 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[4];
	ID3D11Buffer* vertexBuffer;

	//인덱스 버퍼
	UINT indices[6];
	ID3D11Buffer* indexBuffer;

	Matrix world;
};

 

 


04_World.fx

더보기
Matrix World, View ,Projection;
float4 Color;

struct VertexInput
{
    float4 Position : Position;
    uint VertexID : SV_VertexID;
};

struct VertexOutput
{
    float4 Position : SV_Position;
    float3 Color : Color;
};

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

VertexOutput VS(VertexInput input)
{
    VertexOutput output;
    
    //공간 변환
    output.Position = mul(input.Position, World);
    output.Position = mul(output.Position, View);
    output.Position = mul(output.Position, Projection);

    float3 color[] = { float3(1, 0, 0), float3(0, 1, 0), float3(0, 0, 1), float3(1, 1, 1) };
  
    //컬러의 색은 버택스 들어온 순서 
    output.Color = color[input.VertexID];
    
    return output;
}

float4 PS(VertexOutput input) : SV_Target
{
    return float4(input.Color, 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()));
    }
}

실행

 


VertexBuffer -> IndexBuffer로 써야하는 이유

1. 정점이 많으면 메모리를 많이 잡아 먹음

2. 캐시를 이용해서 그려주기 때문에 빠름

 

예를들어 VertexBuffer로 네모를 그리면 총 6개의 정점이 필요하지만

IndexBuffer로 그리면 4개의 정점으로 만들수가 있다.

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

07_Camera  (0) 2021.06.30
06_Grid  (0) 2021.06.30
04_World  (0) 2021.06.28
03_Triangle, Rect  (0) 2021.06.28
01_셋팅 및 02_Vertex  (0) 2021.06.28