GLSL — Странное поведение объекта с унифицированным буфером

Я заметил странное поведение объекта единого буфера, когда я меняю порядок членов структуры (структура в шейдере такая же, как структура в cpp). Это мой исходный код (рабочая версия):

CPP:

struct Matrices {
// vec3, mat4 - glm library
mat4 projectionMatrix;
mat4 viewMatrix;
vec3 eyePosition;
};

GLSL:

layout (std140) uniform matrices {
mat4 projectionMatrix;
mat4 viewMatrix;
vec3 eyePosition;
};

CPP Ubo поколения:

GLuint tmpUBO[2];
glGenBuffers(2, tmpUBO);
uniformBlocks["matrices"].bindingPoint = MATRICES_BINDING_POINT;
uniformBlocks["matrices"].ubo = tmpUBO[0];
glBindBuffer(GL_UNIFORM_BUFFER, tmpUBO[0]);
glBufferData(GL_UNIFORM_BUFFER, sizeof(Matrices), &matrices, GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);

CPP обновление данных UBO:

glBindBuffer(GL_UNIFORM_BUFFER, uniformBlocks["matrices"].ubo);
GLvoid *p =
glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(Matrices),
GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
memcpy(p, &matrices, sizeof(Matrices));
glUnmapBuffer(GL_UNIFORM_BUFFER);
glBindBuffer(GL_UNIFORM_BUFFER, 0);

CPP привязка UBO к связанному и активному шейдеру:

GLuint bi = glGetUniformBlockIndex(handle, name);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, ubo);
glUniformBlockBinding(handle, bi, bindingPoint);

Эта версия работает совершенно нормально, но когда я меняю порядок членов структуры (как в glsl, так и в cpp), например:

struct Matrices {
vec3 eyePosition;
mat4 projectionMatrix;
mat4 viewMatrix;
}

одна или обе матрицы не обновляются, когда я перемещаю камеру или меняю перспективу.

Кто-нибудь знает, что это вызывает?

0

Решение

Я нашел ответ на этом сайте http://www.opentk.com/node/2926. Проблема была с выравниванием структурных переменных в шейдере.

2

Другие решения


По вопросам рекламы [email protected]