C++ OpenGL:零活动制服

C++ OpenGL:零活动制服,c++,pointers,opengl,glsl,C++,Pointers,Opengl,Glsl,我指的是OpenGL超级圣经。我使用他们的框架来创建自己的程序。我想用接口块(特别是统一块)做一些事情。如果我打电话 glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets); 我得到一个错误,即GL\u无效\u值。 但是如果我用0而不是1调用同一个函数,它不会出错。我当时以为我没有现役制服。不过,我应该有三个。 如何激活它们?这是我的着色器: #version 450 core

我指的是OpenGL超级圣经。我使用他们的框架来创建自己的程序。我想用接口块(特别是统一块)做一些事情。如果我打电话

glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
我得到一个错误,即
GL\u无效\u值
。 但是如果我用0而不是1调用同一个函数,它不会出错。我当时以为我没有现役制服。不过,我应该有三个。 如何激活它们?这是我的着色器:

#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;                   
}                                       
             
以下是启动方法中的一些代码:

    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);

//fill buffer1 in a for-loop

    GLuint block_index = glGetUniformBlockIndex(program, "TransformBlock");
    glUniformBlockBinding(program, block_index, 0);
    glBindBufferBase(GL_UNIFORM_BUFFER, 0, (GLuint)buffer1);
    free(buffer1);
                
但是,由于函数返回
GL\u INVALID\u值
,调用出现错误:

*((float *)(buffer1 + offset)) = ...

整个程序中断了。如果不添加
偏移量
,我不会在这里得到错误,因此我认为第二个错误取决于第一个错误。

我认为在
glGetUniformIndicates
处出错,因为您在统一名称前面加了
TransformBlock
。你也不能用它来访问GLSL代码中带有前缀的制服。如果需要,必须为统一块设置一个实例名,该块名与访问/命名统一完全无关。仅当将访问同一接口块的多个着色器链接在一起时,它才用于匹配接口

我认为
glGetUniformIndications
会出错,因为您在统一名称前面加了
TransformBlock
。你也不能用它来访问GLSL代码中带有前缀的制服。如果需要,必须为统一块设置一个实例名,该块名与访问/命名统一完全无关。仅当将访问同一接口块的多个着色器链接在一起时,它才用于匹配接口

非常感谢!我认为这有很大帮助。现在我对我的问题进行了“编辑”。你也能帮我做这个吗?您可以在问题的底部找到编辑。我认为您需要在调用glDrawArrays之前在渲染函数中绑定UBO。非常感谢!我认为这有很大帮助。现在我对我的问题进行了“编辑”。你也能帮我做这个吗?您可以在问题的底部找到编辑。我认为您需要在调用glDrawArrays之前在渲染函数中绑定UBO。我认为您应该为一个全新的问题提出一个新问题。乍一看,现在看来你的vertex attrib指针设置是错误的。我只是想我必须再次对整个代码段进行注释。再次对相同的代码段进行注释有点多余。或者这是一个全新的问题,与现在的问题无关?可以说,在我将设置更改为基于块的统一结构之前,整个代码都工作了。所以我不知道问题是否出在顶点属性上。当然可能,我不是专家。如果这个问题是全新的,我当然会开始一个新的话题。看起来像一个全新的问题。我想你应该为一个全新的问题提出一个新的问题。乍一看,现在看来你的vertex attrib指针设置是错误的。我只是想我必须再次对整个代码段进行注释。再次对相同的代码段进行注释有点多余。或者这是一个全新的问题,与现在的问题无关?可以说,在我将设置更改为基于块的统一结构之前,整个代码都工作了。所以我不知道问题是否出在顶点属性上。当然可能,我不是专家。如果这个问题是全新的,我当然会开始一个新的话题。看起来像是全新的问题