gpt4 book ai didi

c# - OpenTK 使用二次幂位图纹理将文本写入屏幕

转载 作者:行者123 更新时间:2023-12-03 13:21:26 30 4
gpt4 key购买 nike

我有一个问题,我是需要二次幂 (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) 渲染的纹理没有被裁剪并且被非常奇怪地拉伸(stretch)。

如果我只更改 TexCoord2(,) X 和 Y 值,C) 可以修复。 我想知道是否有办法将文本图像动态填充到下一个 POT 并裁剪掉多余的部分?

为了清楚起见,我正在编写一个环境,它将 HP/GL2 PCL 源代码文件中的项目显示到屏幕上,然后再将其发送到打印机以获取动态药房标签。

如果有人需要更多说明,请告诉我。谢谢你

最佳答案

GL.TexImage2D 破坏当前绑定(bind)的纹理并使用您指定的大小重新创建它。您要做的是在创建 POT 纹理时使用 GL.TexImage2D 一次,然后使用 GL.TexSubImage2D 更新它的特定部分。

当您在屏幕上渲染此纹理时,请指定与您更新的特定部分相对应的 texcoords,即不要从 (0,0) 渲染到 (1,1) 而是从 (0,0) 渲染到 (text_width/pot_width, text_height/锅高)。这样,您可以忽略填充并避免拉伸(stretch)纹理。

在任何情况下,请查看 QuickFont (http://www.opentk.com/project/QuickFont),它允许您直接渲染文本而无需进入肮脏的细节。

关于c# - OpenTK 使用二次幂位图纹理将文本写入屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8331737/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com