3D モデルを rendertarget2D にレンダリングしてから、スプライト バッチを使用して画面に描画します。次の行を使用して、コンストラクターでアンチエイリアシングを有効にしました。
graphics.PreferMultiSampling = true;
モデルをバックバッファに直接レンダリングすると、アンチエイリアシングが期待どおりに機能しました。rendertarget2D にレンダリングするようになったので、アンチエイリアシングが機能しなくなり、エッジがぎざぎざになります。(rendertarget2D のサイズ変更や回転は行っていません。)
この謎を説明してもらえますか?
コード:
public MyGame()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.PreferredBackBufferHeight = 720;
graphics.PreferredBackBufferWidth = 1208;
graphics.PreparingDeviceSettings += setBackbufferPreserveContents;
graphics.PreferMultiSampling = true;
this.IsMouseVisible = true;
this.Window.Title = "MyGame";
graphics.ApplyChanges();
}
public void setBackbufferPreserveContents(object sender, PreparingDeviceSettingsEventArgs e)
{
e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents;
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.SetRenderTarget(BoardScreen);
GraphicsDevice.Clear(Color.Transparent);
Board.DrawMe(cam);
GraphicsDevice.SetRenderTarget(null);
GraphicsDevice.Clear(Color.CornflowerBlue);
sb.Begin();
sb.Draw((Texture2D)BoardScreen, new Rectangle(0, 0, 720, 720), Color.White);
sb.End();
base.Draw(gameTime);
}
Board は DrawableModel クラスであり、モデルと、モデルを画面に単純に描画するメソッド DrawMe(Camera camera) を含みます。Camera は、射影行列とビュー行列、カメラの位置とターゲット位置を含む単純なクラスです。
アップデート:
DrawMe メソッドの機能は次のとおりです。
public void DrawMe(Camera camera)
{
foreach (ModelMesh mesh in ModelToDraw.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
effect.World = Matrix.CreateTranslation(Translation);
effect.Projection = camera.Projection;
effect.View = camera.View;
}
mesh.Draw();
}
}
更新 2:
メインの XNA ファイルの残りの関数は次のとおりです (Update と UnloadContent はまだ変更されていません)。
protected override void Initialize()
{
BoardScreen = new RenderTarget2D(graphics.GraphicsDevice, 720, 720);
base.Initialize();
}
protected override void LoadContent()
{
sb = new SpriteBatch(GraphicsDevice);
Board = new DrawableModel(Content.Load<Model>("Models/Board"), Vector3.Zero, Vector3.Zero, Vector3.One);
}