如何有效和动态地将多个制服传递给GLSL

Zik*_*332 8 c++ opengl glsl

我想在我的程序中传递一个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,这对我来说似乎是合理的)?

提前致谢.

脚注:

  1. 我可能在这里错了,所以如果我告诉我,我会删除它们.

eld*_*ldo 1

稍微修改一下你的第一个解决方案怎么样:

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)

仍然不完全是你想要的,但效果很好。