像普通静态数组一样的适当容器?
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。因此,您始终必须为整个着色器数组提供数据。如果你想改变灯的数量,你必须重新编译着色器。
我正在努力寻找一种正确且快速的方法来在游戏引擎中实现动态光,但遇到了一些问题(我希望我的解释足够好,因为我不是英语母语者)。
问题:
我需要一种方法来存储向量数组(每个数组有 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。因此,您始终必须为整个着色器数组提供数据。如果你想改变灯的数量,你必须重新编译着色器。