在HLSL中通过像素着色器传递颜色

7

我有一个像素着色器,应该只是将输入颜色传递,但实际上我得到的是一个常数结果。我认为我的语法可能有问题。以下是着色器代码:

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;
}

为了测试,我在管线中使用的顶点着色器传递了一个COLOR参数,值为0.5、0.5、0.5。在VisualStudio中逐步执行像素着色器时,输入.input.color具有正确的值,并且这些值被正确地分配给输出.output.color。然而,当渲染时,使用此着色器的顶点全部呈现为黑色。

以下是顶点着色器元素的描述:

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,并取消注释另一个赋值,使用显式值,那么渲染的像素是灰色的(如预期)。

你对我在这里做错了什么有什么想法吗?

我正在使用shader模型4级9_1,禁用优化并启用调试信息。

3个回答

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

你的 input.color 是一个 float4 类型,你正在将它传递到另一个 float4 中,我认为这应该可以工作。

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

这就是你只需简单通过它的所有必要步骤。

 return input.color;

如果您想将颜色更改为红色,则可以像这样执行操作:
input.color = float4(1.0f, 0.0f, 0.0f, 1.0f);
return input.color;

1

*你确定你的顶点在它们应该在的位置吗?你开始让我怀疑我的D3D知识。:P 我认为你的问题是,你只传递了一个颜色,两个着色器都需要一个位置才能工作。 你的PixelShaderInput布局应该是: struct PixelShaderInput { float4 position : SV_POSITION; float3 color : COLOR; };*

*你可以尝试将此作为像素着色器吗?*

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

我已经验证了像素着色器不需要SV_POSITION输入。 - Justin R.
不确定是否是问题,但您可以尝试将像素着色器替换为以下内容:float4 main(float3 color : COLOR) : SV_TARGET { return float4(color, 1.0f); } - Stardidi

0

谢谢Yeti。我在那里使用的float4初始化是直接从VS2012附带的Direct3D示例中获取的。我尝试更改为您提到的初始化,但结果相同。 - Justin R.
我修改了我的代码,使得顶点声明现在使用DXGI_FORMAT_R32G32B32A32_FLOAT作为颜色表示,并且我已经修改了着色器以接收和返回float4而不是float3,但输出没有任何改变。 - Justin R.
float4(float3, 1.0f); 是正确的HSLS语法,但我找不到它的MSDN文档。 - Stardidi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接