glGetUniformLocation调用使程序崩溃

时间:2018-07-17 19:06:22

标签: opengl glsl

下面的代码块按原样正常工作。但是,如果我取消对glGetUniformLocation()的调用的注释,它将在该行崩溃:

GLint pipeline;
glGenProgramPipelines(1, &pipeline);
glUseProgram(0);
glBindProgramPipeline(pipeline);

GLint vert_pgm = glCreateShaderProgramv(...);
glUseProgramStages(pipeline, GL_VERTEX_SHADER_BIT, vert_pgm);

GLint frag_pgm = glCreateShaderProgramv(...);
glUseProgramStages(pipeline, GL_FRAGMENT_SHADER_BIT, frag_pgm);

//  If I uncomment the line below, it crashes:
//
//  GLint myArg_loc = glGetUniformLocation(frag_pgm, "material_id");

glBindBufferBase(GL_UNIFORM_BUFFER, ubo_index, mp_data->ubo);
glBindVertexArray(vao);
glEnableVertexAttribArray(0)
...
glEnableVertexAttribArray(10)
glBindVertexBuffer(...);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLES, ...);

片段着色器的输入声明如下:

layout( binding = 0, std140, column_major ) 
uniform uniform_data
{
    transform_data transform;
    material_data  material;
    lighting_data  lighting;
    vec4 select;
    vec4 normal;
} 
uniforms;

uniform int material_id;

in attribute_data
{
    smooth vec4 pos;
    smooth vec4  colour;
    smooth float radius; 
    smooth vec3  tangent; 
    smooth vec3  normal;    
    flat int  face_id;
}
inputs;

有人知道为什么它崩溃了吗?

在同一着色器中同时使用接口块和各个制服是否合法?

1 个答案:

答案 0 :(得分:0)

检查: NULL指针递归

我的glGetUniformLocation包装函数正在调用自身,而不是 而不是它应该包装的函数指针。具有讽刺意味的是,包装功能是为了保护我。它会检查以确保函数指针不为空,如果存在,则会引发错误。

typedef  
    GLint                                     
    (*PFN_glGetUniformLocation)               
    (                                         
    /**/    GLuint         program 
    ,       const GLchar*     name 
    ); 

PFN_glGetUniformLocation                   
pfn_glGetUniformLocation;                  

GLint                                      
glGetUniformLocation                       
(                                          
/**/    GLuint         program 
,       const GLchar*     name 
){           
    //! My Mistake:                  !//
    //! Exists(glGetUniformLocation);!//
    //! return(glGetUniformLocation( !//       
    //!     program, name            !//
    //! ));;                         !//

        //:My Fix:
        Exists(pfn_glGetUniformLocation);
        return(pfn_glGetUniformLocation(         
            program, name 
        ));;     
} 

如果函数指针为NULL,则“存在”会引发错误。

“ pfn”是“指向函数的指针”的前缀