【发布时间】:2018-04-12 13:43:30
【问题描述】:
我实际上正在使用 OpenGL 3.3 渲染引擎,我正试图在我的场景中创建动态数量的灯光。
为此,我正在使用统一缓冲区对象 (UBO),当我尝试通过 UBO 传递数据时遇到问题,该 UBO 将在具有不同类型数据的结构中读取或写入。
我为点光源和定向光源做了这个,一切都很好,因为我只使用vec3 数据。问题是当我定义焦点灯时,结构是:
#version 330 core
#define MAX_NUM_TOTAL_LIGHTS 100
...
struct FocalLight{
vec3 f_light_position;
vec3 f_light_direction;
vec3 f_light_diffuse_intensity;
vec3 f_light_specular_intensity;
float f_apperture_angle;
float f_attenuation;
};
layout(std140) uniform focalLights{
FocalLight f_lights[MAX_NUM_TOTAL_LIGHTS];
};
嗯,位置、方向、漫反射强度和镜面反射强度都很好,我的片段从缓冲区正确接收了这些数据。但我无法读写f_apperture_angle 和f_attenuation 的数据。
这是在 CPU 上执行的代码,我用来写入缓冲区数据,其中 focal_lights 是一个向量,其中包含我的 FocalLight 类 (std::vector<FocalLight> focal_lights) 的实例,我检查的内容是正确的:
if(block_focal_lights_id != -1) {
glUniformBlockBinding(programId, block_focal_lights_id, 2);
//Loading from light vectors
glGenBuffers(1, &buffer_focal_lights_id);
glBindBuffer(GL_UNIFORM_BUFFER, buffer_focal_lights_id);
glBufferData(GL_UNIFORM_BUFFER, sizeof(float) * 24 * focal_lights.size(), 0, GL_DYNAMIC_DRAW);
int offset = 0;
for (unsigned int i=0; i<focal_lights.size(); i++) {
glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(float) * 3, focal_lights[i].position);
offset += 16;
glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(float) * 3, focal_lights[i].direction);
offset += 16;
glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(float) * 3, focal_lights[i].diffuse_intensity);
offset += 16;
glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(float) * 3, focal_lights[i].specular_intensity);
offset += 16;
glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(float), &focal_lights[i].apperture_angle);
offset += 16;
glBufferSubData(GL_UNIFORM_BUFFER, offset, sizeof(float), &focal_lights[i].attenuation);
offset += 16;
}
}
我尝试将我的f_apperture_angle 的数据类型更改为vec3,我可以使用之前定义的偏移量读取它,但对于使用简单的浮点数没有任何意义。我确定缓冲区的绑定是正确的,并且我知道问题出在glBufferData 或glBufferSubdata 代码上。
有人发现问题了吗?
终于成功了,感谢Rabbid76: 2 focal lights, 2 directional lights and one point light
【问题讨论】:
-
我做到了,但我认为每个变量使用一个浮点数更干净。
-
尝试不同的内存布局,通过
layout(std430) uniform focalLights而不是std140