萌えハッカーニュースリーダー

2025/10/12 07:12 Sharp Bilinear Filters: Big Clean Pixels for Pixel Art

出典: https://bumbershootsoft.wordpress.com/2025/10/11/sharp-bilinear-filters-big-clean-pixels-for-pixel-art/
hakase
博士

ロボ子、今日はOpenGLのシャープバイリニアフィルタリングについて話すのじゃ。

roboko
ロボ子

シャープバイリニアフィルタリングですか。それは一体何でしょう?

hakase
博士

昔のOpenGLでは、画像を拡大すると、チェッカーボードがずれる問題があったのじゃ。それを解決するために、バイリニアフィルタリングを使うと、今度はぼやけてしまう。

roboko
ロボ子

なるほど、ぼやけずにシャープに拡大したい、というわけですね。

hakase
博士

そう!そこで「シャープバイリニアフィルタリング」の登場じゃ!これは、テクセルが重なるピクセルでのみブレンドを行うようにしたものなのじゃ。

roboko
ロボ子

記事によると、コール・セシルさんのブログ記事や、アルゴリズミック・ペンシーブのブログ記事が参考になっているようですね。

hakase
博士

その通り!フラグメントシェーダーを使って、テクセル座標に基づいてテクスチャをサンプリングする場所を調整するのじゃ。

roboko
ロボ子

具体的には、どうやるんですか?

hakase
博士

まず、バイリニア補間モードを設定して、テクセル内の各ピクセルがエッジで「このテクセルとその隣接テクセルとの50/50ブレンド」と「テクセルの実際のカラー」の間で変化するようにするのじゃ。

roboko
ロボ子

ふむふむ。

hakase
博士

そして、各ピクセルをシェーディングする際、ソーステクセル内のどこにいるかを把握するのじゃ。テクセルの中心に近い場合は、テクセルの中心からサンプリング。それ以外の場合は、テクセルの境界領域への深さに応じて、50/50ブレンドとメインテクセルカラーの間で変化させるのじゃ。

roboko
ロボ子

境界領域を調整することで、ブレンド具合をコントロールするんですね。

hakase
博士

そう!境界領域を1ピクセル幅にすると、すべての参加テクセルの寄与を完全にブレンドできるのじゃ。でも、少し広くした方が見栄えが良くなることもあるのじゃ。

roboko
ロボ子

記事には、ブレンド係数の計算に区分的線形関数を使うと書いてありますね。

hakase
博士

そうじゃ!分数テクセル座標とブレンド係数を使って、クランプ操作でグラフを2つのクランプされた線形関数の合計に変換するのじゃ。シェーダーでの複雑な制御フローはコストがかかるからね。

roboko
ロボ子

OpenGL 3.2とOpenGL 2.1で実装が違うんですね。

hakase
博士

OpenGL 3.2では、頂点シェーダーがテクスチャ座標をテクセル座標に変換して、フラグメントシェーダーはブレンド領域の長さ(β)をスカラーユニフォームとして受け取るのじゃ。OpenGL 2.1では、gl_Vertexとscaleユニフォームを使うのじゃ。

roboko
ロボ子

フレームワークコードも更新して、ユニフォームのインデックスを収集して、適切な値を設定する必要があるんですね。

hakase
博士

そう!拡大および縮小フィルターをGL_LINEARに変更して、GL_TEXTURE_WRAPパラメータをGL_CLAMPからGL_CLAMP_TO_EDGEに変更するのも忘れずにのじゃ。

roboko
ロボ子

これで、テクスチャ化されたグラフィカルプリミティブはすべて適切に拡大縮小できるようになるんですね。

hakase
博士

そういうこと!ロボ子もこれで、ドット絵をきれいに表示できるゲームが作れるぞ!

roboko
ロボ子

ありがとうございます、博士!

hakase
博士

ところでロボ子、シャープバイリニアフィルタリングって、まるで私の性格みたいじゃない?

roboko
ロボ子

どういうことですか?

hakase
博士

普段はぼやっとしてるけど、必要な時はキリッとするのじゃ!

roboko
ロボ子

(苦笑)まあ、そうかもしれませんね。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search