OpenGLテクスチャ座標が間違っています

condorcraft110 II

前の質問の回答を使用して、フォントアトラス全体を画面にレンダリングすることができました。ただし、アトラスから個々の文字をレンダリングする場合、私の座標は多少間違っているように見えます。

代替テキストhttp://img.condorcraft110.net/font%20renderer%20fail.png

そのことから(テキストは「テストフォントレンダラーテキスト」と表示されるはずです)、テクスチャ座標が間違っていると推測できます。しかし、それらはどのように間違っていますか?

完全な実例:

import java.awt.image.*;
import java.io.*;
import java.nio.*;
import javax.imageio.*;
import org.lwjgl.*;
import org.lwjgl.opengl.*;

public class OpenGLFontRendererTest
{
    private static int textureID;

    public static void main(String[] args) throws Exception
    {
        Display.setTitle("OpenGL Font Renderer Test");
        Display.setDisplayMode(new DisplayMode(640, 480));
        Display.create();

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, 640, 0, 480, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        textureID = bindTextureFile("textures/font.png");

        while(!Display.isCloseRequested())
        {
            Display.sync(60);

            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
            GL11.glClearColor(0, 0, 0, 1);

            GL11.glColor4f(1, 1, 1, 1);
            drawText(20, 20, "Test font renderer text");

            Display.update();
        }

        Display.destroy();
    }

    private static void drawText(int x, int y, String text)
    {
        GL11.glPushMatrix();
            GL11.glTranslatef(x, y, 0);
            GL11.glDisable(GL11.GL_DEPTH_TEST);
            GL11.glEnable(GL11.GL_TEXTURE_2D);
            GL11.glEnable(GL11.GL_BLEND);
                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
                GL11.glBegin(GL11.GL_QUADS);
                    int xOff = 0;
                    int yOff = 0;
                    for(char c : text.toCharArray())
                    {
                        if(c == '\n')
                        {
                            xOff = 0;
                            yOff += 17;
                            continue;
                        }
                        else if(c == '\r')
                        {
                            xOff = 0;
                            continue;
                        }

                        float pos = (float)c;

                        float textureX = (pos % 16F) / 16F;
                        float textureY = (pos / 16F) / 16F;

                        GL11.glTexCoord2f(textureX, textureY + 0.0625F);
                        GL11.glVertex2i(xOff, yOff);

                        GL11.glTexCoord2f(textureX, textureY);
                        GL11.glVertex2i(xOff, yOff + 16);

                        GL11.glTexCoord2f(textureX + 0.0625F, textureY);
                        GL11.glVertex2i(xOff + 16, yOff + 16);

                        GL11.glTexCoord2f(textureX + 0.0625F, textureY + 0.0625F);
                        GL11.glVertex2i(xOff + 16, yOff);

                        xOff += 17;
                    }
                GL11.glEnd();
            GL11.glDisable(GL11.GL_BLEND);
            GL11.glDisable(GL11.GL_TEXTURE_2D);
            GL11.glEnable(GL11.GL_DEPTH_TEST);
        GL11.glPopMatrix();
    }

    private static int bindTextureFile(String file)
    {
        try
        {
            BufferedImage image = ImageIO.read(new FileInputStream(file));

            int[] pixels = new int[image.getWidth() * image.getHeight()];

            image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());

            ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);

            for(int y = 0; y < image.getWidth(); y++)
            {
                for(int x = 0; x < image.getHeight(); x++)
                {
                    int pixel = pixels[y * image.getWidth() + x];

                    buffer.put((byte)((pixel >> 16) & 0xFF));
                    buffer.put((byte)((pixel >> 8) & 0xFF));
                    buffer.put((byte)(pixel & 0xFF));
                    buffer.put((byte)((pixel >> 24) & 0xFF));
                }
            }

            buffer.flip();

            int textureID = GL11.glGenTextures();

            GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);

            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);

            GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);

            return textureID;
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return -1;
    }
}

font.pngこれも/fonts/default.png、テスト目的のデフォルトのMinecraftフォントファイル()です。

