gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:51 26 4
gpt4 key购买 nike

我即将执行混合形状/变形目标的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com