2013-02-07 71 views
5

ピクセルシェーダを使用しているだけで、入力カラーを渡す必要がありますが、代わりに一定の結果が得られます。私は私の構文が問題かもしれないと思う。ここでシェーダは:HLSLのピクセルシェーダで色を渡す

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

は試験のために、私は0.5、0.5、0.5の色パラメータを渡すpiplelineでこれを先行する頂点シェーダを有します。 VisualStudioのピクセルシェーダーを実行すると、input.colorは正しい値を持ち、これらはoutput.colorに正しくアサインされています。しかし、レンダー時には、このシェーダを使用する頂点はすべて黒です。私はそれが頂点シェーダは、RGBが同じ出力と色がかかりますが、ピクセルシェーダ出力のRGBAことが重要だかはわからない

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

:ここ

は、頂点シェーダ要素の説明です。アルファ層は少なくとも正しく動作しています。

最初の割り当てをコメントアウトすると、input.colorを使用し、明示的な値で他の割り当てのコメントを解除すると、レンダリングされたピクセルは灰色(期待どおり)になります。

私がここで間違っていることに関するアイデアはありますか?

私は、シェーダーモデル4レベル9_1を使用しています。最適化を無効にし、デバッグ情報を有効にしています。

答えて

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

ご入力。色はの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; 
0

私は、これが問題かもしれませんが、私は間違っている可能性がコンストラクタこの種の

float4(input.color, 1.0f); 

を見たことがありません。このようなもので浮動小数点値1を渡してみてください。

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

編集:

実は

あなたがあなたの頂点であることを確認しています(http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx

+0

ありがとうYeti。私がそこに持っているfloat4の初期化は、VS2012に同梱されているDirect3Dサンプルから直接取ったものです。私はあなたが言及しているものに変更しようとしましたが、同じ結果を得ています。 –

+0

頂点宣言の色がDXGI_FORMAT_R32G32B32A32_FLOATに変更され、浮動小数点数をfloat3ではなくfloat4を返すように変更しましたが、出力に変更はありません。 –

+0

float4(float3、1.0f);正しいHSLS構文ですが、MSDNのドキュメントが見つかりません。 – Stardidi

1

* COLORのための型としてのfloat4使用する必要があります彼らがいるはずの場所で?あなたは私に私のD3Dの知識を疑わせるようになっています。 :P 私はあなたの問題があなただけの色を通過していると信じています。 両方のシェーダの部分が動作するためにポジションが必要です。 PixelShaderInputレイアウトは次のとおりです。 struct PixelShaderInput { float4 position:SV_POSITION; float3色:COLOR; }; *

あなたは多分あなたのピクセルシェーダとしてこれを試みることができる?:

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

私はピクセルシェーダがSV_POSITION入力を必要としないことを確認しました。 –

+0

これは問題ですが、あなたはあなたとシェーダをピクセル・交換試みることができるかどうかわからない: のfloat4メイン(するfloat3色:COLOR):SV_TARGET { \tリターンのfloat4(色、1.0F); } – Stardidi

関連する問題