XNA, I have problems with anti-aliasing

Started by
4 comments, last by war3cadu12 11 years, 5 months ago
I was trying make a font system, and I can't fix anti-aliasing, unicode is working.

rqwtmq.png

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]
Advertisement
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.
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?
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.
Well. it works for now :)

Thank you for help, +1 rep.
Well, I have been working on it. Other problem is that I can't make textbox input in Chinese or Japaese, any idea? (All font are working.)

This topic is closed to new replies.

Advertisement