【问题标题】:Declaring array in GLSL based on uniform int基于uniform int在GLSL中声明数组
【发布时间】:2015-05-26 17:50:56
【问题描述】:

在我编写的程序中,我必须生成多个光源并传递给着色器。由于这个数字是在着色器之外定义的,我想通过uniform int 传递它并使用它来声明数组大小。

uniform int numLights;
uniform vec4 ambientColor;
uniform vec4 specularColor;
uniform vec3 diffuseColor[numLights];
uniform vec3 vLightPosition[numLights];

但是,我现在遇到了很多错误:

我不能这样做吗?问题是我正在考虑改变预定义灯光数量的可能性,例如忘记更新着色器。我的尝试是防止这种情况发生。

【问题讨论】:

  • 真的不知道如何通过你展示的这个问题来做到这一点,@Axalo。 :S
  • uniform vec3 diffuseColor[numLights]; numLights 必须是常量而不是统一的。
  • 将错误发布为文本,而不是屏幕截图。
  • 我做不到,@genpfault。 VS 不允许我复制文本。

标签: c++ arrays opengl glsl uniform


【解决方案1】:

GLSL 遵循 C 规则,即在编译时必须知道数组大小。

GLSL 有一个预处理器,但除了作为源代码之外,没有其他方法可以提供预处理器值。因此,您需要将合适的#define 语句生成为字符串并将它们提供给glShaderSource,然后再提供该着色器的源代码——对glShaderSource 的调用会在编译之前累积传递给它们的所有文本,所以这是相同的将额外的字符串作为源文件的前缀。

然后,您需要在每次更改灯光数量时重新编译,而不仅仅是提供制服。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2016-05-15
    相关资源
    最近更新 更多