1

XNA/D3D (DX11) でビリヤード ボールのレンダリングをいじっています。VisualStudio2012 で生成した球体 FBX にビリヤード テクスチャをマップするために、HLSL で SamplerState を使用する Blinn-Phone シェーダーを作成しました。

私が抱えている問題は 2 つあります。どちらも下の写真の一番右のボールに見られます。

1) 球体の下にあるポリゴンがどこにあるかをテクスチャが明らかにしていることがわかります。
2) ストライプの下にわずかに白い部分が見える 3 番目の線の下端では、非常にエイリアシングまたはギザギザに見えます。

頂点法線間の補間は、私ではなくパイプライン内で行われるため、テクスチャ アプリケーションは私の制御を大幅に超えているようです。

では、どうすればこれを改善できますか?より多くのポリゴンで新しい球を生成しますか?

アンチエイリアシングのために次のことを行いましたが、率直に言って、ほとんど効果がないように見えました。

        graphics.PreferMultiSampling = true;
        graphics.ApplyChanges();
        GraphicsDevice.PresentationParameters.MultiSampleCount = 4;

これが私のテクスチャ マップの状態です。どんなアイデアでも大歓迎です。さらに情報が必要な場合は、お知らせください。

sampler2D ColorSampler = sampler_state {
    Texture = <ColorTexture>;
    FILTER = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

レンダリングされたビリヤード ボール

4

3 に答える 3

1

Rahulの答えを補完するために、より複雑な3番目のオプションがあります(ただし、ポリゴンの数を増やすことを間違いなく選択します):シェーダーを使用していると述べました-ピクセルシェーダーについて話していると仮定します. この問題は、テクスチャ座標がピクセル シェーダーの三角形内で線形補間されるために発生します。しかし、球体を扱っていることがわかっているため、ピクセル シェーダーでピクセルごとの UV 座標を手動で計算することが可能になります (標準の acos( z) および atan(y/x) 式 (x,y,z) 点は、オブジェクト座標でラスタ化された現在の点です)。

これを使用すると、非常に粗くテッセレートされた球を使用しても、比較的滑らかなテクスチャを取得できるはずです。

編集:手元にスニペットはありませんが、ここに疑似コードがあります:

頂点シェーダー:
- 現在の頂点の初期座標を取得し (マトリックス変換なし; 球の頂点は原点を中心にしていると仮定します)、ピクセル シェーダーに として直接渡しますvarying vec3 P

ピクセル シェーダー:
- r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z)
- theta = acos(P.z/r)
- phi = atan2(P.y/r, P.x/r)
- u = theta*2/pi ; v = phi/(2*pi)+0.5
- 上記の (u,v) を使用して、tex2D() でテクスチャをサンプリングします。

これらの UV 座標が実際にテクスチャの生成方法に対応していることを確認する必要がありますが、そうであれば、ほとんど歪みのないマッピングが得られるはずです。

于 2013-03-20T21:20:24.593 に答える
1

いくつかのオプションがあります。

  1. より細かくテセレートします。あなたが見ているのは、区分平面ジオメトリを介して球を近似する際のエラーであり、球を見えにくくする1つの方法は、それをより小さな部分に分割することです.

  2. テクスチャをフィルタリングして、青から白への移行がよりシャープにならないようにします (ガウスぼかしを適用し、ぼかした画像をテクスチャとして使用します)。

于 2013-03-19T03:29:20.937 に答える
0

これを解決するために、VS2012 の組み込みモデル ビルダーの代わりに 3DSMax を使用しました。球のスケールを 2 インチに設定し、セグメント数を 64 に増やしました。

最終的には、はるかに優れていることがわかります。

ここに画像の説明を入力

于 2013-03-19T22:30:17.700 に答える