我想在我的程序中传递一个struct数组,我知道有几种方法可以做到这一点,但我想有效地做,这是我知道我可以做的:
我可以使用简单的创建一个结构,包含我想要传递给着色器的东西,并创建一个可以传递多少的数组:
struct Light
{
vec3 Position;
vec3 diffuse;
float Intensity;
};
#define NUM_OF_LIGHTS 5
uniform Light lights[NUM_OF_LIGHTS];
Run Code Online (Sandbox Code Playgroud)
优点:真的很容易做到.
缺点:它不是动态的,我需要选择最大量的灯,我想避免这样做.
我可以使用我在opengl.org上读到的 Uniform Blocks Objects(UBO),我可以从OpenGL 4.0使用数组(顺便说一下,这是我的目标,(考虑4.1)).
优点:清洁(?)要做.可能会更快(?)1
缺点:仍然,不是动态的.
着色器存储块对象(SSBO)是另一种选择,但我不能使用它们,因为它们是4.3版本的核心.对我不好,因为据我所知,它们是动态的,这就是我想要的.
我找不到任何关于如何按照我想做的事情传递的东西.
如果我不能这样做,游戏引擎如何在不知道用户将输入多少灯光的情况下创建多个灯光(考虑到他们使用OpenGL并且他们的目标是3.X到4.0,这对我来说似乎是合理的)?
提前致谢.
脚注:
稍微修改一下你的第一个解决方案怎么样:
struct Light
{
vec3 Position;
vec3 diffuse;
float Intensity;
};
#define MAX_NUM_OF_LIGHTS 50 //define max number of lights
uniform Light lights[MAX_NUM_OF_LIGHTS];
uniform int number_of_lights //the actual number of lights, for loops
Run Code Online (Sandbox Code Playgroud)
仍然不完全是你想要的,但效果很好。