4

Microsoft Web サイトからダウンロードした、WinForms に埋め込まれた XNA を使用しています。そして、モデルが描かれているときはすべて問題ないように見えますが、カメラを回転させるとすぐに、モデルのエッジがギザギザに見えることに気付きました。これが私が話していることの2つの写真です:

これは、カメラがターゲットに近づくほど目立ちます。これを使用して各メッシュを描画しています。

foreach (ModelMesh mesh in model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        effect.View = cam.view;
        effect.Projection = cam.projection;
        effect.World = mesh.ParentBone.Transform;
        effect.EnableDefaultLighting();
    }
    mesh.Draw();
}

また、モデルを回転させると、奇妙な影が現れることがあります。影は「位置」を変えることさえありませんが、まったく同じように描画されたままです。


編集:だから私は少しググったところ、マルチサンプリングを有効にするとギザギザのエッジが取り除かれることがわかった。さて、WinFormsでこれを行う方法を知っている人はいますか?

編集2:バックバッファについては、どこにも設定していないので、本来あるべき姿だと推測しています。これは GraphicsDeviceService.cpp コンストラクターです。

    GraphicsDeviceService(IntPtr windowHandle, int width, int height)
    {
        parameters = new PresentationParameters();

        parameters.BackBufferWidth = Math.Max(width, 1);
        parameters.BackBufferHeight = Math.Max(height, 1);
        parameters.BackBufferFormat = SurfaceFormat.Color;
        parameters.DepthStencilFormat = DepthFormat.Depth24;
        parameters.DeviceWindowHandle = windowHandle;
        parameters.PresentationInterval = PresentInterval.Immediate;
        parameters.IsFullScreen = false;

        graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
                                            GraphicsProfile.Reach,
                                            parameters);
    }

また、reset メソッドはそれに応じて backBuffer を設定します。

編集 3:より大きな数値 に設定しようとしMultiSampleCountましたが、何も役に立ちませんでした。現在、何が起こっているかを示す 2 つの画像があります。まず、ある場所でオブジェクトをインスタンス化してから、カメラを右にだけ動かします。下の図に示すように、オブジェクト全体が伸びてギザギザのエッジになります。これはカメラの動きのコードです:

http://img152.imageshack.us/img152/5204/normalu.png

http://img28.imageshack.us/img28/4434/movedright.png

KeyboardState state = Keyboard.GetState();

Vector3 v;

if (state.IsKeyDown(Keys.Up) || state.IsKeyDown(Keys.W))
    v = new Vector3(0, 0, 1) * moveSpeed;
else if (state.IsKeyDown(Keys.Down) || state.IsKeyDown(Keys.S))
    v = new Vector3(0, 0, -1) * moveSpeed;
else if (state.IsKeyDown(Keys.Left) || state.IsKeyDown(Keys.A))
    v = new Vector3(1, 0, 0) * moveSpeed;
else if (state.IsKeyDown(Keys.Right) || state.IsKeyDown(Keys.D))
    v = new Vector3(-1, 0, 0) * moveSpeed;
else if (state.IsKeyDown(Keys.PageUp))
    v = new Vector3(0, -1, 0) * moveSpeed;
else if (state.IsKeyDown(Keys.PageDown))
    v = new Vector3(0, 1, 0) * moveSpeed;
else
    v = new Vector3(0, 0, 0);

view *= Matrix.CreateTranslation(v);

そして、カメラのビューと投影:

view = Matrix.CreateLookAt(cameraPos, Vector3.Zero, Vector3.Up);
projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), ratio, 0.5f, 50f);

cameraPos はこの場合0,0,10です。

編集: シャドー イング ご覧のとおり、すべてのメッシュを通過する 1 つのシャドウではなく、すべてのメッシュに独自のシャドウがあります。

http://img843.imageshack.us/img843/8263/weirdshadowing.png

これは、モデルのトップダウン ビューです。

4

1 に答える 1

3

WinForms に埋め込まれた XNA のアンチエイリアシング

この質問は、実際にはこの質問の複製です。

ここから XNA/WinForms サンプルをダウンロードします。

GraphicsDeviceServiceクラス ファイルで、コンストラクターに移動します。

GraphicsDeviceService(IntPtr windowHandle, int width, int height)
{
    parameters = new PresentationParameters();

    // Add this line
    // Increase the count to get higher quality anti-aliasing
    parameters.MultiSampleCount = 8;

    // More parameter settings and initialization
    // ...
}

下の画像で違いがわかります。

マルチサンプリングありとなしの比較


古い答え

標準 XNA アプリケーションのアンチエイリアシング

graphics.PreferMultiSampling = true;

このMSDN 記事で説明されているように、バックバッファーのアンチエイリアシングを有効にします。

PreferMultiSamplingプロパティは、GraphicsDeviceManagerクラスのメンバーです。

品質を上げる/下げる

PresentationParameterクラスのMultiSampleCountプロパティを使用して、サンプル数を変更できます。ピクセルあたりのサンプル数が多いほど、アーティファクトが少なくなり、レンダリング時間が長くなります。


マルチサンプリングに関する参考資料


この解決策は、問題の原因がグラフィックス パイプライン、具体的にはラスタライザーにある場合にのみ有効であることに注意してください。

Nico Schertlerが指摘したように、WinForms に埋め込むプロセスで画像の解像度が変更されていないことを確認してください。エッジのステップが正確に 1 ピクセル幅でない場合は、WinForms でのテクスチャの表示に問題があることを強く示しています。

画像から光の設定を推測するのは難しいため、ここで影の問題に対処することはできません。

于 2012-11-18T21:36:28.967 に答える