我有兴趣沿样条曲线的路径绘制几何图形...例如,将每个顶点的z
值作为沿样条曲线的距离,并在样条曲线上的该点获取局部XY轴。
样条由许多部分构成,每个部分由x / y / z的三次方程描述,例如x(t)= at ^ 3 + bt ^ 2 + ct + d,因此每个部分可以通过矩阵很好地定义或一些float4值。
但是,由于样条线很容易有100个部分,这意味着着色器可以使用400-1000个float4值的数组。作为新手GPU程序员,这会引出一些问题:
使用这种方法的一般提示也很受欢迎,因为我不知道我应该提出什么问题!
这是我要在这里查看的顶点着色器,我需要在非常糟糕的GPU上运行,例如iPad2和支持DirectX10的集成图形芯片组。
答案 0 :(得分:2)
通常,在顶点着色器级别将几何体映射到样条曲线上并不是完全无关紧要的(并且在概念上)。转换反馈(DX10硬件支持)可能是您想要查看的内容。这样,只有在修改样条曲线时,您才需要为每个顶点每帧进行计算。
这也取决于你想要什么。例如,如果要在样条线上放置对象,而不是 warp 对象本身,则可能是仅评估每个对象的原点的有效选项。第一次传递(再次变换反馈)并将其用作输入以便稍后变换所有顶点。也许使用实例id,或者使用单独的顶点属性来索引该数据。
广告1:
设置一个制服的开销(或多或少)与设置一千件制服的开销相同。管道停顿和DMA延迟是主要因素,只要您触摸单个值就会发生这种情况
你想要的是尽可能少绘制调用之间的状态变化(无论多么“大”)。
广告2:
D3D10要求每个常量缓冲区至少有4096个矢量,每个传感器有4个32位值,其中你可以同时拥有14个。
像往常一样,OpenGL 3.0(“大致DX10级卡”版本)的措辞有点圆润,并且对最小值更加放松。必须支持最少36个至少16384个机器字的绑定,其中顶点着色器[1]中必须至少有1024个4元组。
实际上,你可以期待“足够”(我从未见过低于65536的报道)。
此外,D3D10兼容卡,无论硬件must support both 16 and 32 bit 4-component floating point textures多么糟糕。允许的最小纹理大小为8192 类似地,OpenGL 3.0要求16位和32位顶点和像素数据/纹理,并且至少需要支持1024的纹理大小(尽管我从未见过任何小于8192的纹理)。
这意味着,如果制服/常量不是一个选项,您也可以从纹理中读取样条数据。对于单个样条曲线,例如可以是1x1024纹理,但好处是:如果你有20个样条曲线,你可以将它们全部放在一个纹理中(每一个都在一条线上),只需更改纹理坐标即可你采样另一条线。这可能会完全消除管道失速
此外,OpenGL 3.1引入了纹理缓冲对象,它是一维纹理,特别是为此目的。最小允许最大尺寸为65536,实际值更高(我的卡报告134217728)。
我对D3D的专家不够,但几乎任何D3D10兼容卡与最近的驱动程序都支持OpenGL 3.1,所以由于硬件支持它,所以很确定D3D有一个类似的(略有不同的名称)功能。