java - 我原来的 Java 字体程序 - 使用不同字母时倾斜?

标签 java opengl textures lwjgl

我的字体程序的输出是倾斜的。我很确定问题与 x 和 y 以及 printLetter() 如何使用它们有关。它可能会与 x 和 y 的多个数字混淆吗?如果您需要任何其他代码,请告诉我。 “findCoords”是从游戏循环内部调用的。

其他背景信息:

它使用 LWJGL 及其 OpenGL。 printLetter() 中的 +0.0769+0.25 是主图像中每个图 block 的大小(包含每个图 block 的主图像)字母为 78*24,每个字母为 6*6。),与 1 成比例,xcoords[] 和 ycoords[] 为 double 组:xcoords[] 保存 0/13, 1/13, 2/13, 3/13 等,ycoords[] 包含 0/4、1/4、2/4、3/4,因为 glTexCoord 必须与 1 成比例。这是图像的视觉效果它从中获取纹理坐标。

enter image description here

public void findCoords(String chars){
    int numChars = chars.length();
    for(int z = 0; z < numChars; z++){

        char ch = chars.charAt(z);
        int x;
        int y;

        switch(ch){
    //LETTERS
        case 'A': x= 0; y= 0; break; case 'N': x= 0; y= 1; break;
        case 'B': x= 1; y= 0; break; case 'O': x= 1; y= 1; break;
        case 'C': x= 2; y= 0; break; case 'P': x= 2; y= 1; break;
        case 'D': x= 3; y= 0; break; case 'Q': x= 3; y= 1; break;
        case 'E': x= 4; y= 0; break; case 'R': x= 4; y= 1; break;
        case 'F': x= 5; y= 0; break; case 'S': x= 5; y= 1; break;
        case 'G': x= 6; y= 0; break; case 'T': x= 6; y= 1; break;
        case 'H': x= 7; y= 0; break; case 'U': x= 7; y= 1; break;
        case 'I': x= 8; y= 0; break; case 'V': x= 8; y= 1; break;
        case 'J': x= 9; y= 0; break; case 'W': x= 9; y= 1; break;
        case 'K': x= 10; y= 0; break; case 'X': x= 10; y= 1; break;
        case 'L': x= 11; y= 0; break; case 'Y': x= 11; y= 1; break;
        case 'M': x= 12; y= 0; break; case 'Z': x= 12; y= 1; break;
    //NUMBERS
        case '0': x= 0; y= 2; break; case '5': x= 5; y= 2; break;
        case '1': x= 1; y= 2; break; case '6': x= 6; y= 2; break;
        case '2': x= 2; y= 2; break; case '7': x= 7; y= 2; break;
        case '3': x= 3; y= 2; break; case '8': x= 8; y= 2; break;
        case '4': x= 4; y= 2; break; case '9': x= 9; y= 2; break;
    //PUNCTUATION
        case '.': x= 10; y= 2; break; case '!': x= 12; y= 2; break;
        case ',': x= 11; y= 2; break;

        case '?': x= 0; y= 3; break; case '"': x= 2; y= 3; break;
        case ':': x= 1; y= 3; break; case ' ': x= 3; y= 3; break;

        default: x= 0; y= 3;
            }

            int offs = scale*z;
            printLetter(x, y, offs);

        }
    }

.

void printLetter(int x, int y, int offs){
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
    GL11.glBegin(GL11.GL_QUADS);

    GL11.glVertex2f(0+offs, scale);
    GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]+0.25);

    GL11.glVertex2f(scale+offs, scale);
    GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]);

    GL11.glVertex2f(scale+offs, 0);
    GL11.glTexCoord2d(xcoords[x], ycoords[y]);

    GL11.glVertex2f(0+offs, 0);
    GL11.glTexCoord2d(xcoords[x], ycoords[y]+0.25);

    GL11.glEnd();
    GL11.glFlush();
}

chars 是重复的单个字母时,例如 "AAAAA""BBBBBB",则图像不会出现问题。 /image/oDwdr.png 。但是,当 chars 中有多个字母(如 "AAABBB""ABABAB" 时,字母就会倾斜。下图是 chars

时的输出结果
"AAABBB"

enter image description here


之前,案例本身调用 print 方法,例如

case 'A': printLetter(xcoord[0], ycoord[0], z)

我把它改成了现在的样子,也许是为了让程序不那么困惑。希望即使它没有解决问题,它也能让修复变得更容易一些?

问题可能是因为不同的字母会有不同的坐标,这会扰乱 printLetter() 的工作方式?情况并非如此,因为我测试了使两个字母(A 和 F)具有相同的 x 和 y,并将 chars “AFAFAF”,并且没有问题。

看起来,字母之间的距离越远,它们看起来就越困惑。将此“AAAZZZ”与上面的“AAABBB”进行比较:

enter image description here

最佳答案

GL11.glVertex2f(0+offs, scale);
GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]+0.25);

GL11.glVertex2f(scale+offs, scale);
GL11.glTexCoord2d(xcoords[x]+0.0769, ycoords[y]);

GL11.glVertex2f(scale+offs, 0);
GL11.glTexCoord2d(xcoords[x], ycoords[y]);

GL11.glVertex2f(0+offs, 0);
GL11.glTexCoord2d(xcoords[x], ycoords[y]+0.25);

这些调用是向后的。您应该在 glVertex 之前调用 glTexCoord,而不是之后。 glVertex 调用最终确定顶点并将其发送以进行绘制,因此每个 texcoord 都会与下一个顶点相关联,而不是与您想要的顶点相关联。

关于java - 我原来的 Java 字体程序 - 使用不同字母时倾斜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9894841/

相关文章:

Java 同步块(synchronized block)未按预期工作

java - 使用 JAXB 保持 DRY

java - 带显示列表的 OpenGL 光照

C++:跟踪耗时

android - 我的顶点只显示一个三角形?

c# - 显示立方体的所有面 - XNA

java - 如何在 JPA 2.0 元模型中自动生成列名作为静态最终字符串?

c++ - stb_png_to_mem的参数是什么意思?

opengl - TEXTURE_2D_ARRAY 未渲染

java - 为什么Executors创建Executor使用LinkedBlockingQueue而不是ConcurrentLinkedQueue