【发布时间】:2021-12-03 09:17:41
【问题描述】:
// test data brick
class Brick
{
public:
Brick() { data = new U32[27]; }
virtual ~Brick() { delete[] data; }
U32* data;
};
Texture3D* OctreeMipmapper::GenerateBrickTexture()
{
auto ret = new Texture3D();
ret->Initialize();
ret->Storage(GL_R32UI, SV3(g_brickSize)); // g_brickSize = 3u, SV3 is a 3d-signed-int-vec
ret->SetScaleFilter(GL_LINEAR, GL_LINEAR);
ret->SetWrapFilter(GL_CLAMP_TO_BORDER);
ret->SetBorderColorIiv(SV4{ 0u, 0u, 0u, 0u });
//ret->GenerateBindlessImageHandle(GL_R32UI);
return ret;
}
void OctreeMipmapper::InitOctreeBrick()
{
auto texNum = m_octree->GetTexNum(); // texNum = 600000u
m_albedoBricks.resize(texNum);
m_normalBricks.resize(texNum);
m_bricks.resize(texNum);
for (U32 i = 0u; i < texNum; ++i)
{
m_bricks[i] = new Brick();
m_albedoBricks[i] = GenerateBrickTexture();
//m_normalBricks[i] = GenerateBrickTexture();
}
}
上面是我的源码,可以看到,bricks向量的数量是600000,贴图是3d单通道贴图,27 texel(3 * 3 * 3)。因此,数据大小为 600000 * 27 * 4 字节 = 64MB。但是当我运行代码时,这些纹理的内存使用量超过 3GB,这让我很困惑。我想要opengl在glTextureStorage3D函数中做了什么
【问题讨论】:
标签: c++ opengl memory graphics octree