Sign in to follow this  
war3cadu12

XNA, I have problems with anti-aliasing

Recommended Posts

war3cadu12    110
I was trying make a font system, and I can't fix anti-aliasing, unicode is working.

[img]http://i47.tinypic.com/rqwtmq.png[/img]

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]

Share this post


Link to post
Share on other sites
phil_t    8084
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.

Share this post


Link to post
Share on other sites
war3cadu12    110
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? Edited by Cadu

Share this post


Link to post
Share on other sites
phil_t    8084
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. Edited by phil_t

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this