我正在浏览这个页面,了解如何在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 ++标准中是否有一个强有力的保证,即不会插入更多的填充,或者这是一个"实际可移植"的交易?
基于对我的另一个问题的评论(gradle如何将文件javascript fies添加到war文件中的目录)我正在尝试使用angular-cli来帮助构建和管理角度项目.但是,我似乎无法找到有关如何在项目中创建第二个网页的任何文档,这对我来说似乎是一项非常基本的任务.我试着创建一个"组件" ng g component {component name},但这并没有为构建结果添加任何内容.