关于direct3d:通过HLSL中的像素着色器传递颜色

Passing colors through a pixel shader in HLSL

我有一个像素着色器,应该仅将输入颜色传递通过,但是我得到的是恒定的结果。我认为我的语法可能是问题。这是着色器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct PixelShaderInput
{
    float3 color : COLOR;
};

struct PixelShaderOutput
{
    float4 color : SV_TARGET0;
};

PixelShaderOutput main(PixelShaderInput input)
{
    PixelShaderOutput output;
    output.color.rgba = float4(input.color, 1.0f); // input.color is 0.5, 0.5, 0.5; output is black
    // output.color.rgba = float4(0.5f, 0.5f, 0.5f, 1); // output is gray
    return output;
}

为了进行测试,我在pipleline之前的顶点着色器中传递了0.5、0.5、0.5的COLOR参数。在Visual Studio中逐步遍历像素着色器,input.color具有正确的值,并且这些值被正确地赋值为output.color。但是,渲染时,使用此着色器的顶点都是黑色的。

这是顶点着色器元素说明:

1
2
3
4
5
6
const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
{
    {"POSITION",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    {"COLOR",      0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    {"TEXCOORD",   0, DXGI_FORMAT_R32G32_FLOAT,    0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

我不确定顶点着色器采用与RGB输出相同的颜色是否重要,但像素着色器输出RGBA是否重要。 Alpha层至少正常工作。

如果我注释掉第一个分配,即一个使用input.color的分配,并取消注释另一个分配的显式值,则渲染的像素为灰色(如预期的那样)。

对我在这里做错的任何想法吗?

我正在使用着色器模型4级别9_1,其中禁用了优化并启用了调试信息。


1
output.color.rgba = float4(input.color, 1.0f);

您的input.color是float4,并且您将其传递到另一个float4,我认为这应该工作

1
output.color.rgba = float4(input.color.rgb, 1.0f);

这就是您只需简单地通过它的全部

1
 return input.color;

如果您想将颜色更改为红色,请执行以下操作

1
2
input.color = float4(1.0f, 0.0f, 0.0f, 1.0f);
return input.color;

*您确定顶点在应有的位置吗?您开始使我怀疑我的D3D知识。 :P
我相信您的问题是您只传递一种颜色,
着色器的两个部分都需要一个位置才能正常工作。
您的PixelShaderInput布局应为:
结构PixelShaderInput
{
float4位置:SV_POSITION;
float3颜色:COLOR;
}; *

您能否将其用作像素着色器?:

1
2
3
4
float4 main(float3 color : COLOR) : SV_TARGET
{
    return float4(color, 1.0f);
}


我从未见过这种构造函数

1
float4(input.color, 1.0f);

这可能是问题所在,但我可能是错的。尝试像这样一一传递浮点值:

1
float4(input.color[0], input.color[1], input.color[2], 1.0f);

编辑:

实际上,您可能必须将float4用作COLOR的类型(http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb509647(v=vs.85).aspx)