3d 将大型参数数组发送到GPU着色器

3d 将大型参数数组发送到GPU着色器,3d,shader,gpu,3d,Shader,Gpu,我感兴趣的是沿着样条曲线的路径映射几何体。。。e、 g取每个顶点的z值作为沿样条曲线的距离,并获取样条曲线上该点的局部XY轴 样条曲线由许多截面组成,每个截面由x/y/z的三次方程描述,例如x(t)=at^3+bt^2+ct+d,因此每个截面都可以由一个矩阵或几个float4值很好地定义 但是,由于样条曲线很容易有100个截面,这就意味着着色器可以使用400-1000个float4值的数组。作为GPU新手程序员,这会引出几个问题: 为要渲染的网格设置此大小的数组可能会对性能造成什么影响?微不足道

我感兴趣的是沿着样条曲线的路径映射几何体。。。e、 g取每个顶点的
z
值作为沿样条曲线的距离,并获取样条曲线上该点的局部XY轴

样条曲线由许多截面组成,每个截面由x/y/z的三次方程描述,例如x(t)=at^3+bt^2+ct+d,因此每个截面都可以由一个矩阵或几个float4值很好地定义

但是,由于样条曲线很容易有100个截面,这就意味着着色器可以使用400-1000个float4值的数组。作为GPU新手程序员,这会引出几个问题:

  • 为要渲染的网格设置此大小的数组可能会对性能造成什么影响?微不足道还是严重
  • 阵列大小的限制是什么,以及如何在现实世界中发现的GPU之间改变它们?对于给定的GPU,我应该查看哪些术语的具体名称来了解这一点
  • 使用这种方法的一般提示也很受欢迎,因为我不知道应该问什么


    这是一个顶点着色器,我将在这里研究,我需要在非常糟糕的GPU上运行,例如支持集成图形芯片组的iPad2和DirectX10。

    一般来说,在顶点着色器级别将几何体映射到样条曲线上并不完全是简单的计算(从概念上讲)。变换反馈(DX10硬件支持)可能是您需要研究的内容。这样,仅当修改样条线时,才需要对每个顶点的每一帧进行计算

    这也取决于你到底想要什么。例如,如果要将对象放置在样条曲线上,但不扭曲对象本身,则在第一次过程(再次变换反馈)中仅计算每个对象的原点,并将其用作以后变换所有顶点的输入,可能是一个有效选项。可以使用实例id,也可以使用单独的顶点属性索引到该数据中

    广告1:
    设置一套制服的开销(或多或少)与设置一千套制服的开销相同。管道暂停和DMA延迟是主要因素,它们会在您接触单个值时立即发生。
    您想要的是在draw调用之间尽可能少的状态更改(无论“多大”)

    广告2:
    D3D10要求每个常量缓冲区至少有4096个包含四个32位值的向量,其中可以同时有14个。
    OpenGL 3.0(即“大致DX10类卡片”版本)与往常一样,在措辞上有点圆润,在最小值上更为宽松。必须支持至少16384个机器字的最少36个绑定,其中顶点着色器中必须至少有1024个4元组可用。
    事实上,你可以期待“足够”(我从未见过低于65536的报道)

    此外,一个D3D10兼容卡,无论硬件有多差。最小允许的最大纹理大小为。
    类似地,OpenGL 3.0要求16位和32位顶点和像素数据/纹理,并且要求至少支持1024的纹理大小(尽管我从未见过任何小于8192的纹理)

    这意味着,如果制服/常量不是选项,您也可以从纹理读取样条线数据。对于单个样条线,例如可以是1x1024纹理,但好处是:如果有20条样条线,可以将它们全部放在一个纹理中(每一条都在一条线中),只需更改纹理坐标,即可采样不同的线。这可能会一起消除管道暂停。
    此外,OpenGL 3.1引入了纹理缓冲区对象,这些对象是一维纹理,特别是用于此目的。最小允许最大大小为65536,实际值要高得多(我的卡报告134217728)。

    我不是D3D方面的专家,但几乎所有与D3D10兼容的卡都支持OpenGL 3.1,因此,由于硬件支持它,因此可以肯定D3D具有类似的(名称稍有不同)功能。

    它专门用于扭曲-从概念上说,是为了创建“curvey”坐标系。当你说这是一个性能问题时,我想你是对的,但它肯定可以与骨骼加权蒙皮/动画相媲美,这是实现这一点的另一种方式?因此,基本上你想要的是一种晶格空间变形,晶格由样条线插值。对于1000+控制点样条曲线,我通常看到的性能问题是,首先必须找到相对于某个坐标(每个顶点!!!)最近的一对控制点,然后是t值,以及其他一些“次要因素”,如点到样条曲线的距离。这是。。。嗯。。。不是很琐碎。不是说这是不可能的,但是在顶点着色器中执行这样的操作(即每帧几十万次)是。。。哇,很难的东西。:)这就是说,我真的建议尝试一种近似方法,在单独的过程中以一些(无论什么)间隔预先计算样条曲线,使用变换反馈(或渲染到纹理,或任何)获得一组有点样条曲线的线,并线性插值真实数据,读取这些数据。这并不完美,但我想它更现实。另外,如果间隔选择得很好,它甚至看起来都不会出错。我有它,所以z坐标映射为沿样条线的距离。我认为有可能通过编码找到一个给定z所指的“段”,然后就很容易了。无论哪种方式,在着色器中执行此操作的原因都是因为这肯定比在CPU中手动更改顶点要好。