DirectX HLSL-像素着色器中恒定缓冲区为空,但顶点着色器中为空

乔拉·莫蒙特(Jorah Mormont)

我正在DirectX 11项目中实施照明。我遇到的问题是,当我尝试从Pixel Shader函数访问cbuffer值时,它只是返回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);
}

这是我要发送的值(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

我看不出有什么问题。还有其他人有同样的问题吗?

乔拉·莫蒙特(Jorah Mormont)

我发现了问题。原来我的cbuffer的寄存器是错误的,我使用了cb#,而应该使用b#。(我误解了这里写的内容:https : //msdn.microsoft.com/zh-cn/library/windows/desktop/hh447212(v=vs.85 ) .aspx

错误代码:

cbuffer LightBuffer : register(cb2) {

变成:

cbuffer LightBuffer : register(b2) {

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Directx:基于HLSL纹理的高度图。(着色器5.0)

来自分类Dev

DirectX11 HLSL着色器未运行

来自分类Dev

HLSL几何着色器空输出

来自分类Dev

HLSL着色器的优化

来自分类Dev

在顶点着色器中指定3D rendertarget的目标图层?[HLSL]

来自分类Dev

HLSL(计算着色器)中的奇数线程程序

来自分类Dev

DirectX-传递给顶点着色器的顶点的尺寸

来自分类Dev

OpenGL着色器的.HLSL文件

来自分类Dev

C ++中的着色器和Directx11编译

来自分类Dev

OpenGL-从顶点着色器访问缓冲区中的下3个顶点

来自分类Dev

修改 HLSL 着色器以在 Vulkan 中工作,是否必须分离纹理/采样器?

来自分类Dev

HLSL:最终像素颜色与像素着色器的计算返回值不同

来自分类Dev

hlsl CG计算着色器竞态条件

来自分类Dev

从HLSL移植的GLSL着色器不起作用

来自分类Dev

HLSL 将着色器拆分为多个文件

来自分类Dev

在hlsl着色器中设置全局参数的正确方法是什么?

来自分类Dev

如何在visual studio中多次编译hlsl着色器?

来自分类Dev

如何将此HLSL像素着色器校正为四边形的圆角?

来自分类Dev

如何在HLSL着色器中进行自己的深度缓冲?

来自分类Dev

在DirectX 11中将纹理数组发送到着色器

来自分类Dev

DirectX:渲染到Texture2DArray,并在计算着色器中从中加载

来自分类Dev

在DirectX 11中将纹理数组发送到着色器

来自分类Dev

DirectX 11:BOUND着色器资源视图的数量

来自分类Dev

DirectX11:从计算着色器读取模具位

来自分类Dev

编译DirectX11着色器文件

来自分类Dev

编译着色器时出错 - DirectX11

来自分类Dev

在GLSL顶点着色器中,您不仅可以访问顶点缓冲区,还可以访问索引缓冲区中顶点的索引吗?

来自分类Dev

在DirectX11中为动态和静态对象使用单独的顶点缓冲区

来自分类Dev

从HLSL着色器按名称反射纹理寄存器

Related 相关文章

  1. 1

    Directx:基于HLSL纹理的高度图。(着色器5.0)

  2. 2

    DirectX11 HLSL着色器未运行

  3. 3

    HLSL几何着色器空输出

  4. 4

    HLSL着色器的优化

  5. 5

    在顶点着色器中指定3D rendertarget的目标图层?[HLSL]

  6. 6

    HLSL(计算着色器)中的奇数线程程序

  7. 7

    DirectX-传递给顶点着色器的顶点的尺寸

  8. 8

    OpenGL着色器的.HLSL文件

  9. 9

    C ++中的着色器和Directx11编译

  10. 10

    OpenGL-从顶点着色器访问缓冲区中的下3个顶点

  11. 11

    修改 HLSL 着色器以在 Vulkan 中工作,是否必须分离纹理/采样器?

  12. 12

    HLSL:最终像素颜色与像素着色器的计算返回值不同

  13. 13

    hlsl CG计算着色器竞态条件

  14. 14

    从HLSL移植的GLSL着色器不起作用

  15. 15

    HLSL 将着色器拆分为多个文件

  16. 16

    在hlsl着色器中设置全局参数的正确方法是什么?

  17. 17

    如何在visual studio中多次编译hlsl着色器?

  18. 18

    如何将此HLSL像素着色器校正为四边形的圆角?

  19. 19

    如何在HLSL着色器中进行自己的深度缓冲?

  20. 20

    在DirectX 11中将纹理数组发送到着色器

  21. 21

    DirectX:渲染到Texture2DArray,并在计算着色器中从中加载

  22. 22

    在DirectX 11中将纹理数组发送到着色器

  23. 23

    DirectX 11:BOUND着色器资源视图的数量

  24. 24

    DirectX11:从计算着色器读取模具位

  25. 25

    编译DirectX11着色器文件

  26. 26

    编译着色器时出错 - DirectX11

  27. 27

    在GLSL顶点着色器中,您不仅可以访问顶点缓冲区,还可以访问索引缓冲区中顶点的索引吗?

  28. 28

    在DirectX11中为动态和静态对象使用单独的顶点缓冲区

  29. 29

    从HLSL着色器按名称反射纹理寄存器

热门标签

归档