我有一个用GLSL编写的着色器,其中包含一个结构体数组来存储光照数据。我使用常量来声明数组大小,这是一个好习惯。假设变量声明如下:
const int NUM_POINT_LIGHTS = 100;
我该如何使用C++从着色器中提取这些数据,以便我的C++程序准确地知道它可用的灯光数量?我已经尝试将其声明为
const uniform int NUM_POINT_LIGHTS = 100;
正如预期的那样,这并没有起作用(尽管奇怪的是,似乎统一规范简单地覆盖了const规范,因为OpenGL抱怨我正在使用非const值初始化数组)。我还尝试过
const int NUM_POINT_LIGHTS = 100;
uniform numPointLights = NUM_POINT_LIGHTS;
这种方法是可行的,但是由于GLSL会优化掉未使用的uniform变量,所以我必须让GLSL误认为这个uniform变量被使用了,才能获取到数据。我没有找到其他查询程序以获取常量值的方法。有没有人有什么想法可以从着色器中提取常量,使我的程序能够获取编码在着色器中的信息并加以使用?
_main_NUM_POINT_LIGHTS
。我建议您枚举程序中的所有统一变量,以查看是否发生了这种情况。不过,我真的不确定您最终想要实现什么...如果您想要一个数据数组,最好使用UBO,因为它不受统一变量的相同限制(例如最大统一变量组件数)的约束。 - Andon M. Coleman