C# OpenTK使用两个位图纹理的强大功能将文本写入屏幕

C# OpenTK使用两个位图纹理的强大功能将文本写入屏幕,c#,.net,multithreading,opentk,C#,.net,Multithreading,Opentk,我遇到了一个问题,我是幸运的人之一,需要二次幂(POT)纹理,似乎不能使用npot 通常情况下,这不会让我太烦恼,因为我会确保我需要使用的任何纹理都是罐。但是,我在尝试将光标的X和Y位置渲染到屏幕时遇到了一个问题 public int LoadHudTextures(int xPos, int yPos, Color color, GLControl context) { context.MakeCurrent(); int Text_T

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

通常情况下,这不会让我太烦恼,因为我会确保我需要使用的任何纹理都是罐。但是,我在尝试将光标的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”,我得到的只是一个白色框。(要进行纹理处理的对象)。我想这是因为我的大麻问题。如果我使用一个罐子的宽度和高度(5121024,等等…)一个纹理渲染,但是a)它不是我想要显示的字符串,B)它在几次渲染后被破坏,然后最终消失,C)渲染的纹理没有被裁剪,而且拉伸得非常奇怪

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

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


如果有人需要更多的澄清,请让我知道。谢谢

GL.TexImage2D将销毁当前绑定的纹理,并按指定的大小重新创建它。您希望做的是在创建盆纹理时使用GL.TexImage2D一次,然后使用GL.TexSubImage2D更新其特定部分

在屏幕上渲染此纹理时,指定与更新的特定部分相对应的纹理坐标,即不从(0,0)渲染到(1,1),而是从(0,0)渲染到(文本宽度/盆宽度、文本高度/盆高度)。这样,可以忽略填充,避免拉伸纹理


在任何情况下,请检查QuickFont(),它允许您直接呈现文本,而无需进入不干净的细节。

我采纳了您的建议,在我的项目中实现了QuickFont作为参考。我需要知道它需要如何在其他PC上实现。我需要什么样的QuickFont文件,它们需要存储在客户端的PC上的什么位置?事实上,是同一个人。我自己没有使用过QuickFont,但据我所知,您只需要将dll文件与项目二进制文件一起复制。我将在下一次更新中测试需要哪些QuickFont文件。我会试着把它放在一些测试版的PC上,我会看到确切的依赖关系,我会在OpenTK站点的QuickFont页面上报告