【发布时间】:2014-10-24 03:44:22
【问题描述】:
我有一个用 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 优化了未使用的制服这一事实,所以我必须跟踪 glsl 以认为制服以某种方式被使用,以便能够获取数据。我无法找到任何其他方法来查询程序以获取常量值。有没有人知道我如何能够从着色器中提取一个常量,以便我的程序获取在着色器中进行功能编码的信息以供使用?
【问题讨论】:
-
一般来说,以这种方式编写的常量字面量在着色器编译后会变成制服。在 NV GLSL 实现上,它可能被称为
_main_NUM_POINT_LIGHTS。我建议您枚举程序中的所有制服,看看是否会发生这种情况。我不确定你最终要完成什么......如果你想要一个数据数组,你最好使用 UBO,因为它不受相同的约束(例如,制服的最大数量组件)作为制服。 -
我假设 UBO 的组件计入了统一组件的最大数量,尽管通过添加一个包含多个元素的数组相对容易确认它们没有片段着色器的 2048 个统一组件的 460m 上限。我实际上为此使用了 UBO,但即使使用 UBO,如果能够让 c++ 程序动态确定它可用的灯的数量,那就太好了。我会看看创建了哪些制服,尽管这听起来像是一个可能无法移植到其他硬件的解决方案。
-
没有这样的运气,我的常数没有制服。
标签: c++ opengl glsl constants shader