我尝试使用uniform vec3
将glGetnUniformfv
从片段着色器获取到CPU。根据文档,这应该可以正常工作。当仅从着色器获取float
时,它也起作用。但是当这样使用时,
float f[3] = {0.0f};
glGetnUniformfv(program,glGetUniformLocation(program,name.c_str()),3,f);
我的程序崩溃了。我检查了glGetUniformLocation
,但输出有效。
我尝试使用uniform vec3
将glGetnUniformfv
从片段着色器获取到CPU。根据文档,这应该可以正常工作。当仅从着色器获取float
时,它也起作用。但是当这样使用时,
float f[3] = {0.0f};
glGetnUniformfv(program,glGetUniformLocation(program,name.c_str()),3,f);
我的程序崩溃了。我检查了glGetUniformLocation
,但输出有效。
glGetnUniform
函数族的第三个参数实际上不是数组中的条目数。它是f
指向的数组的字节大小。由于f
是一个数组,而不仅仅是指向数组的指针,因此它将是sizeof(f)
。
现在,您的实现不应该崩溃,因此可能还有其他事情发生。但这就是您提供的代码中的问题。
,除非您使用的是实际上支持OpenGL 4.5+的上下文,否则请使用“旧方法”获取vec3,如下所示:
float f[3] = {0.0f};
glGetUniformfv(program,glGetUniformLocation(program,name.c_str()),f);
仅在桌面上使用的新glGet n 统一入口点是为了提高安全性而存在的,类似于strncpy vs strcpy。
另外,如果您使用glGet n 变体,则应该为 bufSize 传递12而不是3,因为它是字节数。