condorcraft110 II

OK、なんとかこれを解決できました。フロートとして分割していたので、小数点以下の桁数で座標がめちゃくちゃになってしまいました。

改訂されたコード:

import java.awt.image.*;
import java.io.*;
import java.nio.*;
import javax.imageio.*;
import org.lwjgl.*;
import org.lwjgl.opengl.*;

public class OpenGLFontRendererTest
{
    private static int textureID;

    public static void main(String[] args) throws Exception
    {
        Display.setTitle("OpenGL Font Renderer Test");
        Display.setDisplayMode(new DisplayMode(640, 480));
        Display.create();

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, 640, 0, 480, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        textureID = bindTextureFile("textures/font.png");

        while(!Display.isCloseRequested())
        {
            Display.sync(60);

            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
            GL11.glClearColor(0, 0, 0, 1);

            GL11.glColor4f(1, 1, 1, 1);
            drawText(20, 20, "Test font renderer text");

            Display.update();
        }

        Display.destroy();
    }

    private static void drawText(int x, int y, String text)
    {
        GL11.glPushMatrix();
            GL11.glTranslatef(x, y, 0);
            GL11.glDisable(GL11.GL_DEPTH_TEST);
            GL11.glEnable(GL11.GL_TEXTURE_2D);
            GL11.glEnable(GL11.GL_BLEND);
                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
                GL11.glBegin(GL11.GL_QUADS);
                    int xOff = 0;
                    int yOff = 0;
                    for(char c : text.toCharArray())
                    {
                        if(c == '\n')
                        {
                            xOff = 0;
                            yOff -= 17;
                            continue;
                        }
                        else if(c == '\r')
                        {
                            xOff = 0;
                            continue;
                        }

                        int pos = (int)c; // THESE

                        float textureX = (float)(pos % 16F) / 16F; // THREE
                        float textureY = (float)(pos / 16) / 16F; // LINES

                        GL11.glTexCoord2f(textureX, textureY + 0.0625F);
                        GL11.glVertex2i(xOff, yOff);

                        GL11.glTexCoord2f(textureX, textureY);
                        GL11.glVertex2i(xOff, yOff + 16);

                        GL11.glTexCoord2f(textureX + 0.0625F, textureY);
                        GL11.glVertex2i(xOff + 16, yOff + 16);

                        GL11.glTexCoord2f(textureX + 0.0625F, textureY + 0.0625F);
                        GL11.glVertex2i(xOff + 16, yOff);

                        xOff += 17;
                    }
                GL11.glEnd();
            GL11.glDisable(GL11.GL_BLEND);
            GL11.glDisable(GL11.GL_TEXTURE_2D);
            GL11.glEnable(GL11.GL_DEPTH_TEST);
        GL11.glPopMatrix();
    }

    private static int bindTextureFile(String file)
    {
        try
        {
            BufferedImage image = ImageIO.read(new FileInputStream(file));

            int[] pixels = new int[image.getWidth() * image.getHeight()];

            image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());

            ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);

            for(int y = 0; y < image.getWidth(); y++)
            {
                for(int x = 0; x < image.getHeight(); x++)
                {
                    int pixel = pixels[y * image.getWidth() + x];

                    buffer.put((byte)((pixel >> 16) & 0xFF));
                    buffer.put((byte)((pixel >> 8) & 0xFF));
                    buffer.put((byte)(pixel & 0xFF));
                    buffer.put((byte)((pixel >> 24) & 0xFF));
                }
            }

            buffer.flip();

            int textureID = GL11.glGenTextures();

            GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);

            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);

            GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer);

            return textureID;
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return -1;
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OpenGL描画テクスチャが間違っています

分類Dev

Directx Assimp のテクスチャ座標が間違っている

分類Dev

OpenGL ES 1.x以降のバージョンでテクスチャ座標がどのように機能するかに違いはありますか?

分類Dev

極座標が間違っています

分類Dev

極座標が間違っています

分類Dev

CanvasfillRectのX座標が間違っています

分類Dev

迅速なiOSの座標系が間違っています

