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

标签 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

最佳答案

你要找的是Shader Storage Buffer Objects (SSBO),他们基本上会让你做你想做的事。

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

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

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

关于c++ - OpenGL ES 顶点着色器中的动态大小数组;用于混合形状/变形目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36457138/

相关文章:

c++ - 为什么这个未打开的 ifstream 在我尝试从中提取后仍然是 "good"?

iphone - PNG 图像周围的黑色边框,使用 OpenGL 绘制

ios - iOS 中的照相亭。使用 OpenCV 还是 OpenGL ES?

android - Android 上的 OpenGL ES 坐标系?

c++ - 用于替换顶点属性的 Opengl 着色器存储缓冲区对象

c++ - 如何将应用于所有顶点的顶点着色器动态数据传递?

c++ - Pthread 程序运行速度随着线程的增加而变慢

c++ - Win32 API 枚举 dll 导出函数?

c - OpenGL glUniform1f 不更新顶点着色器

c++ - 是否有与 `memchr` 具有相似性能的函数可以将每个字符与位掩码匹配而不是完全相等?