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

时间:2013-02-07 21:02:52

标签: direct3d hlsl pixel-shader

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

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中有一个顶点着色器,它传递的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的那个赋值,并使用显式值取消注释另一个赋值,则渲染的像素为灰色(如预期的那样)。

关于我在这里做错了什么的想法?

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

3 个答案:

答案 0 :(得分:3)

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 :(得分: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);
}

答案 2 :(得分:0)

我从未见过这种构造函数

float4(input.color, 1.0f);

这可能是问题,但我可能是错的。尝试逐个传递浮点值,如下所示:

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

编辑:

实际上你可能必须使用float4作为COLOR(http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx

的类型