実行時に特定のピクセルの色を変更する必要がある、メガマンのようなゲームに取り組んでいます。参考:メガマンでは、選択した武器を変更すると、メインキャラクターのパレットが選択した武器を反映するように変更されます。スプライトのすべての色が変化するわけではなく、特定の色のみが変化します。
プログラマーはパレットと、ピクセルとパレットインデックス間の論理マッピングにアクセスできるため、この種の効果はNESで一般的であり、非常に簡単に実行できました。ただし、最新のハードウェアでは、パレットの概念が同じではないため、これはもう少し困難です。
テクスチャはすべて32ビットであり、パレットを使用しません。
私が望む効果を達成するために知っている2つの方法がありますが、この効果を簡単に達成するより良い方法があるかどうか興味があります。私が知っている2つのオプションは次のとおりです。
- シェーダーを使用してGLSLを記述し、「パレット交換」動作を実行します。
- シェーダーが利用できない場合(たとえば、グラフィックカードがサポートしていないため)、「オリジナル」テクスチャのクローンを作成し、色の変更が事前に適用された異なるバージョンを生成することができます。
理想的には、シェーダーを使用したいと思います。シェーダーは簡単に見えるため、テクスチャの複製方法とは対照的に追加作業がほとんど必要ないためです。テクスチャを複製して色を変更するだけでVRAMが無駄になるのではないかと心配しています。心配する必要はありませんか?
編集:私は最終的に受け入れられた答えのテクニックを使用することになり、これは参考のために私のシェーダーです。
uniform sampler2D texture;
uniform sampler2D colorTable;
uniform float paletteIndex;
void main()
{
vec2 pos = gl_TexCoord[0].xy;
vec4 color = texture2D(texture, pos);
vec2 index = vec2(color.r + paletteIndex, 0);
vec4 indexedColor = texture2D(colorTable, index);
gl_FragColor = indexedColor;
}
両方のテクスチャは32ビットであり、1つのテクスチャはすべて同じサイズ(私の場合は6色)であるいくつかのパレットを含むルックアップテーブルとして使用されます。ソーステーブルの赤チャンネルをカラーテーブルのインデックスとして使用します。これは、メガマンのようなパレット交換を実現するための魅力のように機能しました!