一連の値をレンダーターゲットにレンダリングするときに問題が発生します。値が、希望する正確な範囲になることはありません。基本的に、フルスクリーンクワッドとピクセルシェーダーを使用してレンダーターゲットテクスチャにレンダリングし、テクスチャー座標をシェーダーでのいくつかの計算の基礎として使用するつもりです。左上隅の(0,0)から右下隅の(1,1)までのクワッド範囲のテクスチャ座標...問題は、補間後、これらの値がピクセルシェーダーに到達しないことです。 。
例: 4x4テクスチャにレンダリングし、この場合のシェーダーは、赤と緑のチャネルでテクスチャ座標(u、v)を出力するだけです。
return float4(texCoord.rg, 0, 1);
そこから取り出したいのは、左上のピクセルがRGB(0,0,0)であり、したがって黒であるテクスチャであり、右上のピクセルがRGB(255,0,0)であり、したがって明るい赤と左下のピクセルはRGB(0,255,0)-明るい緑です。
しかし、代わりに私はこれをここの右側に取得します:
(直線四角形レンダリング、補正なし)
左上のピクセルは黒ですが、他のコーナーでは比較的濃い赤と濃い緑しか表示されません。それらのRGB値は(191,0,0)と(0,191,0)です。私はそれがクワッドのサンプリング位置に関係していると強く思います:左上のピクセルはクワッドの左上隅を正しくサンプリングし、UV座標として(0,0)を取得しますが、他のコーナーのピクセルはクワッドの他のコーナー。左の画像でこれを示しました。四角形を表す青いボックスと、上部のサンプリング座標を表す白いドットです。
これで、Direct3D9で画面揃えのクワッドをレンダリングするときに座標に適用する必要があるハーフピクセルオフセットについて知っています。これからどのような結果が得られるか見てみましょう:
(DX9のハーフピクセルオフセットでレンダリングされたクワッド)
赤と緑が明るくなりましたが、まだ正しくありません。赤または緑のカラーチャネルで取得できる最大値は223です。しかし今、私はもう純粋な黒すら持っていませんが、代わりにRGB(32,32,0)の暗い黄色がかった灰色です!
私が実際に必要とするのは、この種のレンダリングです。
(ターゲットレンダー、縮小されたクワッドサイズ)
最初の図と比較して、クワッドの右と下の境界線を1ピクセル上および左に移動する必要があるようです。次に、右側の列と一番下の行のピクセルはすべて、クワッドの境界から正しくUV座標を取得します。
VertexPositionTexture[] quad = new VertexPositionTexture[]
{
new VertexPositionTexture(new Vector3(-1.0f, 1.0f, 1f), new Vector2(0,0)),
new VertexPositionTexture(new Vector3(1.0f - pixelSize.X, 1.0f, 1f), new Vector2(1,0)),
new VertexPositionTexture(new Vector3(-1.0f, -1.0f + pixelSize.Y, 1f), new Vector2(0,1)),
new VertexPositionTexture(new Vector3(1.0f - pixelSize.X, -1.0f + pixelSize.Y, 1f), new Vector2(1,1)),
};
しかし、これはうまくいかず、下と右のピクセルがまったくレンダリングされませんでした。これらのピクセルの中心はクワッドで覆われていないため、シェーダーで処理されないと思います。pixelSizeの計算を少しだけ変更して、クワッドを少し大きくすると、少なくとも4x4のテクスチャでは機能します。小さなテクスチャでは機能せず、大きなテクスチャでもuv値の均一な分布を微妙に歪めるのではないかと心配しています。
Vector2 pixelSize = new Vector2((2f / textureWidth) - 0.001f, (2f / textureHeight) - 0.001f);
(pixelSizeの計算を0.001fで変更しました。たとえば、1Dルックアップテーブルなどの小さなテクスチャの場合、これは機能せず、0.01f以上に大きくする必要があります)
もちろん、これは簡単な例であり、CPUでUVをピクセルの中心にマッピングすることを心配する必要なく、はるかに簡単にこの計算を行うことができます...それでも、完全に完全な[0、 1] rendertargetの範囲をピクセルに!?