• Advertisement
Sign in to follow this  

XNA, I have problems with anti-aliasing

This topic is 1898 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement