【发布时间】:2016-03-12 17:35:35
【问题描述】:
在我的宠物项目中,视频内存开始成为一个问题,因此我研究了各种技术来最大限度地减少内存占用。我尝试使用GL_INT_2_10_10_10_REV,但我使用我的打包方法得到了照明伪影。这些伪影似乎不是不准确的结果,因为使用标准化的char[3] 或short[3] 可以完美地工作。由于其他无用的填充,我更愿意使用更节省空间的GL_INT_2_10_10_10_REV。
这是包装代码:
union Vec3IntPacked {
int i32;
struct {
int a:2;
int z:10;
int y:10;
int x:10;
} i32f3;
};
int vec3_to_i32f3(const Vec3* v) {
Vec3IntPacked packed;
packed.i32f3.x = to_int(clamp(v->x, -1.0f, 1.0f) * 511);
packed.i32f3.y = to_int(clamp(v->y, -1.0f, 1.0f) * 511);
packed.i32f3.z = to_int(clamp(v->z, -1.0f, 1.0f) * 511);
return packed.i32;
} // NOTE: to_int is a static_cast
如果我正确阅读了spec(第 10.3.8 节,“打包顶点数据格式”和 2.1 和 2.2 中的转换规则),这应该可以工作,但它不会。
我还应该注意,上面的代码已经在多个操作系统上进行了测试(虽然都是 64 位,但int 仍然应该是 32 位)和显卡供应商检查它是否与驱动程序相关的问题。
此外,使用了 OpenGL 3.3 核心配置文件。
顶点结构组成如下:
struct BasicVertex {
float position[3];
unsigned short uv[2];
int normal;
int tangent;
int bitangent;
} // resulting in a 4-byte aligned 28 byte structure
希望我提供了足够的信息,并且有人可以阐明如何将法线正确打包到 GL_INT_2_10_10_10_REV。
【问题讨论】:
-
逐顶点内存真的会解决 VRAM 问题吗?通常处理渲染目标、MSAA、纹理压缩等使用的数据格式会更有效。
-
我应该更清楚一点,但除了原始内存要求之外,我将大量数据流式传输到 GPU 以最小化这种流量是最终目标。很抱歉忽略了这一点,我认为我的确切动机与问题无关。
-
不是,我只是想让您知道优化顶点缓冲区效率并不是最小化带宽或存储需求的最有效方法。当地表以下有一公里的冰层属于像素操作时,你有点像在冰山一角。
标签: opengl