像普通静态数组一样的适当容器?

Appopriate Container that acts like normal static array?

我正在努力寻找一种正确且快速的方法来在游戏引擎中实现动态光,但遇到了一些问题(我希望我的解释足够好,因为我不是英语母语者)。

问题:

我需要一种方法来存储向量数组(每个数组有 4 个浮点数)在堆栈上 以便编译器可以通过 sizeof 运算符识别它的大小并且我可以轻松访问数据,最简单的方法是:

PointLight pointLights[NR_POINT_LIGHTS];

但我想添加灯光,所以 NR_POINT_LIGHTS 可能会随着我添加更多灯光而增加,但当然 NR_POINT_LIGHTS 必须是静态常量(我猜)我有这样的功能:

class LightSystem{
 void BakeMyLights()
 {
   struct 
   {
      //PointLight pointLights[nooflights];//Sorry not possible since nooflights isn't const

      //PointLight pointLights[(const int)nooflights]; //Also fails as nooflights isn't a real constant "you can change it with func parameter

      //std::anycontainer<PointLight> pointLights; // Sizeof operator gives size of the internal pointer which isn't required also it is required to be on stack

    }ubo;

    MyLovely_OpenGL_And_DirectX_UBO.Update(&ubo,sizeof(ubo));
 }
    private:
    int nooflights;
};

我一直在使用的东西(我想替换的旧代码)...

    struct SHADERUBO_t {

    // 4 float = 4x4 = 16 byte
    Math::Vector4 camPosandMaterialshininess;

    // 3 vector4 = 3x16 = 48 byte
    _PointLight pointLights[4];

}ShaderUBO; //16 + 48 = 64


MyLovely_OpenGL_And_DirectX_UBO.Update(&ShaderUBO,sizeof(ShaderUBO));
//                                      ^^^^^^^^^ , ^^>>> Gets correct Size 64
// ShaderUBO allocated on stack so Opengl access its data correctly

问题

是否有正确的方法来实现它,以便每次我 "Bake" 系统都可以创建一个包含静态数组的结构,该结构存储在堆栈中并保持活动状态???

另外,上面显示的所有代码都是伪代码,并不是实际的实现。

谢谢。

不可能有一个对象可以改变它的大小,但 return 通过 sizeof 是正确的大小。 sizeof 运算符在编译时进行评估,因此只能 return 此时可用的大小。由于仅在运行时才知道动态大小,因此无法执行您想要的操作。

除了 C++ 方面的问题(可以通过分两步上传数据来解决,首先是矩阵,然后是具有正确偏移量的点光源数据),OpenGL 中的 UBO 只能包含具有常量的数组长度。不确定长度的数组仅适用于 SSBO。因此,您始终必须为整个着色器数组提供数据。如果你想改变灯的数量,你必须重新编译着色器。