我正在用C++编写一个OpenGL渲染器。我希望它尽可能高效,每个顶点/法线/UV纹理坐标/切线等占用的内存尽量少。我使用索引、线条和扇形。我认为32位浮点数并不是必需的,16位浮点数应该足够了,至少对于一些像法线和UV这样的属性来说。但我似乎找不到任何关于这方面的例子。我可以找到有关"GL_HALF_FLOAT"的讨论,但没有实际的示例。我走在正确的道路上吗?或者这不值得深入研究?如果有人知道这方面的示例,请发送源代码链接。
我正在用C++编写一个OpenGL渲染器。我希望它尽可能高效,每个顶点/法线/UV纹理坐标/切线等占用的内存尽量少。我使用索引、线条和扇形。我认为32位浮点数并不是必需的,16位浮点数应该足够了,至少对于一些像法线和UV这样的属性来说。但我似乎找不到任何关于这方面的例子。我可以找到有关"GL_HALF_FLOAT"的讨论,但没有实际的示例。我走在正确的道路上吗?或者这不值得深入研究?如果有人知道这方面的示例,请发送源代码链接。
glBufferData()
或glBufferSubData()
将它们存储在VBO中,就像对任何其他类型一样。然后,glVertexAttribPointer()
调用将如下所示,以一个具有3个组件的属性为例:glVertexAttribPointer(loc, 3, GL_HALF_FLOAT, GL_FALSE, 0);
数据本身的格式是在ARB_texture_float扩展中定义的。尽管它没有官方名称,但它看起来至少非常类似于IEEE 754-2008格式。我以前根据维基百科的格式描述编写了转换代码,并且对于OpenGL使用工作正常。
大多数语言都没有内置的半浮点类型。因此,您要么需要编写几行代码将float转换为half-float,要么使用其他人编写的代码。
以下关于半浮点转换的资源是通过快速搜索得到的。我个人没有任何经验,您应该自行搜索找到最适合您需求的资源:
_mm256_cvtps_ph
内部函数用于将浮点数转换为半精度浮点数)。__fp16
)。
uint
数据类型来打包和解包两个半精度浮点数。但在GLSL中,你能得到的最小数据类型是32位。请参阅uint packHalf2x16( vec2 v)
以获取更多详细信息。 - Andon M. ColemanHALF_FLOAT
数据。当它到达着色器时,它当然会被扩展为32位精度,但如果半浮点足够精确,则仍然可以节省内存空间和带宽。 - Reto Koradi