OpenGL统一标准缓冲区对齐混淆
OpenGL Uniform Standard Buffer Alignment confusion
我一直在阅读关于OpenGL Superbible第6版中的std140统一块,其中在第111页给出了以下示例:
layout(std140) uniform TransformBlock
{
//Member base alignment offset aligned offset
float scale ; // 4 0 0
vec3 translation; // 16 4 16
float rotation[3]; // 16 28 32 (rotation[0])
// 48 (rotation[1])
// 64 (rotation[2])
mat4 projection_matrix; // 16 80 80 (column 0)
// 96 (column 1)
// 112 (column 2)
// 128 (column 3)
}
我很难理解对齐,即使使用在该页前面描述的规则,它仍然没有意义。具体来说,让我困惑的是:
什么是偏移量,什么是对齐偏移量,为什么2个不同的偏移量?
为什么旋转[0]偏移量从28开始,为什么对齐偏移量是32?
什么是偏移
变量的字节偏移量,如果不符合其对齐要求,将具有。
和什么是对齐偏移,
实际的字节偏移量。
为什么2个不同的偏移?
因为如果变量有不同的对齐要求,那么实际偏移量就会不同。例如,给定上面的代码,由于translation
的对齐要求,其对齐偏移量为16。然而,如果translation
是float
,那么它的对齐偏移量将为4。如果它是vec2
,它的对齐偏移量将为8。
为什么旋转[0]的偏移量从28开始,
因为vec3
(这是你应该永远不要使用的东西)是3个浮点数。
为什么对齐偏移量是32?
因为在std140规则下,任何数组的基本对齐方式,无论其元素的类型如何,总是四舍五入到vec4
的对齐方式。又名:16字节
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 不正确的 Vulkan 统一缓冲区内存对齐
- 将缓冲区与 N 字节边界对齐,而不是 2N 字节边界?
- 一个粒子太多:GL_INVALID_VALUE生成错误。<start> 不满足着色器存储缓冲区的最低对齐要求
- 如何在堆栈上对齐缓冲区
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 页面对齐的套接字发送缓冲区
- 为什么缓冲区应该在 64 字节边界上对齐以获得最佳性能
- 对缓冲区使用正确的对齐方式,该缓冲区应该容纳C++中的结构
- Direct3D11缓冲区对齐要求
- OpenGL统一标准缓冲区对齐混淆
- DeviceIoControl缓冲区参数的编组和对齐
- 统一缓冲区对象未对齐.GLSL访问中断