C++ GLSL 数据对齐/填充
C++ GLSL data alignment/padding
我有一个C++类 Matrix4x4,它有一个 16 个浮点数的数组,没有虚方法:
class Matrix4x4
{
public:
float values[16];
Matrix4x4();
Matrix4x4(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8, float v9, float v10, float v11, float v12, float v13, float v14, float v15);
Matrix4x4(const Quaternion &quat, const Vector3 &pos);
void convertToQuatPos(Quaternion &quat, Vector3 &pos);
void loadIdentity();
void setValues(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8, float v9, float v10, float v11, float v12, float v13, float v14, float v15);
void setPerspective(float fov, float aspect, float nearPlane, float farPlane);
void setOrthographic(float top, float left, float bottom, float right, float nearPlane, float farPlane);
...
static void multiply3x3(const Matrix4x4 &m1, const Matrix4x4 &m2, Matrix4x4 &result);
static void multiply4x4(const Matrix4x4 &m1, const Matrix4x4 &m2, Matrix4x4 &result);
...
Matrix4x4 operator*(const Matrix4x4 &a);
Vector3 operator*(const Vector3 &a);
Vector4 operator*(const Vector4 &a);
};
我像这样将这些矩阵的向量传递给 GLSL(其中骨骼是 Matrix4x4 的 std::vector):
glUniformMatrix4fv(glGetUniformLocation(shader->getProgram(), "boneMatrices"), bones.size(), false, (GLfloat*) &bones[0].values[0]);
这显然假设 Matrix4x4 对象将仅占用 16 个浮点数的内存,没有对齐或填充问题。它使用MSVC工作正常,是否可以安全地假设它应该在其他平台(Linux,OSX,Android将来)e.t.c上运行?我应该对齐值数组并确保没有填充吗?
向标头添加静态断言至少可以防止填充Matrix4x4
数组元素的可能性(非常不可能):
#include <type_traits>
...
static_assert(
(sizeof(Matrix4x4) == (sizeof(GLfloat) * 16) &&
std::is_standard_layout<Matrix4x4>::value),
"Matrix4x4 does not satisfy contiguous storage requirements");
参见:std::is_standard_layout
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 哪些值存储在对齐的结构/类对象的填充字节中
- 关于数据对齐和填充的另一个困惑
- 如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
- 填充和对齐 - 误解
- 安腾ABI在多大程度上真正指定了填充和对齐
- 结构对齐填充、最大填充大小和结构成员顺序
- blob内部数据的对齐和填充
- C++ GLSL 数据对齐/填充
- Do 4字节对齐的指针使用任何填充
- 为什么堆栈上对齐的整数之间有 8 个字节的"0xcc"填充?C++ 32位视窗7
- c++中的结构对齐和填充
- 简单的结构对齐/填充问题
- 手动填充顶点结构以实现对齐
- 如何在OpenGL中正确填充和对齐std430布局中的数据
- c++.结构在不同平台上的填充/对齐和布局兼容性的自动检查
- 结构/类数据对齐和填充的算法
- 结构件对齐 - 是否可以假设没有填充