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
これは、モデルのトップダウン ビューです。