Monday, May 20, 2019

xna - Text on a model


I am trying to put some text on a Model and I want it to be dynamic. Did some research and came up with drawing the text on the texture and then set it on the model. I use something like this:


public static Texture2D SpriteFontTextToTexture(SpriteFont font, string text, Color backgroundColor, Color textColor)

{
Size = font.MeasureString(text);
RenderTarget2D renderTarget = new RenderTarget2D(GraphicsDevice, (int)Size.X, (int)Size.Y);
GraphicsDevice.SetRenderTarget(renderTarget);

GraphicsDevice.Clear(Color.Transparent);

Spritbatch.Begin();
//have to redo the ColorTexture
Spritbatch.Draw(ColorTexture.Create(GraphicsDevice, 1024, 1024, backgroundColor), Vector2.Zero, Color.White);

Spritbatch.DrawString(font, text, Vector2.Zero, textColor);
Spritbatch.End();

GraphicsDevice.SetRenderTarget(null);

return renderTarget;
}

When I was working with primitives and not models everything worked fine because I set the texture exactly where I wanted but with the model (RoundedRect 3D button). It now looks like that:


Text on a cube



Is there a way to have the text centered only on one side?



Answer



You need to modify your model so that the UV (texture) coordinates place the texture at the correct location.




It's possible that setting the texture address mode to clamp may (sort-of) solve your issue. But this also depends on your model having the correct UV coordinates to make it work.


GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp;

(The default mode is wrap, which will cause texture coordinates outside the range of 0..1 to wrap around when addressing the texture. Clamp will duplicate the edge pixels outwards, outside that range.)


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...