3

各キャラクターに多数のスプライトがあり、各キャラクターにいくつかの異なるパレット スワップがある格闘ゲームをコーディングしています。各スプライトにグレースケール テクスチャを使用し、各パレットに 256x1 テクスチャを使用しようとしています。

私のシェーダーは次のようになります。

バーテックス:

varying vec2 coord;
void main(void)
{
    coord = gl_MultiTexCoord0.xy;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

断片:

uniform sampler2D palette;
uniform sampler2D texture;
varying vec2 coord;
void main()
{
    gl_FragColor = texture2D(palette, vec2(texture2D(texture, coord).r, 0));
}

glGetUniformLocation と glUniform1i で「palette」を 1、「texture」を 0 に設定します。それらは正常にコンパイルされ、正常にリンクされます。描画コードでプログラム オブジェクトを使用できます。

問題は、マルチテクスチャリングを使用して「パレット」テクスチャと「テクスチャ」テクスチャをシェーダーで相互に連携させる方法がわからないことです。マルチテクスチャリングを使用するのはこれが初めてで、この種のソリューションで機能させる方法がわかりません。これらのシェーダー (正しい場合) を使用してパレット スワップをシミュレートする方法を知っている人はいますか?

編集:ここに私の描画コードがあります:

glUseProgram(paletteProgram);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, palette);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

glBegin(GL_QUADS);
glTexCoord2f(w1, h1);
glVertex3f(x1, y1, 0);
glTexCoord2f(w1, h2);
glVertex3f(x1, y2, 0);
glTexCoord2f(w2, h2);
glVertex3f(x2, y2, 0);
glTexCoord2f(w2, h1);
glVertex3f(x2, y1, 0);
glEnd();

glUseProgram(0);
4

2 に答える 2

1

あなたの論理は正しいようです。必要なことは、glActiveTextureを使用してアクティブ テクスチャを設定し、通常どおりテクスチャをバインドすることです (テクスチャ ユニット 0 および 1 の場合)。また、値 0 を texture と呼ばれるユニフォームにバインドし、値 1 を palette と呼ばれるユニフォームにバインドします。

GLSL 内では、texture2D を使用して、適切なサンプラーからテクセルを取得できます。

お役に立てれば!

これは実際には、このNeHe チュートリアル (セクション: GLSL でテクスチャを使用する)で詳細に説明されています。

これはあなたがする必要があることです

    glUseProgramObject(my_program);
    int my_sampler_uniform_location = glGetUniformLocation(my_program, my_color_texture);

    glActiveTexture(GL_TEXTURE0 + i);
    glBindTexture(GL_TEXTURE_2D, my_texture_object);

    glUniform1i(my_sampler_uniform_location, i);
于 2012-05-30T20:25:48.773 に答える
-2

わかりました、私はそれを理解しました!

どうやら、スクリプト プログラムが使用されるたびに均一変数がリセットされるようです...フレームごとに設定する必要がありました。

私は今とてもばかげているように感じますが、それがデバッグです。

于 2012-06-01T20:21:27.130 に答える