Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Opengl GLSL将4个浮点属性打包到vec4中_Opengl_Attributes_Glsl - Fatal编程技术网

Opengl GLSL将4个浮点属性打包到vec4中

Opengl GLSL将4个浮点属性打包到vec4中,opengl,attributes,glsl,Opengl,Attributes,Glsl,我有一个关于glsl中属性float的资源消耗的问题 它占用的资源是否与vec4一样多,还是没有? 我这样问是因为制服需要(至少他们可以) 如果不是,那么将4个float打包成一个vec4属性有意义吗?属性vec4将占用属性float的4倍内存。 在制服上,由于某些对齐,您可能会松开某些组件。(vec4将对齐为4个字节)。是的,所有的顶点属性都需要4分量向量的倍数来存储 这意味着float顶点属性占用1个插槽,与vec2、vec3或vec4占用的插槽相同。而大于vec4的类型占用多个插槽。mat

我有一个关于glsl中属性
float
的资源消耗的问题

它占用的资源是否与
vec4
一样多,还是没有?

我这样问是因为制服需要(至少他们可以)


如果不是,那么将4个
float
打包成一个
vec4
属性有意义吗?

属性vec4将占用属性float的4倍内存。 在制服上,由于某些对齐,您可能会松开某些组件。(vec4将对齐为4个字节)。

是的,所有的顶点属性都需要4分量向量的倍数来存储

这意味着
float
顶点属性占用1个插槽,与
vec2
vec3
vec4
占用的插槽相同。而大于
vec4
的类型占用多个插槽。
mat4
顶点属性占用4 x
vec4
多个存储单元。
dvec4
(双精度向量)顶点属性采用2 x
vec4
。由于实现只需要提供16个唯一的顶点属性插槽,如果您天真地使用单个
float
属性,您可以轻松地耗尽所有可用存储空间来存储4x4矩阵

这是绕不开的。与制服不同(标量GPU可能比
vec4
更有效地存储
float
制服),属性始终绑定到4分量数据类型。所以对于顶点属性,将属性打包到向量中是非常重要的


我已更新了我的答案,以指出德国劳埃德船级社和德国劳埃德船级社规范的相关摘录:

-10.2.1当前通用属性-第307页 顶点着色器(请参见第11.1节)访问由4个组件组成的通用顶点组成的数组 属性。此阵列的第一个插槽编号为零,阵列大小为 由依赖于实现的常数
GL\u MAX\u VERTEX\u ATTRIBS
指定

-4.4.1输入布局限定符-第60页 如果顶点着色器输入是任何标量或向量类型,它将使用单个位置。如果非顶点着色器输入是除dvec3或dvec4以外的标量或向量类型,则它将使用单个位置,而类型dvec3或dvec4将使用两个连续位置。
double
dvec2
类型的输入在所有阶段仅消耗一个位置

诚然,为
dvec4
描述的行为略有不同。在形式上,双精度类型消耗的存储量可能是浮点类型的两倍,因此
dvec3
dvec4
可能消耗两个属性槽。当它被提升到核心时,这种行为改变了。。。它们在顶点阶段中仅消耗1个位置,在任何其他阶段中可能消耗更多

双精度向量类型的原始(扩展)行为: 名称

ARB顶点属性64位

[……]

此外,一些顶点着色器输入使用更宽的64位组件 可能会根据数量的实施限制计算两倍 顶点着色器属性向量的定义。64位标量或两个分量 向量仅使用单个通用顶点属性;三和 四分量“长”可以算作两个分量。这种方法类似于 当前总账中使用的矩阵属性使用多个 属性


不,我的意思是,单浮点占用的内存是否和vec4一样多?作为属性,不,因为它是统一的,我不确定GLSL编译器是否会重新排列统一以优化使用的空间。统一本身不会使用所有空间,但如果下一个统一变量不适合当前的4字节块,它将与下一个4字节对齐。驱动程序完全有可能以任何方式进行优化每个属性在GLSL中都必须有自己的唯一位置。这是编写着色器时可以依赖的唯一存储限制,您知道GLSL提供了最少(通常是最多)16个顶点属性插槽,并且插槽足够大,可以存储
vec4
机器类型。驱动程序无法将单个
float
属性组合到单个插槽中,每个属性都有自己的位置,并且
float
属性的数据仅占该位置总潜在存储的1/4。所以在这种情况下,
float
,是相当浪费的。这就是我想听到的。但是,请您提供一些证明链接(供opengl参考)?:)哦,糟了,我必须写glsl(更新):)