1

私は Power Of Two (POT) テクスチャを必要とする幸運な人々の 1 人であり、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) レンダリングされるテクスチャがトリミングされておらず、非常に奇妙に引き伸ばされています。

C) TexCoord2(,) X と Y の値を変更するだけで修正できます。テキストの画像を次の POT まで動的にパディングし、余分な部分を切り取る方法があるかどうか疑問に思っています。

明確にするために、HP/GL2 PCL ソース コード ファイルのアイテムを画面に表示してから、Dynamic pharmacy ラベル用のプリンターにアイテムを送信する環境をプログラミングしています。

誰かがもっと明確にする必要がある場合は、私に知らせてください。ありがとうございました

4

1 に答える 1

3

GL.TexImage2D は、現在バインドされているテクスチャを破棄し、指定したサイズで再作成します。やりたいことは、POT テクスチャを作成するときに GL.TexImage2D を 1 回使用し、GL.TexSubImage2D を使用してその特定の部分を更新することです。

このテクスチャを画面にレンダリングするときは、更新した特定の部分に対応する texcoords を指定します。つまり、(0,0) から (1,1) にレンダリングするのではなく、(0,0) から (text_width / pot_width, text_height /) にレンダリングします。 pot_height)。このようにして、パディングを無視し、テクスチャのストレッチを回避します。

いずれにせよ、QuickFont ( http://www.opentk.com/project/QuickFont ) を確認してください。これにより、汚い詳細に入ることなくテキストを直接レンダリングできます。

于 2011-11-30T20:27:04.027 に答える