分類Dev

gl_Positionが原因で、openglテクスチャ座標が正しく補間されません

分類Dev

Qt 5.3.2 + TSlib:タッチ座標が間違っている

分類Dev

(テクスチャへの)深度バッファの出力が間違っていますか?

分類Dev

OpenGLテクスチャ座標は効果がありません

分類Dev

オブジェクトにテクスチャを適用するときにOpenglの色が間違っている

分類Dev

Javaウィンドウの座標が間違っています

分類Dev

UVとSTテクスチャ座標の違い

分類Dev

パスのdrawTextOnPathが間違った座標から、または右側からテキストを表示しています

分類Dev

DEBファイルがインストールされていません、アーキテクチャが間違っていますか?

分類Dev

XObject フォーム バウンディング ボックスの y、x 座標が間違っています - PDFBOX

分類Dev

OpenGLテクスチャが曲がっている

分類Dev

タッチ座標のビューを作成するが、xとyが間違っている

分類Dev

RTMP のチャンク サイズが間違っていますか?

分類Dev

ピボットポイントでキャンバスをズームした後、x座標とy座標が間違っている

分類Dev

テクスチャ座標に一貫性がない

分類Dev

BufferGeometry正方形の2番目の三角形のテクスチャの位置が間違っています

分類Dev

頂点から2D形状のテクスチャ座標を計算しますか?iOS OpenGL ES

分類Dev

モデルテクスチャ座標openglの問題

分類Dev

絶対座標が間違っているandroid

分類Dev

Cでのスキャンが間違っています

分類Dev

パケットメタクラスが適用されましたが、キャプチャされたVLAN優先度が間違っています

分類Dev

シグニチャの違いにより、間違った子クラス関数が呼び出されています

Related 関連記事

  1. 1

    OpenGL描画テクスチャが間違っています

  2. 2

    Directx Assimp のテクスチャ座標が間違っている

  3. 3

    OpenGL ES 1.x以降のバージョンでテクスチャ座標がどのように機能するかに違いはありますか?

  4. 4

    極座標が間違っています

  5. 5

    極座標が間違っています

  6. 6

    CanvasfillRectのX座標が間違っています

  7. 7

    迅速なiOSの座標系が間違っています

  8. 8

    gl_Positionが原因で、openglテクスチャ座標が正しく補間されません

  9. 9

    Qt 5.3.2 + TSlib:タッチ座標が間違っている

  10. 10

    (テクスチャへの)深度バッファの出力が間違っていますか?

  11. 11

    OpenGLテクスチャ座標は効果がありません

  12. 12

    オブジェクトにテクスチャを適用するときにOpenglの色が間違っている

  13. 13

    Javaウィンドウの座標が間違っています

  14. 14

    UVとSTテクスチャ座標の違い

  15. 15

    パスのdrawTextOnPathが間違った座標から、または右側からテキストを表示しています

  16. 16

    DEBファイルがインストールされていません、アーキテクチャが間違っていますか?

  17. 17

    XObject フォーム バウンディング ボックスの y、x 座標が間違っています - PDFBOX

  18. 18

    OpenGLテクスチャが曲がっている

  19. 19

    タッチ座標のビューを作成するが、xとyが間違っている

  20. 20

    RTMP のチャンク サイズが間違っていますか?

  21. 21

    ピボットポイントでキャンバスをズームした後、x座標とy座標が間違っている

  22. 22

    テクスチャ座標に一貫性がない

  23. 23

    BufferGeometry正方形の2番目の三角形のテクスチャの位置が間違っています

  24. 24

    頂点から2D形状のテクスチャ座標を計算しますか?iOS OpenGL ES

  25. 25

    モデルテクスチャ座標openglの問題

  26. 26

    絶対座標が間違っているandroid

  27. 27

    Cでのスキャンが間違っています

  28. 28

    パケットメタクラスが適用されましたが、キャプチャされたVLAN優先度が間違っています

  29. 29

    シグニチャの違いにより、間違った子クラス関数が呼び出されています

ホットタグ

アーカイブ