インストールされているフォントからpngへのビットマップフォントを生成するプログラムを自分で作成しました。私が png を使用する理由は 2 つあります。 1. アルファ値を保持するため 2. オープン フォーマットであるため
また、単一の文字を読み取ることができるように、xml ファイルも生成します。このビットマップ フォントのエクスポートされたバージョンでは、単純なカラー ブレンディングを可能にするために白いフォント カラーが使用されます。ただし、ビットマップ フォントのエクスポート中にアンチエイリアシングを使用すると、アンチエイリアシングされた境界線がフォントの元の白を保持し、半分の色のエッジが発生するため、色の混合が見苦しくなります。
リアルタイムのフォントレンダラーを使用したり、アンチエイリアシングを放棄したりすることなく、この効果をかわす方法を知っている人はいますか?
編集1:
ご覧のとおり、オレンジを使用してブレンドすると、白い境界線が表示されます。
黒の場合、黒は 0f 0f 0f 1f (RBGA) であるため、この境界は表示されません。2 番目の混合色が白に似ていると、アンチエイリアシングによる半透明ピクセルによって「白化」された境界線が残ります。
編集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;
}