На самом деле я работаю над движком рендеринга OpenGL 3.3, именно я пытаюсь создать динамическое количество источников света в своей сцене.
Для этого я работаю с унифицированными буферными объектами (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
.
Вот код, выполняемый на ЦП, который я использовал для записи данных моего буфера, где 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 фокусных, 2 направленных и один точечный