2015-02-16 4 views
1

Я занимаюсь реализацией освещения в своем проекте DirectX 11. Проблема заключается в том, что когда я пытаюсь получить доступ к значению cbuffer из функции Pixel Shader, он просто возвращает float3 (0, 0, 0), а когда я обращаюсь к тому же значению в функции Vertex Shader, он возвращает правильное значение. Вот шейдер:DirectX HLSL - Постоянный буфер пуст в пиксельном шейдере, но не 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); 
} 

Вот это значение я посылаю (C++):

_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

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

ответ

2

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

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

cbuffer LightBuffer : register(cb2) { 

Изменен:

cbuffer LightBuffer : register(b2) { 

 Смежные вопросы

  • Нет связанных вопросов^_^