Я имею в виду OpenBL SuperBible. Я использую их рамки для создания собственной программы. Я хотел сделать что-то с интерфейсным блоком (в частности, унифицированным блоком) Если я позвоню
glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
Я получаю ошибку, а именно GL_INVALID_VALUE
.
Но если я вызываю ту же функцию с 0 вместо 1, это не делает эту ошибку. Тогда я предположил, что у меня нет активной формы. У меня должно быть 3 из них, как бы то ни было.
Как мне их активировать? Вот мой шейдер:
#version 450 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
out vec4 vs_color;
uniform TransformBlock {
mat4 translation;
mat4 rotation;
mat4 projection_matrix;
};
void main(void)
{
mat4 mvp = projection_matrix * translation * rotation ;
gl_Position = mvp * position;
vs_color = color;
}
Здесь я предоставлю вам фрагмент кода из моего метода запуска:
/////////////////////////////////
vmath::mat4 transl_matrix = vmath::translate(0.0f, 0.0f, -3.0f);
vmath::mat4 rot_matrix = vmath::rotate( 30.0f, 0.0f, 0.5f, 1.0f);
vmath::mat4 proj_matrix = vmath::perspective(60.0f, (float)info.windowWidth / (float)info.windowHeight, 0.1f, 10.0f);
//////////////////
static const GLchar * uniformNames[3] = {
"TransformBlock.translation",
"TransformBlock.rotation",
"TransformBlock.projection_matrix",
};
GLuint uniformIndices[3];
glUseProgram(program);
glGetUniformIndices(program, 3, uniformNames, uniformIndices);
GLint uniformOffsets[3];
GLint matrixStrides[3];
glGetActiveUniformsiv(program, 3, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
glGetActiveUniformsiv(program, 3, uniformIndices, GL_UNIFORM_MATRIX_STRIDE, matrixStrides);
unsigned char * buffer1 = (unsigned char*)malloc(4096);
//GLuint * buffer1 = (GLuint *) malloc(4096);
int j;
for (int i = 0; i < 4; ++i) {
GLuint offset = uniformOffsets[0] + matrixStrides[0] * i;
for (j = 0; j < 4; ++j) {
*((float *)(buffer1 + offset)) = transl_matrix[i][j];//
offset += sizeof(GLfloat);
}
}
for (int i = 0; i < 4; ++i) {
GLuint offset = uniformOffsets[1] + matrixStrides[1] * i;
for (j = 0; j < 4; ++j) {
*((float *)(buffer1 + offset)) = rot_matrix[i][j];
offset += sizeof(GLfloat);
}
}
for (int i = 0; i < 4; ++i) {
GLuint offset = uniformOffsets[2] + matrixStrides[2] * i;
for (j = 0; j < 4; ++j) {
*((float *)(buffer1 + offset)) = proj_matrix[i][j];
offset += sizeof(GLfloat);
}
}
GLuint block_index = glGetUniformBlockIndex(program, "TransformBlock");
glUniformBlockBinding(program, block_index, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, (GLuint)buffer1);
free(buffer1);
Настоящим я ссылаюсь на 5-ю главу (называемую «Данные») вышеупомянутой SuperBible.
Однако в результате функции, возвращающей GL_INVALID_VALUE
, произошла ошибка при вызовах:
*((float *)(buffer1 + offset)) = ...
и вся программа прерывается. Без добавления offset
я не получаю ошибку здесь, поэтому я думаю, что вторая ошибка зависит от первой ошибки.
Спасибо за любые ответы.
Edit:
Задача, которую я дал вам решить, теперь работает. Я изменил переменную uniformNames
. Теперь они у меня без ключевого слова TransformBlock
. Однако теперь я получаю другую ошибку в моей функции render () с glDrawArrays
. Я покажу свою функцию render () - здесь:
virtual void render(double currentTime) {
const GLfloat color[] = {(float)sin(currentTime)*0.5f + 0.5f, (float)cos(currentTime)*0.5f + 0.5f, 0.0f, 1.0f};
glClearBufferfv(GL_COLOR, 0, color);
glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
Сообщение об ошибке было что-то вроде этого:
Access violation by reading at position 0x00000125.
Может ли это быть из-за того, что не все остальное работает или мне нужно вызывать другую функцию рисования вместо glDrawArrays
?