我有一个巨大的模型(一百万个顶点),以及一些预定义的控制手柄来变形这个模型。控制手柄分为2个级别,手柄级别-2(大约10K)的位置是手柄级别-1(小于1K)的权重组合。 模型顶点位置是句柄级别-2的权重组合。
可以这样说明:
Handle-level-1 ( size <1000 )
|
|
(interpolation #1)
|
|
V
Handle-level-2 ( size = 10K )
|
|
(interpolation #2)
|
|
V
Model(size = 1M)
我尝试使用GLSL实现这个2插值,目前我脑子里有两个选项:
[1]使用计算着色器计算插值#1(Handles Level-2),而Handles Level-1可以作为统一变量传递给GPU,并将Handles-Level-2保存到纹理中。然后我将插值权重/索引作为顶点属性传递,并使用顶点着色器(插值#2)计算模型顶点位置。
[2]我在GPU内存中分配了一个缓冲区,我还创建了顶点着色器来计算插值#1(Handles Level-2),然后使用TransformFeedback()将Handles Level-2保存到缓冲区中。为了计算最终模型,我创建了顶点着色器,它可以访问完整的Handles Level-2缓冲区,并进行插值#2。
我对上述两种方法都有一些担忧,所以我要求一些意见:
方法(1):
(a)句柄级别-2是顶点位置,它们是浮点数,那么这些浮点数是否可以打包到纹理或图像中?
(b)如果不能,哪个数据结构适合保存句柄级别-2,并且可以通过插值#2的顶点着色器访问? 在这种情况下,每个着色器都必须访问总句柄级别-2数据。
方法(2):
(a)可以同时为所有顶点着色器访问一块GPU内存(缓冲区存储处理级别2)吗?
(b)如果所有顶点着色器都可以访问某些内存,是否会导致某些性能问题?因为顶点着色器尝试访问不在共享内存或进程注册中的数据
如果任何一种方法无法解决,我的案例是否有任何可能的解决方案?