c++ - 假设结构数组的内存布局传递给 OpenGL 的潜在错误
问题描述
我正在关注 OpenGL 教程,在其中,将网格数据传递给视频卡的操作基本上如下:
#include <GL/glew.h>
#include <glm/glm.hpp>
struct Vertex {
...
private:
glm::vec3 pos;
glm::vec2 texCoord;
glm::vec3 normal;
};
Mesh::Mesh(Vertex * vertices, unsigned int numVertices) {
...
glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), vertices, GL_STATIC_DRAW);
...
}
但是,我认为这可能会导致问题,因为假设顶点将完美布局。或者是否保证 Vertex 字段将在没有填充的情况下按该顺序放置?另外,我不知道 glm::vec* 类型的布局或大小是什么。
我是否正确怀疑这可能会导致问题?
应该怎么做?
什么会影响结构的布局?
解决方案
只要您指定正确的属性指针,这种方法没有任何问题,例如:
glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, pos));
glVertexAttribPointer( ..., 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, texCoord));
glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, normal));
两者都sizeof
将offsetof
考虑可能发生的任何填充。
如果您想对实际布局进行更多控制,当然也可以使用#pragma pack
,它不是任何 C/C++ 标准的一部分,但被所有主要编译器所理解。实际上,存在 OpenGL 实现的平台上的实际编译器不会为您的原始结构布局添加任何填充,因此这可能是一个有争议的问题。
另外,我不知道
glm::vec*
类型的布局或大小是什么。
GLM 向量和矩阵是各自基本类型的紧密排列的数组,特别是float[N]
对于glm::vecN
.
推荐阅读
- azure-active-directory - MSAL.js - 隐式身份验证 - 回复 url 参数问题
- openssl - 如何使用 Openssl ca 将证书文件名保存在索引文件中
- reactjs - 制作自定义 url /myadmin 以安装和使用 react-admin 应用程序
- python - 如何使用客户端 ID 和 Secret 实现对 FastAPI 的 OAuth
- python-3.x - 如何在 Python 中调用另一个类函数的一个类输出?
- ruby-on-rails - 如何在 Rails 6 中转换时间戳(created_at)?
- c# - 在 tabitem 标题内的按钮单击事件期间发送 Tab
- php - 在 WooCommerce 产品类别页面循环中获取帖子计数
- c++ - 具有父命名空间的嵌套命名空间中的重载解决方案
- linux - 带有 Ansible 剧本的 shell 命令不起作用