フラグメントシェーダーを使用してパレットスワップを実現する方法を整理しようとしています(この投稿を見てhttps://gamedev.stackexchange.com/questions/43294/creating-a-retro-style-palette-swapping-effect-in -opengl ) 私は gl を開くのが初めてなので、誰かが私の問題を説明してくれたらうれしいです。
再現しようとしているコードスニペットは次のとおりです。
http://www.opengl.org/wiki/Common_Mistakes#Paletted_textures
ウィンドウを作成し、テクスチャ、シェーダーをロードし、ウィンドウのコーナーにマップされた単一の正方形をレンダリングできるように、Open GL 環境をセットアップしました (ウィンドウのサイズを変更すると、イメージも引き伸ばされます)。
頂点シェーダーを使用して座標をスクリーン空間からテクスチャ空間に変換しているため、テクスチャも引き伸ばされます
attribute vec2 position;
varying vec2 texcoord;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
texcoord = position * vec2(0.5) + vec2(0.5);
}
フラグメントシェーダーは
uniform float fade_factor;
uniform sampler2D textures[2];
varying vec2 texcoord;
void main()
{
vec4 index = texture2D(textures[0], texcoord);
vec4 texel = texture2D(textures[1], index.xy);
gl_FragColor = texel;
}
textures[0]
インデックス付きのテクスチャです(色付けしようとしているもの)
すべてのピクセルのカラー値は (0, 0, 0, 255)、(1, 0, 0, 255)、(2, 0, 0, 255) ... (8, 0, 0, 255) - 8 色全体的に、それがほとんど黒に見える理由です。「赤チャンネル」に保存されている値を使用して色をエンコードしたいと思います。
textures[1]
色の表です (9x1 ピクセル、各ピクセルには固有の色があり、投稿用に 90x10 にズームされています)
フラグメント シェーダーの抜粋からわかるように、たとえば (5, 0, 0, 255) などの最初のテクスチャからインデックス値を読み取り、ポイント (x=5, y= 0) 2 番目のテクスチャ。ウィキに書いてある通り。
しかし、ペイントされた画像の代わりに、次のようになります。
実際、vec2(1, 0)、vec2(2, 0)、vec2(4, 0)、vec2(8, 0) のように X ポイントを明示的に設定すると、2 番目のテクスチャからピクセルにアクセスできないことがわかります。しかし、vec2(0.1, 0) または vec2(0.7, 0) を使用すると、色を取得できます。これは、テクスチャ スペースが 9x1 ピクセルから (0,0)->(1,1) に正規化されているためだと思います。しかし、どうすればその機能を「無効」にして、単にパレット テクスチャをロードして、「(x,y) に格納されているピクセルのカラー値を教えてください」と尋ねることができるのでしょうか?