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)