OpenGL中的调色板动画

Posted

技术标签:

【中文标题】OpenGL中的调色板动画【英文标题】:Palette Animation in OpenGL 【发布时间】:2009-03-19 14:33:54 【问题描述】:

我正在制作一个老式的 2d 游戏,我想在我的纹理中设置特定颜色的动画。

我知道的唯一方法是:

    opengl 着色器。 仅对一个颜色通道进行动画处理。 彩色动画纹理下的白色纹理。

但我不想使用着色器,我想让这个游戏尽可能简单,不需要太多额外的 openGL 函数等。

颜色通道动画不适合这个,因为我需要纹理中的所有颜色通道。

目前我正在使用 2 个纹理:另一个纹理下的白色纹理,将特定像素颜色转换为透明,然后我使用 glColor3f() 函数将白色纹理颜色更改为我想要的任何颜色,然后我看到“调色板动画”在该特定颜色上。

但是这种风格听起来很老套,所以我想知道是否有更好的技巧?

【问题讨论】:

【参考方案1】:

虽然我不熟悉调色板纹理扩展,但我仍然建议使用片段着色器来实现这种效果。与您提到的其他方法相比,使用着色器替换颜色键几乎是微不足道的,并且比自己编写调色板功能要快得多。

这是一个示例 GLSL 片段着色器,它可以将纹理中的白色替换为传入的任何颜色。

uniform vec4 fvReplaceColor;
uniform sampler2D baseMap;
varying vec2 Texcoord;

void main( void )

     vec4  fvBaseColor = texture2D( baseMap, Texcoord);

     if(fvBaseColor == vec4(1.0, 1.0, 1.0, 1.0))
          fvBaseColor = fvReplaceColor;

     gl_FragColor = fvBaseColor;

是的,设置着色器确实需要一些额外的时间,但是听起来你正在尝试做的事情,我觉得这是最好的方法。

【讨论】:

【参考方案2】:

如果您希望您的游戏在现代硬件上运行,那么片段着色器几乎是您唯一的选择,因为调色板纹理已被弃用,并且可能无法在较新的硬件上使用。

您现在拥有的解决方案听起来很合理,尤其是因为它可能在任何地方都有效。

【讨论】:

【参考方案3】:

只使用调色板纹理怎么样?有extensions 可以做到这一点。如果使用扩展是不可能的,您可以自己进行调色板处理。只是做你的调色板技巧,有很多,只需使用调色板编写 RGB 纹理。当然这限制了颜色的数量,但这就是使用调色板的重点。

现在很少有适合调色板处理的绘图程序。这就是为什么我不会从我的驱动器中删除 Deluxe Paint。

【讨论】:

grafx2 更好,并且(某种程度上)仍然支持【参考方案4】:

您也可以使用模板缓冲区来做一些等效的事情。在应该出现动画的位置(= 应该具有动画颜色的位置)写入模板缓冲区。然后使用相应的模板操作仅在模板缓冲区的未设置位置上渲染具有正常纹理的框。之后,将动画颜色渲染到相应的颜色中。位置使用不同的模板操作。

我不知道这是否真的会有所改进 - 还取决于您掌握数据的方式 - 但可能不那么“骇人听闻”。

【讨论】:

【参考方案5】:

对于 2D 游戏,我认为使用 ARB_vertex_program 扩展比使用 GLSL 更好。仍然有 OpenGL 驱动程序不支持GLSL,但支持ARB_fragment_program。对paletted textures 的支持现在不存在,但着色器时代之前的视频卡可能支持它。查看统计信息的链接。

旧的 ARB 语言是一种低级汇编语言,但您可以使用 NVidia 的高级 Cg 语言将着色器编译成这种格式。尽管它是 NVidia 技术,但它适用于所有 GPU。也就是说,如果您是为了自己的娱乐而编写游戏,那可能不值得这么麻烦。

【讨论】:

以上是关于OpenGL中的调色板动画的主要内容,如果未能解决你的问题,请参考以下文章

python 从动画GIF中提取帧,正确处理调色板和帧更新模式

使用OpenGL从矩阵绘制热图的最有效方法?

Material Theme

OpenOffice Writer 中的调色板

聊聊Qt中的Widget调色板QPalette

聊聊Qt中的Widget调色板QPalette