4

私が直面している問題は単純ですが、インターネット上のどこにも答えが見つかりません。使用している RenderTarget から取得したソース テクスチャがあり、これをエフェクトに渡します。私のエフェクトには頂点シェーダーとピクセル シェーダーがありますが、重要なのはピクセル シェーダーです。頂点シェーダーが入力頂点に対してまったく何もしないようにします。出力は、画像に対して画像処理 (ぼかしなど) を実行するピクセル シェーダーに渡されます。この結果が画面に描画されます。

基本的には、テクスチャを取り込み、完全に変更せずに渡す頂点シェーダーが必要です。ここで話す 3D ジオメトリはありません。

これを行うために私が書いたコードは次のとおりです。


float4 VSBasic(float4 vin : POSITION) : POSITION
{
    return vin;
}

そして、これが私のピクセルシェーダーで、すべてのピクセルを赤くするはずです:


float4 PS_GaussianBlur(float2 texCoord : TEXCOORD) : COLOR0
{
    float4 color = float4(0.0f, 0.0f, 0.0f, 1.0f);

    //int kernelLength = min(31, kernelRadius * 2 + 1);
    //for (int i = 0; i < kernelLength; i++)
        //color += tex2D(colorMap, texCoord + offsets[i]) * kernel[i];

    color = float4(1.0f, 0.0f, 0.0f, 1.0f);
    return color;
}

なお、ぼかし部分はテスト用にコメントアウトしています。

それで、私は何を間違っていますか??!

PS 頂点シェーダーを使用する唯一の理由は、PS_3_0 と VS_3_0 をコンパイルする必要があるという効果を指定しない限り、競合するピクセル/頂点シェーダー バージョンを使用していると XNA が文句を言うからです (PS_3_0 が必要なため、これは PS_2_0 で動作しています)。頂点シェーダーなし)。そのため、頂点シェーダーを実際に実装せずに頂点シェーダーのバージョンを指定する別の方法がある場合はお知らせください。

編集: 明確にするために、私のソリューションは PS_2_0 でうまく機能しますが、私の意見では、PS_2_0 には十分な定数レジスタがありません。私がやりたいことは、シェーダーを PS_3_0 に拡張して、より多くのレジスターを操作できるようにすることです。ただし、これを行うと、XNA は PS_3_0 が下位の頂点シェーダーと下位互換性がないことを訴えるので、独自の頂点シェーダーを作成する必要がありました。ただし、すべての作業はピクセル シェーダーで行われるため、この頂点シェーダーに何もさせたくありません。これで問題が解決することを願っています。

4

1 に答える 1

2

あなたがどのようにレンダリングしているかを言っていないので、あなたが何を間違っているのかわかりません。を使用していると仮定しますがSpriteBatch、これは座標系の問題です。

XNA Stock Effects のダウンロードSpriteBatchで、内部的に使用するシェーダーを見つけることができます。

射影変換があることに注意してください。SpriteBatchクライアント空間に座標を入力します。ただし、レンダリングは実際にはラスター空間で行われます (射影行列は頂点をこの空間に変換します)。

クライアント スペースは、ビューポートの左上隅の (0,0) から右下隅の (幅,高さ) までです。

投影空間は、ビューポートの左下隅の (-1,-1) から右上隅の (1,1) までです。

通常、フルスクリーン エフェクトの最も簡単な方法は、ラスター空間をカバーする固定クワッドに単純にレンダリングすることです (つまりSpriteBatch、 を使用せず、代わりに頂点バッファーを使用します)。射影行列は必要なく、頂点シェーダーは空にすることができます。

を使用したい場合は、このブログ投稿を読むと役立つ場合がありますSpriteBatch。頂点シェーダーに指定されたコードは実際には間違っていることに注意してください。これには射影変換が含まれていません。

また、シェーダーを通過していないTEXCOORD0(そしておそらく)ことが問題になると思います。COLOR0

于 2012-10-11T05:19:54.510 に答える