Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLSL逐顶点固定大小数组_C++_Opengl_Glsl_Vertex Shader - Fatal编程技术网

C++ GLSL逐顶点固定大小数组

C++ GLSL逐顶点固定大小数组,c++,opengl,glsl,vertex-shader,C++,Opengl,Glsl,Vertex Shader,在桌面GLSL中,是否可以将固定大小的浮点数组作为属性传递给顶点着色器?如果是,如何进行 我希望为角色动画设置逐顶点权重,因此我希望在顶点着色器中设置如下内容: attribute float weights[25]; 如何从C++和OpenGL程序中填充属性数组?我在另一个例子中看到,我可以获得数组属性的属性位置,然后只需将索引添加到该位置。有人能给我一个非常大的阵列的例子吗 谢谢。让我们从你的要求开始 目前几乎没有任何硬件将属性浮动权重[25]编译。虽然着色器可以具有属性数组,但每个数组索

在桌面GLSL中,是否可以将固定大小的浮点数组作为属性传递给顶点着色器?如果是,如何进行

我希望为角色动画设置逐顶点权重,因此我希望在顶点着色器中设置如下内容:

attribute float weights[25];
如何从C++和OpenGL程序中填充属性数组?我在另一个例子中看到,我可以获得数组属性的属性位置,然后只需将索引添加到该位置。有人能给我一个非常大的阵列的例子吗


谢谢。

让我们从你的要求开始

目前几乎没有任何硬件将
属性浮动权重[25]编译。虽然着色器可以具有属性数组,但每个数组索引表示一个新的属性索引。在目前存在的所有硬件上,属性索引的最大数量是。。。16你需要25磅,这只是重量

现在,只要记住可以使用
vec4
属性,就可以很容易地缓解这种情况。因此,每四个数组元素存储在一个属性中。您的数组将是
属性vec4权重[7]这是可行的。当然,你的取重逻辑必须改变

即使如此,您似乎并没有理解这对顶点数据的实际意义。每个属性表示顶点数据的一个组件。渲染调用的每个顶点将具有相同数量的数据;这些数据的内容会有所不同,但数据量不会有多大

为了实现您的建议,网格中的每个顶点都需要25个浮点数来描述权重。即使将其存储为规范化的无符号字节,也至少需要额外25个字节的数据。太多了。特别是考虑到对于绝大多数顶点,这些值中的大多数将为0。即使在最坏的情况下,也可能会看到6-7个骨骼影响单个顶点

通常在顶点着色器中执行蒙皮的方法是将影响单个顶点的骨骼数限制为四个。这样,您就不用使用属性数组;您只需为权重使用
vec4
属性。当然,您现在还需要说明哪根骨骼与哪根体重相关。因此,您还有第二个
vec4
属性,用于指定该权重的骨骼索引


这是一个很好的平衡。您只需要占用2个额外属性(就大小而言,可以是无符号字节)。对于绝大多数顶点,您甚至不会注意到,因为大多数顶点仅受1-3个骨骼的影响。少数使用4,更少的使用5+。在这些情况下,您只需删除最低权重,然后按比例重新计算其他权重。

Nicol Bolas已经给了您一个如何重组任务的答案。你应该这样做,因为为一个顶点处理25个浮点数,可能通过一些四元数乘法会浪费很多好的GPU处理能力;无论如何,顶点的大多数属性都将转换为接近于标识变换

但是出于学术上的原因,我要告诉你们,如何通过每个顶点25个浮点数。关键不是为此使用属性,而是从某个缓冲区(纹理)获取数据。GLSL顶点着色器阶段具有内置变量
gl_VertexID
,该变量传递当前处理顶点的索引。使用最新的OpenGL,您还可以从顶点着色器访问纹理。因此,您有一个大小为
顶点数×25
的纹理来保存这些值。在顶点着色器中,您可以使用
texelFetch
功能访问它们,即
texelFetch(param_buffer,vec2(gl_VertexID,3))


如果在骨骼动画中使用,该系统通常称为纹理蒙皮。然而,它应该被节约使用,因为它是一个真正的性能猪。但有时你无法避免,例如,在实施面部动画系统时,如果你想准确模拟人脸,你必须将所有顶点加权到26块肌肉。

非常感谢。你回答了我所有的问题,甚至更多!我希望这将大大提高性能!再次感谢。