OpenGL ES顶点着色器中的动态大小的数组;用于混合形状/变形目标

时间:2016-04-06 16:34:59

标签: c++ opengl-es vertex-shader

我即将做一个混合形状/变形目标的Opengl ES实现,我不太确定这样做的最好方法。我面临的问题是我希望顶点数据的插值在GPU上发生,但我也希望混合形状的数量是任意的。

为了澄清,我不希望我的顶点着色器看起来像这样: Glitchy Facial Morph Target Animation in OpenGL (C++)。此实现的问题是要在着色器中混合的网格数量是静态的。我将处理多个网格,这些网格具有与之关联的不同数量的混合形状,如果可能的话,我不想为每个网格创建单独的着色器。为大约20种混合形状的网格创建硬编码着色器也会看起来非常难看。

所以我在考虑使用某种动态数组来保存所有数据。但是,我不确定你是否可以在顶点着色器中分配动态大小的数组?在Vertex shader with array inputs中,op的大小设置为常量。我可以考虑创建我的数组的唯一方法是使用一个统一变量来保持大小,但我猜不会编译,因为数组不能用未知变量分配。

所以我想找到的是一个很好的方法来存储我的数据(混合形状,权重,顶点,法线的数量)并在运行时在我的顶点着色器中访问它们,这样我就可以在GPU上进行有效插值。

关于如何实现这一目标的任何想法?

修改 忘了提及它的OpenGL ES

1 个答案:

答案 0 :(得分:2)

你正在寻找的是Shader Storage Buffer Objects(SSBO),他们基本上会让你完全按照自己的意愿去做。

但需要注意的是:它们仅适用于GL4.x类硬件,特别是4.3+。这种情况每年都变得越来越少,但如果计算机的GPU超过5年,它可能无法正常工作。

如果你正在处理OpenGL ES,你仍然(可能)只有Uniform Buffer Objects只需要OpenGL 3.x硬件。它们比SSBO更受限制(规范只保证65kb数据,甚至现代硬件通常不会提供超出空间的空间),但它更可能与您的硬件兼容。

在绝对最坏的情况下,您还可以使用纹理作为将任意数据写入的缓冲区,然后重新解释着色器上的数据。它非常hacky,但它会绕过UBO的空间限制,几乎可以与你的硬件兼容。