使用GLSL 4.4的两级顶点插值

时间:2013-11-16 04:16:18

标签: opengl glsl vertex-shader

我有一个巨大的模型(一百万个顶点),以及一些预定义的控制手柄来变形这个模型。控制手柄分为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)如果所有顶点着色器都可以访问某些内存,是否会导致某些性能问题?因为顶点着色器尝试访问不在共享内存或进程注册中的数据

如果任何一种方法无法解决,我的案例是否有任何可能的解决方案?

0 个答案:

没有答案