我有一个像素着色器应该只是通过输入颜色,但我得到一个恒定的结果。我认为我的语法可能是问题所在。这是着色器:
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,禁用了优化并启用了调试信息。
答案 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)
的类型