728x90
GridDemo.cpp, h
더보기
#include "stdafx.h"
#include "GridDemo.h"
void GridDemo::Initialize()
{
shader = new Shader(L"06_Grid.fxo");
vertexCount = (width + 1) * (height + 1);
vertices = new Vertex[vertexCount];
for (UINT y = 0; y <= height; y++)
{
//x축(가로)부터 정의 (삼각형 단위)
for (UINT x = 0; x <= width; x++)
{
UINT index = (width + 1) * y + x;
vertices[index].Position.x = (float)x;
vertices[index].Position.y = 0.0f;
vertices[index].Position.z = (float)y;
}
}
//Create VertexBuffer
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.ByteWidth = sizeof(Vertex) * vertexCount;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA data = { 0 };
data.pSysMem = vertices;
Check(D3D::GetDevice()->CreateBuffer(&desc, &data, &vertexBuffer));
}
//Set Index Subresource
indexCount = width * height * 6;
indices = new UINT[indexCount];
UINT index = 0;
for (UINT y = 0; y < height; y++)
{
for (UINT x = 0; x < width; x++)
{
indices[index + 0] = (width + 1) * y + x;
indices[index + 1] = (width + 1) * (y + 1) + x;
indices[index + 2] = (width + 1) * y + x + 1;
indices[index + 3] = (width + 1) * y + x + 1;
indices[index + 4] = (width + 1) * (y + 1) + x;
indices[index + 5] = (width + 1) * (y + 1) + x + 1;
index += 6;
}
}
//Create IndexBuffer
{
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.ByteWidth = sizeof(UINT) * indexCount;
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
D3D11_SUBRESOURCE_DATA data = { 0 };
data.pSysMem = indices;
Check(D3D::GetDevice()->CreateBuffer(&desc, &data, &indexBuffer));
}
D3DXMatrixIdentity(&world);
}
void GridDemo::Destroy()
{
SafeDelete(shader);
SafeRelease(vertexBuffer);
SafeRelease(indexBuffer);
SafeDeleteArray(vertices);
SafeDeleteArray(indices);
}
void GridDemo::Update()
{
shader->AsMatrix("World")->SetMatrix(world);
shader->AsMatrix("View")->SetMatrix(Context::Get()->View());
shader->AsMatrix("Projection")->SetMatrix(Context::Get()->Projection());
}
void GridDemo::Render()
{
UINT stride = sizeof(Vertex);
UINT offset = 0;
D3D::GetDC()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
D3D::GetDC()->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
D3D::GetDC()->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);
static UINT Pass = 0;
ImGui::InputInt("Pass", (int*)&Pass);
Pass %= 2;
shader->DrawIndexed(0, Pass, indexCount);
}
#pragma once
#include "Systems/IExecute.h"
class GridDemo : 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;
UINT width = 10, height = 10;
UINT vertexCount;
Vertex* vertices;
ID3D11Buffer* vertexBuffer;
UINT indexCount;
UINT* indices;
ID3D11Buffer* indexBuffer;
Matrix world;
};
06_Grid.fx
더보기
matrix World, View, Projection;
struct VertexInput
{
float4 Position : Position;
};
struct VertexOutput
{
float4 Position : SV_Position;
};
RasterizerState RS
{
FillMode = WireFrame;
};
VertexOutput VS(VertexInput input)
{
VertexOutput output;
output.Position = mul(input.Position, World);
output.Position = mul(output.Position, View);
output.Position = mul(output.Position, Projection);
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()));
}
}
Context.cpp
더보기
#include "Framework.h"
#include "Context.h"
#include "Viewer/Viewport.h"
#include "Viewer/Perspective.h"
Context* Context::instance = NULL;
Context * Context::Get()
{
//assert(instance != NULL);
return instance;
}
void Context::Create()
{
assert(instance == NULL);
instance = new Context();
}
void Context::Delete()
{
SafeDelete(instance);
}
Context::Context()
{
D3DDesc desc = D3D::GetDesc();
perspective = new Perspective(desc.Width, desc.Height);
viewport = new Viewport(desc.Width, desc.Height);
position = D3DXVECTOR3(0, 0, -10);
D3DXVECTOR3 forward(0, 0, 1);
D3DXVECTOR3 right(1, 0, 0);
D3DXVECTOR3 up(0, 1, 0);
D3DXMatrixLookAtLH(&view, &position, &(position + forward), &up);
}
Context::~Context()
{
SafeDelete(perspective);
SafeDelete(viewport);
}
void Context::ResizeScreen()
{
perspective->Set(D3D::Width(), D3D::Height());
viewport->Set(D3D::Width(), D3D::Height());
}
//여기에 카메라 이동 관련
void Context::Update()
{
ImGui::SliderFloat("EyeX", &position.x, 0, 128);
ImGui::SliderFloat("EyeY", &position.y, -20, 20);
ImGui::SliderFloat("EyeZ", &position.z, -128, 128);
D3DXVECTOR3 forward(0, 0, 1);
D3DXVECTOR3 right(1, 0, 0);
D3DXVECTOR3 up(0, 1, 0);
D3DXMatrixLookAtLH(&view, &position, &(position + forward), &up);
}
void Context::Render()
{
viewport->RSSetViewport();
}
D3DXMATRIX Context::Projection()
{
D3DXMATRIX projection;
perspective->GetMatrix(&projection);
return projection;
}
실행
vertexCount = (width + 1) * (height + 1); 부분에서 각각 +1씩 하는 이유는
10 * 10 Grid를 그려본다고 치면 아래 그림에 있는 노랑색 동그라미의 갯수를 새면 11개의 정점이 필요함
'DirectX > DirectX 3D_(구)' 카테고리의 다른 글
08_Cube (0) | 2021.06.30 |
---|---|
07_Camera (0) | 2021.06.30 |
05_Index (0) | 2021.06.30 |
04_World (0) | 2021.06.28 |
03_Triangle, Rect (0) | 2021.06.28 |