2017-12-12 31 views
2

두 개의 별개 셰이더 (PS와 VS가 별개의 파일 임)가 있으며 둘 다 정확히 동일한 상수 버퍼를 사용해야합니다. 그들은이 상수 버퍼를 공유합니까? 또는 코드가 두 배가됩니까?별개의 셰이더에 동일한 상수 버퍼를 사용하십시오.

효과를 사용하지 않으므로 런타임 대신 빌드 타임에 쉐이더를 컴파일하려면 PS 및 VS 쉐이더를 다른 파일에서 별도로 컴파일해야합니다 (CompileFromFile은 그렇지 않습니다).

VertexShader :

여기 내 접근 방식은 분명히 나에게 실수를 렌더링주는, 지금의

cbuffer cbPerObject : register(b0) 
{ 
    float4x4 gWorld; 
    float4x4 gWorldInvTranspose; 
    float4x4 gWorldViewProj; 
    Material gMaterial; 
}; 

PixelShader :

cbuffer cbPerObject : register(b0) 
{ 
    float4x4 gWorld; 
    float4x4 gWorldInvTranspose; 
    float4x4 gWorldViewProj; 
    Material gMaterial; 
}; 

cbuffer cbPerFrame : register(b1) 
{ 
    DirectionalLight gDirLight; 
    PointLight gPointLight; 
    SpotLight gSpotLight; 
    float3 gEyePosW; 
}; 

나는에 일정한 버퍼를 설정하는 방법 내 렌더링() 메서드 (하나의 객체가 있으므로 perObj와 perFrame 버퍼는 같은 방식으로 설정됩니다) :

m_d3dContext->VSSetConstantBuffers(0, 1, m_cBuffer_perObject.GetAddressOf()); 
m_d3dContext->PSSetConstantBuffers(0, 1, m_cBuffer_perObject.GetAddressOf()); 
m_d3dContext->PSSetConstantBuffers(1, 1, m_cBuffer_perFrame.GetAddressOf()); 

그럼 어떻게되지 않나요? 간단한 큐브 메쉬가 있습니다. 나는 성공적 vertexPos + vertexColour 입력 레이아웃 큐브를 렌더링하고 이번에는 내가 매우 큰 렌더링 뭔가를 내가 대신 내 큐브의 결과 + vertexNormal

{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } 

vertexPos 새로운 입력 레이아웃을 amde 때문에 일부 조명 수식을 추가하려고 (저울은 카메라와 마찬가지로 다시 문제가되지 않기 때문에 같은 블렌드에 동일한 스케일과 카메라를 사용하여 색상 혼합 및 조명 수식을 책에서 가져 와서 실수를 유발할 수는 없습니다.)

+1

방법입니다 재료, DirectionalLight, PointLight 및 SpotLight가 정의 되었습니까? 어쩌면 정렬 문제가있을 수 있습니다. – VuVirt

+0

@VuVirt 정렬이 고려되며 적절한 정렬을 위해 패딩이 사용됩니다. 또한 작은 테스트를했는데 색상이 제대로 표시되는 것 같습니다. –

답변

0

제대로 작동 함 : hlsl과 C++ 사이의 차이점을 고려하는 것을 잊어 버렸습니다. 사람이 솔루션에 관심이 있다면, 내 HLSL 코드이 하나의 프리 프로세서 명령을 추가했다 :

#pragma pack_matrix(row_major) 

(또는 상수 버퍼 전치 행렬을 보내)