代码之家  ›  专栏  ›  技术社区  ›  Zlixine

与普通静态数组类似的适当容器?

  •  0
  • Zlixine  · 技术社区  · 7 年前

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

    问题是:

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

    PointLight pointLights[NR_POINT_LIGHTS];
    

    但我想在NR\u POINT\u处添加灯光,因此随着我添加更多灯光,NR\u POINT\u灯光可能会增加,但当然,NR\u POINT\u灯光必须是静态常数(我猜),我有一个这样的函数:

    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 回复  |  直到 7 年前
        1
  •  0
  •   BDL Vyxzl    7 年前

    不可能有一个可以更改其大小但通过返回正确大小的对象 sizeof . 这个 sizeof公司 运算符在编译时求值,因此只能返回此时可用的大小。由于动态大小只有在运行时才知道,所以不可能实现您想要的操作。

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