Nic*_*las 10 c++ opengl glsl vertex-shader
在桌面GLSL中是否可以将固定大小的浮点数组作为属性传递给顶点着色器?如果有,怎么样?
我想为角色动画设置每个顶点权重,所以我想在顶点着色器中使用以下内容:
attribute float weights[25];
Run Code Online (Sandbox Code Playgroud)
我如何从C++和OpenGL程序中填充属性数组?我在另一个问题中看到我可以获取数组属性的属性位置,然后只需将索引添加到该位置.有人可以为我的大型数组提供一个例子吗?
谢谢.
Nic*_*las 16
让我们从你要求的开始.
几乎没有当前存在的硬件将attribute float weights[25];
编译.着色器可以具有属性数组,而每个数组索引代表一个新的属性索引.在目前存在的所有硬件上,属性索引的最大数量是...... 16.你需要25,这只是权重.
现在,您可以通过记住可以使用vec4
属性来轻松地缓解这种情况.因此,您将每四个数组元素存储在一个属性中.你的阵列attribute vec4 weights[7];
是可行的.你的举重逻辑当然必须改变.
即便如此,您似乎并没有考虑到这对您的顶点数据实际意味着什么.每个属性代表顶点数据的一个组成部分.渲染调用的每个顶点将具有相同数量的数据; 该数据的内容会有所不同,但不会有多少数据.
为了做你所建议的,网格中的每个顶点都需要25个浮点来描述权重.即使将其存储为规范化的无符号字节,这仍然是至少25个额外字节的数据.好多啊.特别是考虑到绝大多数顶点,大多数这些值都是0.即使在最坏的情况下,你也可能会看到影响单个顶点的6-7个骨骼.
通常在顶点着色器中完成蒙皮的方法是将影响单个顶点的骨骼数量限制为四个.这样,您就不会使用属性数组; 你只需要使用vec4
权重属性.当然,您现在还需要说明哪个骨骼与哪个骨骼相关联.因此,您有第二个vec4
属性指定该权重的骨骼索引.
这达到了很好的平衡.您只需要占用2个额外属性(就大小而言可以是无符号字节).对于绝大多数顶点,您甚至都不会注意到,因为大多数顶点仅受1-3个骨骼的影响.少数使用4,少数使用5+.在这些情况下,您只需按比例切断最低权重并重新计算其他权重.
dat*_*olf 11
Nicol Bolas已经给你一个如何重组你的任务的答案.你应该这样做,因为为一个顶点处理25个浮点数,可能通过一些四元数乘法会浪费很多好的GPU处理能力; 无论如何,顶点的大多数属性都将转换为接近身份转换.
但是出于学术原因,我将告诉你,如何在每个顶点传递25个浮点数.关键是不使用属性,而是从某个缓冲区(纹理)中获取数据.GLSL顶点着色器阶段具有内置变量gl_VertexID
,该变量传递当前处理的顶点的索引.使用最近的OpenGL,您也可以从顶点着色器访问纹理.所以你有一个大小的纹理vertex_count × 25
保持值.在您的顶点着色器中,您可以使用该texelFetch
函数访问它们,即texelFetch(param_buffer, vec2(gl_VertexID, 3));
如果在骨架动画中使用,则此系统通常称为纹理蒙皮.然而,它应该谨慎使用,因为它是一个真正的性能猪.但有时候你无法避免它,例如当你实现一个面部动画系统,你需要将所有顶点加权到26个肌肉,如果你想要准确地模拟人脸.
归档时间: |
|
查看次数: |
3299 次 |
最近记录: |