티스토리 뷰

Game/DirectX 11

Renderer (2) - Constant Buffer

newpolaris 2017. 4. 23. 00:45

깔끔하게는 어떻게 하면될까?

Texture 는 간단한 엔진 마다 다르긴 달라도

View는 생성할 수 있는 건 미리 생성해 두고,

필요할 때 막 쓰는 식으로 해두면 크게 문제는 없는 것 같다.

MS의 MiniEngine은 ColorBuffer, Texture 를 분리해두었지만 거의 유사하다

Texture Array, Cube Map으로 인해 코드가 길어지긴 하지만;

Constant Buffer는 엔진마다 서로 다르게 처리한다

이게, Shader Code 를 어떻게 짜느냐도 관계가 있고 심지어 순서와도 관련있기에 골치가 아프다

Luna's Dx11 Sample의 경우 Effect Framework을 쓰는데,

shader의 reflection 기능을 이용하여

shader 마다 buffer를 생성해두고 SetVariable 등이 들어와서 변수가 변했을 경우

Apply 호출시 실제 갱신을 수행한다

Dx12 의 경우 Effect Framework가 사라져서 FrameResource라는 클래스 안에

std::unique_ptr<ConstantBuffer<PassConstants>> PassCB = nullptr;
std::unique_ptr<ConstantBuffer<MaterialConstants>> MaterialCB = nullptr;
std::unique_ptr<ConstantBuffer<ObjectConstants>> ObjectCB = nullptr;

저걸 모아서 관리한다

Dx12의 경우 큰 메모리 하나 잡아서 pointer만 변경할 수 있기에 저렇게 하나만 유지시킨다

    cmdList->SetGraphicsRootDescriptorTable(0, tex);
    cmdList->SetGraphicsRootConstantBufferView(1, objCBAddress);
    cmdList->SetGraphicsRootConstantBufferView(3, matCBAddress);

Dx11도 11.1 인가에 있는 그거 쓰면 된다고 하는 글은 봤는데 아직못해봤다

먼가 확장하기 힘들어서 별로라 생각했다.

근대 마소 MiniEngine 도 이렇게 쓰고 있네;

Context.SetDynamicConstantBufferView(1, sizeof(CurToPrevXForm), &CurToPrevXForm);
Context.SetDynamicConstantBufferView(1, sizeof(PrePassCB), &params);
Context.SetDynamicConstantBufferView(3, sizeof(constants), constants);
Context.SetDynamicConstantBufferView(1, sizeof(SsaoCB), SsaoCB);

검색 결과의 일부분이다

귀찮아서 박아 둔것 같지만,

Shader 코드를 보니 Cbuffer 수 자체가 얼마 없다.

그래서 이렇게 써도 되는 듯

Nvidia VXGI 소스

struct PipelineStageBindings {
  ConstantBufferBinding constantBuffers[MAX_CB_BINDINGS];
}
// per SceneRenderer::RenderSceneCommon update buffer and set
writeConstantBuffer(m_pGlobalCBuffer, &globalConstants, sizeof(globalConstants));
NVRHI::BindConstantBuffer(state.VS, 0, m_pGlobalCBuffer);

INFOMSPGMT 소스

ShaderDX11::m_ShaderParamter

bind 할 리소스 관리

BindPerObjectConstantBuffer( m_Pipeline->GetShader( Shader::VertexShader ) );
m_Pipeline->Bind();

Pass level에서는 아래와 같이

GetShader( Shader::PixelShader )->GetShaderParameterByName( "LightIndexBuffer" ).Set( m_LightParamsCB );

Hieroglyph3는 위와 상당히 비슷한데

이름 위주로 돌아간다

깔끔하게게 레이어 올리다가 망한거 같다

우선, InitializeParameterData 가 Shader 처리전에 되어있고 shader 변수와 이름이 같다면 Data로 초기화 된다.

Shader 생성 후에 한다면 무시된다

그럼 View/World 같은건 어떻게 하는가?

m_pWorldMatrix = GetMatrixParameterRef( std::wstring( L"WorldMatrix" ) );
SetMatrixParameter( m_pViewMatrix, pMatrix );

끝?

객체별로 설정해야 할 값이 있다면, 어떻게 pending 시켜 둘 것인가?

ParameterWriter 라는 넘이 등장한다

pEntity->Parameters.SetVectorParameter( L"gFresnelR0", { 0.001f, 0.001f, 0.001f, 0.f } );
pEntity->Parameters.SetVectorParameter( L"gAmbientLight", { 0.25f, 0.25f, 0.35f, 1.0f } );

Writer라는넘이 위의 View/World에서의 setting을 Render 시 필요할 경우에 해준다

'Game > DirectX 11' 카테고리의 다른 글

Bool HLSL  (0) 2017.05.05
SSAO (1)  (1) 2017.05.05
Renderer (1) - Hierography3  (0) 2017.04.22
ACC (1)  (0) 2017.04.21
PN-Triangle (4)  (0) 2017.04.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크