OpenGL: ноль активных форм - PullRequest
0 голосов
/ 30 июня 2018

Я имею в виду 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?

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, что в glGetUniformIndices все идет не так, потому что вы поставили перед своими униформными именами TransformBlock. Вы также не используете это для доступа к униформе с этим префиксом в коде GLSL. Если вы этого хотите, вам нужно было бы установить имя экземпляра для унифицированного блока, имя блока вообще не имеет отношения к доступу / наименованию униформ. Он используется только для сопоставления интерфейсов, если вы связываете несколько шейдеров, обращающихся к одному и тому же блоку интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...