2017-12-12 77 views
2

私は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) 

(または一定のバッファへの転置行列を送る)