Skip to main content
GameDev.net gamedev.net
🔒 Locked

XNA, I have problems with anti-aliasing

Started by war3cadu12 Nov 4, 2012 at 7:30 PM 4 replies 3.4k views
Original Post
war3cadu12
war3cadu12
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]
phil_t
phil_t
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.
war3cadu12
war3cadu12
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?
war3cadu12
war3cadu12
Well. it works for now

Thank you for help, +1 rep.
war3cadu12
war3cadu12
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.)

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.