DirectX HLSL — буфер констант пуст в пиксельном шейдере, но не в вершинном шейдере

Я занимаюсь реализацией освещения в своем проекте DirectX 11. Моя проблема заключается в том, что когда я пытаюсь получить доступ к значению cbuffer из функции Pixel Shader, он просто возвращает float3 (0, 0, 0), а когда я обращаюсь к тому же значению в функции Vertex Shader, он возвращает правильное значение. Вот шейдер:

/*********************************************\
                 VERTEX SHADER
\*********************************************/

//Constant buffers
cbuffer Object : register(cb0) {
    float4x4 WorldMatrix;
};
cbuffer Camera : register(cb1) {
    float4x4 ViewMatrix;
    float4x4 ProjectionMatrix;
};
cbuffer LightBuffer : register(cb2) {
    float3 AmbientColor;
}


//IO Structs
struct VS_INPUT {
    float3 Position : POSITION;
    float2 UV : TEXCOORD;
    float3 Normal : NORMAL;
};
struct VS_OUTPUT {
    float4 Position : SV_POSITION;
    float2 UV : TEXCOORD;
    float3 Normal : NORMAL;
};

VS_OUTPUT VS(VS_INPUT input){
    VS_OUTPUT output;

    float4 Position;

    //Multiply position with AmbientColor (should be 1, 1, 1), position unchanged
    Position = mul(ViewMatrix, float4(input.Position * AmbientColor, 1));
    Position = mul(ProjectionMatrix, Position);
    Position = mul(WorldMatrix, Position);

    output.Position = Position;
    output.UV = input.UV;
    output.Normal = mul(WorldMatrix, input.Normal);
    return output;
}

/*********************************************\
                PIXEL SHADER
\*********************************************/

SamplerState TextureState;
Texture2D<float4> Texture;
float4 PS(VS_OUTPUT input) : SV_TARGET {
    float4 MaterialColor = Texture.Sample(TextureState, input.UV);

    //Multiply color with AmbientColor (should be 1, 1, 1), returns black
    float3 FinalColor = MaterialColor.xyz * AmbientColor;

    return float4(FinalColor, MaterialColor.a);
}

Вот значение, которое я отправляю (С++):

_LightsUniform.AmbientColor = XMFLOAT3(1, 1, 1); 
DeviceContext->UpdateSubresource(_LightBuffer, 0, NULL, &_LightsUniform, 0, 0);
DeviceContext->VSSetConstantBuffers(2, 1, &_LightBuffer);
DeviceContext->PSSetConstantBuffers(2, 1, &_LightBuffer);

Вот результат: http://i.gyazo.com/357f1ed3ea33e6569ad2346b368cd975.png

И результат без умножения цвета: http://gyazo.com/b60b385daa94d3373e9552a523928e3f

Я не вижу, что не так. У кого-нибудь еще была такая же проблема?


person Jorah Mormont    schedule 16.02.2015    source источник


Ответы (1)


Я нашел проблему. Оказалось, что регистры для моего cbuffer(s) были неправильными, я использовал cb# вместо b#. (Я неправильно понял то, что было написано здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/hh447212(v=vs.85).aspx)

Неправильный код:

cbuffer LightBuffer : register(cb2) {

Изменился на:

cbuffer LightBuffer : register(b2) {
person Jorah Mormont    schedule 17.02.2015
comment
В документах об этом ничего не написано, не понятно зачем использовать синтаксис b#. - person Ray Garner; 14.06.2018