跨c ++和glsl代码共享预处理器宏?

mor*_*des 3 c++ macros glsl c-preprocessor

我正在为openGL程序设置照明.我希望能够轻松调整C++中的光源数量,而无需触摸我的着色器

在我的C++代码中:

#define NUM_LIGHTS 5
GLfloat lightposn [4 * NUM_LIGHTS];
Run Code Online (Sandbox Code Playgroud)

在我的glsl代码中:

 uniform vec4 lightposn[NUM_LIGHTS];
Run Code Online (Sandbox Code Playgroud)

如何将此NUM_LIGHTS值传递给我的着色器?是否可以在着色器中使用c ++文件中定义的宏?还有另一种简单的方法可以在我的c ++代码和我的glsl代码中设置NUM_LIGHTS吗?

Chr*_*odd 6

将包含#defines在其中的头文件读入一个字符串,并通过将其传递给glShaderSource第一个来将其"前置"到着色器

char *shader_src[3];
shader_src[0] = "#version ...\n";
shader_src[1] = ReadHeaderFile(....);
shader_src[2] = ReadShaderSourceFile(....);
glShaderSource(shader, 3, shader_src, NULL);
...compile, link, and check for errors...
Run Code Online (Sandbox Code Playgroud)