I was trying make a font system, and I can't fix anti-aliasing, unicode is working.
Here is my code:
[source lang="csharp"]protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.CornflowerBlue);
Font font = new Font("Arial Unicode MS", 32, FontStyle.Bold, GraphicsUnit.Pixel);
Bitmap bitmap = new Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
g.DrawString("anti aliasing, ????", font, new SolidBrush(System.Drawing.Color.White), 0, 0, StringFormat.GenericDefault);
bitmap.Save("buffer");
float offset = font.SizeInPoints /
font.FontFamily.GetEmHeight(font.Style) *
font.FontFamily.GetCellAscent(font.Style);
Texture2D texture;
using (FileStream fileStream = new FileStream("buffer", FileMode.Open))
{
texture = Texture2D.FromStream(GraphicsDevice, fileStream);
}
spriteBatch.Begin();
spriteBatch.Draw(texture, new Microsoft.Xna.Framework.Rectangle(0, 0, texture.Width, texture.Height), Microsoft.Xna.Framework.Color.Black);
spriteBatch.Draw(texture, new Microsoft.Xna.Framework.Rectangle(0, 50, texture.Width, texture.Height), Microsoft.Xna.Framework.Color.Red);
spriteBatch.Draw(texture, new Microsoft.Xna.Framework.Rectangle(0, 100, texture.Width, texture.Height), Microsoft.Xna.Framework.Color.GreenYellow);
spriteBatch.Draw(texture, new Microsoft.Xna.Framework.Rectangle(0, 150, texture.Width, texture.Height), Microsoft.Xna.Framework.Color.Green);
spriteBatch.End();
base.Draw(gameTime);
}[/source]
XNA, I have problems with anti-aliasing
SpriteBatch uses pre-multiplied alpha by default, but textures loaded through Texture2D.FromStream don't have pre-multiplied alpha (unlike ones loaded through the content pipeline).
That may be the cause of your issue. So one fix is to use the SpriteBatch.Begin overload that takes a BlendState, and use BlendState.NonPremultiplied.
That may be the cause of your issue. So one fix is to use the SpriteBatch.Begin overload that takes a BlendState, and use BlendState.NonPremultiplied.
Like that:
[source lang="csharp"]spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied);[/source]
or just
[source lang="csharp"]spriteBatch.Begin(SpriteSortMode.Texture, BlendState.NonPremultiplied);[/source]
Let me know if that is correct?
[source lang="csharp"]spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied);[/source]
or just
[source lang="csharp"]spriteBatch.Begin(SpriteSortMode.Texture, BlendState.NonPremultiplied);[/source]
Let me know if that is correct?
You were using the overload of Begin that took no parameters before - that uses SpriteSortMode.Deferred internally (look at the documentation). So use SpriteSortMode.Deferred.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement