쉐이더 컴파일도 했고, 이제 렌더링만 해주면 된다.
void EngineBase::Render()
{
float clearColor[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
Context->ClearRenderTargetView(RenderTargetView.Get(), clearColor);
Context->ClearDepthStencilView(DepthStencilView.Get(),
D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
Context->OMSetRenderTargets(1, RenderTargetView.GetAddressOf(), DepthStencilView.Get());
Context->OMSetDepthStencilState(DepthStencilState.Get(), 0);
Context->RSSetState(RasterizerState.Get());
for (std::shared_ptr<RenderBase> Renderer : Renderers)
{
Renderer->Render();
}
SwapChain->Present(1, 0);
}
EngineBase에 Render함수를 만들어서 위와 같이 정의해주었다.
렌더타겟뷰를 초기화하면서 초록색으로 초기화해주었다. 그려지지 않은 부분을 좀 명확히 알기 위해서다.
뎁스스텐실 뷰도 지워주었다.
얘네는 매 프레임 새로 사용해야하기때문에, 렌더링 시작 전에 한 번씩 지워주어야 한다.
다음은 렌더타겟을 세팅해주었다.
실제론 여러개의 렌더타겟을 바꿔가며 세팅하겠지만, 일단은 렌더타겟이 백버퍼 하나뿐이라고 가정하고
백버퍼의 렌더타겟으로 세팅해주었다.
뎁스스텐실스테이트와 레스터라이저스테이트도 세팅해준다음 렌더링 해주었다.
void BoxRenderer::Render()
{
UINT Stride = sizeof(Vertex);
UINT Offset = 0;
VertexShaderData VSData = EngineBase::GetInstance().GetVertexShaderData(L"VertexTest.hlsl");
Microsoft::WRL::ComPtr<ID3D11PixelShader> PS = EngineBase::GetInstance().GetPixelShaderData(L"PixelTest.hlsl");
EngineBase::GetInstance().GetContext()->IASetVertexBuffers(0, 1, VertexBuffer.GetAddressOf(), &Stride, &Offset);
EngineBase::GetInstance().GetContext()->IASetIndexBuffer(IndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0);
EngineBase::GetInstance().GetContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
EngineBase::GetInstance().GetContext()->VSSetShader(VSData.VertexShader.Get(), 0, 0);
EngineBase::GetInstance().GetContext()->IASetInputLayout(VSData.InputLayout.Get());
EngineBase::GetInstance().GetContext()->VSSetConstantBuffers(0, 1, ConstantBuffer.GetAddressOf());
EngineBase::GetInstance().GetContext()->PSSetShader(PS.Get(), 0, 0);
UINT IndexCount = Indices.size();
EngineBase::GetInstance().GetContext()->DrawIndexed(IndexCount, 0, 0);
}
다음은 렌더러의 Render함수이다.
먼저, EngineBase가 가지고 있는 자료구조에서 쉐이더를 찾아온 뒤, 해당 쉐이더로 세팅해주었다.
원래는 렌더러마다 쉐이더의 이름을 저장한 뒤, 그 이름에 맞는 쉐이더를 탐색하게 할 생각이었으나 아직은 테스트중이라 일단 리터럴로 쉐이더 이름을 대입하였다.
쉐이더와 함께 인풋 레이아웃, 버텍스버퍼, 인덱스버퍼, 상수버퍼도 세팅을 해준 뒤, DrawIndexed를 호출해주면 끝이다.
처음엔 화면에 계속 아무것도 안떠서 왜안뜨지..하고 고민하다가 비주얼 스튜디오의 그래픽 디버깅을 사용해봤는데, 프레임 캡쳐가 안되는 걸 보고 설마...스왑체인의 present를 호출안해줬나? 하고 봤더니 역시나 호출을 안하고 있었고, 호출을 해주었더니 잘 작동이 되었다.
아래는 결과이다.
아직 정육면체 하나 띄우는게 고작이지만, 이제 시작이다!
여기다 많은 걸 그리고 배워보자!
'프로젝트 > Direct X 그래픽스' 카테고리의 다른 글
프로젝트 : DirectX를 활용한 그래픽스 (9 - 상수버퍼 구조 변경) (0) | 2024.05.06 |
---|---|
프로젝트 : DirectX를 활용한 그래픽스 (8 - 텍스쳐 좌표 추가) (0) | 2024.05.04 |
프로젝트 : DirectX를 활용한 그래픽스 (6 - 버텍스 쉐이더, 인풋 레이아웃, 픽셀 쉐이더) (1) | 2024.05.01 |
프로젝트 : DirectX를 활용한 그래픽스 (5 - 상수 버퍼) (0) | 2024.05.01 |
프로젝트 : DirectX를 활용한 그래픽스(4 - 릭 제거) (0) | 2024.05.01 |