Opengl GLSL将4个浮点属性打包到vec4中
我有一个关于glsl中属性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
float
的资源消耗的问题它占用的资源是否与
vec4
一样多,还是没有?我这样问是因为制服需要(至少他们可以)
如果不是,那么将4个
float
打包成一个vec4
属性有意义吗?属性vec4将占用属性float的4倍内存。
在制服上,由于某些对齐,您可能会松开某些组件。(vec4将对齐为4个字节)。是的,所有的顶点属性都需要4分量向量的倍数来存储
这意味着float
顶点属性占用1个插槽,与vec2
、vec3
或vec4
占用的插槽相同。而大于vec4
的类型占用多个插槽。mat4
顶点属性占用4 xvec4
多个存储单元。dvec4
(双精度向量)顶点属性采用2 xvec4
。由于实现只需要提供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(更新):)