4

これはほんのわずかなプログラミング関連であり、色とその表現に関してもっと多くのことを行う必要があります。

私は非常に低レベルのアプリに取り組んでいます。メモリにバイト配列があります。それらはキャラクターです。それらはアンチエイリアシングでレンダリングされました。値は 0 から 255 で、0 は完全に透明、255 は完全に不透明 (必要に応じてアルファ) です。

このフォントをレンダリングするためのアルゴリズムを考え出すのに苦労しています。各ピクセルに対して次のことを行っています。

            // intensity is the weight I talked about: 0 to 255
            intensity = glyphs[text[i]][x + GLYPH_WIDTH*y];
            if (intensity == 255)
                continue; // Don't draw it, fully transparent
            else if (intensity == 0) 
                setPixel(x + xi, y + yi, color, base); // Fully opaque, can draw original color
            else { // Here's the tricky part
                // Get the pixel in the destination for averaging purposes
                pixel = getPixel(x + xi, y + yi, base);
                // transfer is an int for calculations
                transfer = (int)  ((float)((float) (255.0 - (float) intensity/255.0) * (float) color.red + (float) pixel.red)/2); // This is my attempt at averaging
                newPixel.red = (Byte) transfer;
                transfer = (int)  ((float)((float) (255.0 - (float) intensity/255.0) * (float) color.green + (float) pixel.green)/2);
                newPixel.green = (Byte) transfer;
                // transfer = (int) ((float) ((float) 255.0 - (float) intensity)/255.0 * (((float) color.blue) + (float) pixel.blue)/2);
                transfer = (int)  ((float)((float) (255.0 - (float) intensity/255.0) * (float) color.blue + (float) pixel.blue)/2);
                newPixel.blue = (Byte) transfer;
                // Set the newpixel in the desired mem. position
                setPixel(x+xi, y+yi, newPixel, base);
            }

ご覧のとおり、結果は望ましいものではありません。これは非常に拡大された画像です。1:1 の縮尺では、テキストに緑色の「オーラ」があるように見えます。

テスト、素晴らしいとは言えません

これを適切に計算する方法についてのアイデアは大歓迎です。

御時間ありがとうございます!

4

3 に答える 3

4

背景色と前景色をブレンドする必要があります。A-la:

pixelColour = newColour * intensity + backgroundColour * (1 - intensity)

ちなみに、これはフォントのレンダリングとブレンドの非常に遅い方法です代わりに、フォントのすべての文字を必要なすべてのプロパティを使用して画面外のサーフェスにレンダリングし、テキストが必要なときにそれをテクスチャとして使用して他のサーフェスにレンダリングする必要があります。

編集:

これは正しくありません:

(255.0 - (float) intensity/255.0)

代わりに次のようになります。

(255.0 - (float) intensity)/255.0
于 2010-12-30T22:52:56.860 に答える
1

現在のピクセル値が次のピクセル値を変更するため、ピクセルごとにアルファブレンディングを行うのは非常に複雑な場合があります。

ボックスワイズブレンディングを考えてアルゴリズムを再設計します。


多くのgetPixelが単一のグリフを要求しているため、適切なターゲット画像を生成できません。

于 2010-12-30T22:52:55.397 に答える
1

「オーラ」はアンチエイリアシングが原因だと思います。この手法は、ピクセルを隣接ピクセルと平均化します。

OpenGL を使用していないようですが、この章は理論の一部を説明するのに役立つかもしれません。より良い答えがあればいいのにと思いますが、うまくいけば、これがあなたを正しい方向に向けることを願っています. 私の最初の試みは、アンチエイリアシングを無効にすることです。しかし、おそらくそれよりも良い解決策があります。

于 2010-12-30T22:51:59.037 に答える