OpenGL Palette交换着色器?

时间:2012-05-30 20:09:48

标签: opengl glsl shader palette

我正在编写一个格斗游戏,其中每个角色都有大量的精灵,每个角色都有几个不同的调色板交换。我一直在尝试为每个精灵使用灰度纹理,并为每个调色板使用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);

2 个答案:

答案 0 :(得分:1)

你的逻辑似乎很合理。你需要做的是使用glActiveTexture设置活动纹理,然后像往常一样绑定纹理(对于纹理单元0和1)。现在还将值0绑定到称为纹理的统一,将1绑定到称为调色板的统一。

在GLSL内部,您可以使用texture2D从相应的采样器中提取纹素。

希望这有帮助!

这在this 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);

答案 1 :(得分:-2)

好的,我明白了!

显然,每次使用脚本程序时都会重置统一变量...我只需要每帧都设置它们。

我现在感觉很蠢,但是嘿,那就是调试。