0

我给自己写了一个程序,它可以从任何已安装的字体生成位图字体到 png。我使用 png 有两个原因: 1. 保留 alpha 值 2. 它是一种开放格式

它还生成一个 xml 文件,以便我可以读取单个字符。此位图字体的导出版本使用白色字体颜色以允许简单的颜色混合。但是,当我在导出位图字体时使用抗锯齿时,我的颜色混合会变得很难看,因为抗锯齿的边框保护器会导致字体的原始白色导致半色边缘。

有谁知道如何在不使用实时字体渲染器或不得不放弃抗锯齿的情况下避开这种效果。

编辑1:

如您所见,当我使用橙色进行混合时,我得到一个白色边框。

如您所见,当我使用橙色进行混合时,我得到一个白色边框。

对于黑色,此边框不可见,因为黑色是 0f 0f 0f 1f (RBGA)。第二个混合颜色与白色有一些相似之处,它会留下由抗锯齿产生的半透明像素引起的“白化”边框。

编辑2:

这是一些代码,显示了我如何将图像加载到 gl 以及如何初始化 gl:

初始化GL:

protected void initGL() {
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0f, 0f, 0f, 0f); // Black Background
    glDisable(GL_DEPTH_TEST); // Enables Depth Testing
    glDepthMask(false);
    glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
    glLoadIdentity(); // Reset The Projection Matrix
    doResize();
    glMatrixMode(GL_MODELVIEW);
}

将图像加载到 gl:

public static Texture loadTexture(String resName, BufferedImage image) {        
    int textureID = glGenTextures(); // Generate texture ID
    Texture texture = new Texture(resName, textureID);

    int texWidth = image.getWidth();
    int texHeight = image.getHeight();
    texture.setWidth(texWidth);
    texture.setHeight(texHeight);

    ByteBuffer buffer = convertImageData(image, texture);

    texture.bind();

    // Setup wrap mode
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

    // Setup texture scaling filtering
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // Send texel data to OpenGL
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, (image.getColorModel().hasAlpha() ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, buffer);
    // Return the texture ID so we can bind it later again
    return texture;
}
4

0 回答 0