下面的代码块按原样正常工作。但是,如果我取消对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;
有人知道为什么它崩溃了吗?
在同一着色器中同时使用接口块和各个制服是否合法?
答案 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”是“指向函数的指针”的前缀