더보기
bool DrawTestTriangle()
{
namespace wrl = Microsoft::WRL;
HRESULT hr = S_OK;
struct Vertex
{
struct {
float x;
float y;
}pos;
struct {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
}color;
};
const Vertex vertices[] =
{
{ 0.0f,0.5f,255.0,0,0 },
{ 0.5f,-0.5f,0,255.0,0 },
{ -0.5f,-0.5f,0,0,255,0 },
{ -0.3f,0.3f, 0,255,0,0 },
{ 0.3f,0.3f,0,0,255,0 },
{ 0.0f,-0.8f,255,0,0,0 },
};
wrl::ComPtr<ID3D11Buffer> pVertexBuffer;
D3D11_BUFFER_DESC bd;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.Usage = D3D11_USAGE_DEFAULT;
bd.CPUAccessFlags = 0u;
bd.MiscFlags = 0u;
bd.ByteWidth = sizeof(vertices);
bd.StructureByteStride = sizeof(Vertex);
D3D11_SUBRESOURCE_DATA sd;
ZeroMemory(&sd,sizeof(D3D11_SUBRESOURCE_DATA));
sd.pSysMem = vertices;
hr=g_pd3dDevice->CreateBuffer(&bd, &sd, pVertexBuffer.GetAddressOf());
if (FAILED(hr)) return false;
const UINT stride = sizeof(Vertex);
const UINT offset = 0u;
//배열이 들어갈수있다.
m_pImmediateContext->IASetVertexBuffers(0u, 1u, pVertexBuffer.GetAddressOf(), &stride, &offset);
const unsigned short indices[] =
{
0,1,2,
0,2,3,
0,4,1,
2,1,5,
};
wrl::ComPtr<ID3D11Buffer>pIndexBuffer;
D3D11_BUFFER_DESC ibd = {};
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.Usage = D3D11_USAGE_DEFAULT;
ibd.CPUAccessFlags = 0u;
ibd.MiscFlags = 0u;
ibd.ByteWidth = sizeof(indices);
ibd.StructureByteStride = sizeof(unsigned short);
D3D11_SUBRESOURCE_DATA isd;
isd.pSysMem = indices;
hr = g_pd3dDevice->CreateBuffer(&ibd, &isd, pIndexBuffer.GetAddressOf());
if (FAILED(hr)) return false;
m_pImmediateContext->IASetIndexBuffer(pIndexBuffer.Get(),DXGI_FORMAT_R16_UINT,0);
wrl::ComPtr<ID3DBlob> pBlob;
//1. 픽셀 셰이더 생성
wrl::ComPtr<ID3D11PixelShader> pPixelShader;
hr=D3DReadFileToBlob(L"PixelShader.cso", pBlob.GetAddressOf());
if (FAILED(hr)) return false;
hr = g_pd3dDevice->CreatePixelShader(pBlob->GetBufferPointer(),
pBlob->GetBufferSize(), nullptr, pPixelShader.GetAddressOf());
if (FAILED(hr)) return false;
//2. 바인드 픽셀 셰이더
m_pImmediateContext->PSSetShader(pPixelShader.Get(), nullptr, 0u);
//3. 버텍스 셰이더 생성
wrl::ComPtr<ID3D11VertexShader> pVertexShader;
hr=D3DReadFileToBlob(L"VertexShader.cso", pBlob.GetAddressOf());
if (FAILED(hr)) return false;
hr = g_pd3dDevice->CreateVertexShader(pBlob->GetBufferPointer(),
pBlob->GetBufferSize(), nullptr, pVertexShader.GetAddressOf());
if (FAILED(hr)) return false;
//4. 바인드 버텍스 셰이더
m_pImmediateContext->VSSetShader(pVertexShader.Get(), nullptr, 0u);
//5. Input 버텍스 레이아웃 (2D 위치만)
wrl::ComPtr<ID3D11InputLayout> pInputLayout;
const D3D11_INPUT_ELEMENT_DESC layout[] =
{
{"POSITION",0,DXGI_FORMAT_R32G32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR",0,DXGI_FORMAT_R8G8B8A8_UNORM,0,8,D3D11_INPUT_PER_VERTEX_DATA, 0}
};
hr = g_pd3dDevice->CreateInputLayout(layout, _countof(layout),
pBlob->GetBufferPointer(),
pBlob->GetBufferSize(),
pInputLayout.GetAddressOf()
);
if (FAILED(hr)) return false;
//6. 바인드 버텍스 레이아웃
m_pImmediateContext->IASetInputLayout(pInputLayout.Get());
m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_pImmediateContext->DrawIndexed((UINT)(std::size(indices)),0u,0u);
return true;
};
//vs
struct VS_OUTPUT
{
float3 color : Color;
float4 pos : SV_Position; //no user set name
};
VS_OUTPUT main(float2 pos : POSITION, float3 color : Color)
{
VS_OUTPUT Output;
Output.pos = float4(pos.x, pos.y, 0.0f, 1.0f);;
Output.color = color;
return Output;
}
//ps
struct PS_INPUT
{
};
float4 main(float3 color : Color) : SV_Target
{
return float4(color,1.0f);
}
버텍스버퍼,인덱스 버퍼을 생성, 바인드->
PS, VS 셰이더 생성, 바인드-> 버텍스 레이아웃 생성 바인드
인덱스로 Draw 하기까지의 과정이다.
다렉을 사용해 한 함수로만 삼각형을 뿌리는 걸 만들어봤다.
전체적인 흐름을 읽기에 편하기 때문이다.
덕분에 애매하게 넘어갔던 것들을 이해할수 있었다.
특히, ID3D11InputLayout, 시멘틱스와 버텍스 셰이더의 입력셰이더
시멘틱스를 비교함으로 데이터를 타당한지 검증하는 작업이나
셰이더에서 전역변수로 사용하기 위해 상수버퍼가 필요하는것 등 이해하게 되었다.
'STUDY > DirectX11' 카테고리의 다른 글
DirectX11 3D - IMGUI 컨텐츠 제작 도구 및 시각화 / 디버그 도구 적용 (0) | 2021.12.30 |
---|---|
DirectX 11 3D - ZBuffer 깊이 스텐실 버퍼 (DepthStencilBuffer) & 박스 렌더링 (0) | 2021.12.28 |
DirectX11 3D - COM 객체를 위한 스마트 포인터 ComPtr (0) | 2021.12.28 |
윈도우 메세지 종류들 List of Window Messages , 창의 이름 바꾸기(SetWindowText()) (0) | 2021.12.27 |
DirectX11 3D - 게임엔진 정적 동적 LOD(Level of Detail), 쿼드트리 (0) | 2021.12.24 |