我有一个问题,我是需要二次幂 (POT) 纹理并且似乎无法使用 NPOT 的幸运者之一。
通常,这不会让我太烦恼,因为我只会确保我需要使用的任何纹理都是 POT。但是,我在尝试将光标 X 和 Y 位置渲染到屏幕时遇到了问题。
public int LoadHudTextures(int xPos, int yPos, Color color, GLControl context)
{
context.MakeCurrent();
int Text_Texture;
text_bmp1 = new Bitmap(50, 24);
Text_Texture = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, Text_Texture);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
//GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, text_bmp1.Width, text_bmp1.Height, 0,
//OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, 1024, 1024, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
Graphics gfx = Graphics.FromImage(text_bmp1);
gfx.Clear(Color.Transparent);
FontFamily fontfamily = new FontFamily("Arial");
Font font = new Font(fontfamily, 16, FontStyle.Regular,GraphicsUnit.Pixel);
gfx.DrawString("X:" + xPos.ToString() + "\n"
+ "Y:" + yPos.ToString(), font, new SolidBrush(color), new PointF(1.5f, 1.5f));
// Upload the Bitmap to OpenGL.
// Do this only when text changes.
System.Drawing.Imaging.BitmapData data = text_bmp1.LockBits(new Rectangle(0, 0, text_bmp1.Width, text_bmp1.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, 50, 24, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
text_bmp1.UnlockBits(data);
return Text_Texture;
}
这就是问题所在。如果我使用“text_bmp1.Width”和“text_bmp1.Height”,我得到的只是一个白框。(要纹理化的对象)。我认为这是因为我的 POT 问题。如果我使用 POT(512,1024 等)的宽度和高度来渲染纹理,但是 A)它不是我想要显示的字符串,B)它在几次渲染后被损坏,然后最终空白, C) 渲染的纹理没有被裁剪并且被非常奇怪地拉伸。
如果我只更改 TexCoord2(,) X 和 Y 值,C) 可以修复。我想知道是否有办法将文本图像动态填充到下一个 POT 并裁剪掉多余的部分?
为了清楚起见,我正在编写一个环境,它将 HP/GL2 PCL 源代码文件中的项目显示到屏幕上,然后再将其发送到打印机以获取动态药房标签。
如果有人需要更多说明,请告诉我。谢谢你