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 |