Appopriate Container就像普通静态数组一样?

时间:2017-10-20 00:16:51

标签: c++ arrays opengl directx game-engine

我正在努力寻找一种在游戏引擎中实现动态光源的正确而快速的方法但有一些问题(我希望我的解释很好,因为我不是英国本土人)。

问题:

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

PointLight pointLights[NR_POINT_LIGHTS];

但我想添加灯光,所以NR_POINT_LIGHTS可能会增加,因为我添加了更多灯光,但当然NR_POINT_LIGHTS必须是静态const(我猜)我有这样的功能:

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

问题

是否有正确的方法来实现它,以便每次“烘焙”系统时,我都可以使用静态数组创建一个存储在堆栈中的结构并使其保持活动状态???

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

感谢。

1 个答案:

答案 0 :(得分:0)

不可能有一个对象可以改变它的大小,但通过sizeof返回正确的大小。 sizeof运算符在编译时进行求值,因此只能返回此时可用的大小。由于动态大小仅在运行时已知,因此无法按照您的意愿进行操作。

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