相关疑难解决方法(0)

当c ++没有指定struct layout时,为什么glBufferData缓冲区可以用于UBO和SSBO

我正在浏览这个页面,了解如何在openGL中使用统一缓冲区对象,并看到以下结构:

struct shader_data_t
{
    float camera_position[4];
    float light_position[4];
    float light_diffuse[4];
} shader_data;
Run Code Online (Sandbox Code Playgroud)

使用缓冲区缓冲到openGL Uniform Buffer Object中

GLuint ubo = 0;
glGenBuffers(1, &ubo);
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
glBufferData(GL_UNIFORM_BUFFER, sizeof(shader_data), &shader_data, GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

并在着色器中使用

...
layout (std140) uniform shader_data
{ 
  vec4 camera_position;
  vec4 light_position;
  vec4 light_diffuse;
};
...
Run Code Online (Sandbox Code Playgroud)

但是,当glBufferData转换结构指针和void指针时,我不明白openGl如何知道如何将结构中的数据映射到制服,这应该使openGL不知道结构的内存布局.c ++ struct layout是实现定义的,虽然UBO的作者和其他用户用虚拟变量手动填充c ++结构以匹配着色器中的标准化std140布局,但是什么阻止c ++编译器添加更多填充并破坏布局?在c ++标准中是否有一个强有力的保证,即不会插入更多的填充,或者这是一个"实际可移植"的交易?

c++ opengl struct

3
推荐指数
1
解决办法
677
查看次数

标签 统计

c++ ×1

opengl ×1

struct ×1