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

テストのために、0.5、0.5、0.5 の COLOR パラメーターを渡すパイプラインでこれに先行する頂点シェーダーがあります。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 を出力します。少なくともアルファ レイヤーは正しく機能しています。

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

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

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

4

3 に答える 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;
于 2013-03-17T03:03:14.183 に答える
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);
}
于 2013-02-27T16:18:22.460 に答える
0

こんなコンストラクタ見たことない

float4(input.color, 1.0f);

これは問題かもしれませんが、私は間違っている可能性があります。次のように float 値を 1 つずつ渡してみてください。

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

編集:

実際には、COLOR の型として float4 を使用する必要がある場合があります ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb509647(v=vs.85).aspx )

于 2013-02-07T23:05:59.517 に答える