【OpenGL ES】uniform变量缓冲区对象layout

在uniform变量缓冲区对象中,uniform变量在内存中以如下形式出现:
(1)类型为bool、int、uint和float的成员保存在内存的特定偏移,分别作为单个uint、int、uint和float类型的分量。
(2)基本数据类型bool、int、uint或者float的向量保存在始于特定偏移的连续内存位置中,第一个分量在最低偏移处。
(3)C列R行的列优先矩阵被当成C浮点列向量的的一个数组对待,每个向量包含R的分量,相类似,R行C列的行优先矩阵被当成R浮点行向量的一个数组,每个向量包含C个分量,列向量或者行向量连续存储,但是有些实现的存储中可能有缺口,矩阵中两个向量之间的偏移量被称作列跨距或者行跨距GL_UNIFORM_MATRIX_STRIDE,可以在链接的程序中用glGetActiveUniformsiv查询。
(4)标量、向量和矩阵的数组按照元素的顺序存储于内存中,成员0放在最低偏移处,数组中每队元素之间的偏移是一个常数,称作数组跨距GL_UNIFORM_ARRAY_STRIDE,可以在链接的程序中使用glGetActiveUniformsiv查询。
除非使用std140统一变量块布局,这是默认选项,否则需要查询程序对象得到字节偏移和跨距,以在统一变量缓冲区对象中设置统一变量数据。std140布局保证使用由OpenGL ES 3.0规范定义的明确布局规范进行特定包装,因此,使用std140,就可以在不同的OpenGL ES 3.0之间共享统一变量块,其它包装格式可能使某些OpenGL ES 3.0实现以比std140布局更紧凑的方式打包数据。
下面是一个使用std140布局的命名uniform变量块MyBlock的例子:

layout (std140) uniform MyBlock
{
vec3 myDirection;
vec4 myPosition;
}

std140布局规定如下:
(1)标量变量:基线对齐是标量的大小,例如sizeof(GLint).
(2)2分量向量:某些对齐是基础分量类型大小的两倍。
(3)3分量或者4分量向量:基线对齐大小是基础分量类型大小的4倍。
(4)标量或者向量数组:基线对齐和数组跨距设置为匹配单元数组的基线对齐,整个数组被填充为vec4大小的倍数。
(5)C列R行的列优先矩阵:根据规则4,存储为一个由C个具有R个分量的向量组成的数组。行优先矩阵类似。
(6)M个C列R行的列优先矩阵组成的数组:根据规则4,存储为由MxC个具有R个分量的向量组成的数组。行优先矩阵类似。
(7)单个结构:根据前面的规则计算偏移和大小,结构的大小将填充为vec4大小的倍数。
(8)S个结构组成的数组:基线对齐根据数组元素的基线对齐计算,数组的元素根据规则9计算。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值