OpenTK以2的幂位图纹理将文本写入屏幕

本文关键字:文本 屏幕 纹理 位图 OpenTK | 更新日期: 2023-09-27 18:16:29

我遇到了一个问题,我是一个幸运的人,需要一个2的幂(POT)纹理,似乎不能使用npot。

通常,这不会打扰我太多,因为我只是确保我需要使用的任何纹理都是POTs。但是,我遇到了一个问题,试图将光标的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。宽度"answers"text_bmp1。高度"我得到的只是一个白盒子。(要纹理化的对象)。我想这是因为我的大麻问题。如果我使用POT的宽度和高度(512,1024等)纹理渲染,但a)它不是我想要显示的字符串,B)它在几次渲染后被损坏,然后最终空白,C)渲染的纹理没有裁剪并且拉伸得非常奇怪。

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

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

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

OpenTK以2的幂位图纹理将文本写入屏幕

GL。TexImage2D破坏当前绑定的纹理,并以您指定的大小重新创建它。你想做的是使用GL.TexImage2D一次,当你创建POT纹理,并使用GL.TexSubImage2D来更新它的特定部分。

当你在屏幕上渲染这个纹理时,指定对应于你更新的特定部分的texcoord,即不要从(0,0)渲染到(1,1),而是从(0,0)渲染到(text_width/pot_width, text_height/pot_height)。这样,您可以忽略填充并避免拉伸纹理。

在任何情况下,一定要检查QuickFont (http://www.opentk.com/project/QuickFont),它允许您直接呈现文本,而无需进入肮脏的细节。