use*_*315 2 opengl renderer glsl floating-point-precision
我正在用C ++编写OpenGL渲染器。我希望它尽可能高效,并且每个顶点/法线/ UV tex坐标/切线/等都占用尽可能少的内存。我正在使用索引,线带和风扇。我以为32位浮点数不是必需的,而16位浮点数应该没问题,至少对于其中一些像法线和UV而言。我似乎在任何地方都找不到任何示例。我可以找到“ GL_HALF_FLOAT”的话题,但没有真实的例子。我在正确的轨道上吗?还是不值得一看?如果有人知道这样的示例,他们可以发送源代码链接吗?
在完整的OpenGL中(与OpenGL ES不同),着色器代码始终使用32位浮点运算。从OpenGL 3.0开始,支持将顶点数据指定为半浮点数。如果精度足以满足您的需求,则可以减少顶点数据的内存使用量,并减少顶点获取所需的带宽。
请记住,半浮点数的精度仅为大约3-4个十进制数字。因此精度确实受到严重限制。
至于如何使用它们,这非常简单。如果您有一个指向半浮点值的指针,则可以使用glBufferData()或将它们存储在VBO中glBufferSubData(),就像处理任何其他类型一样。然后,glVertexAttribPointer()调用将如下所示,以具有3个组件的属性为例:
glVertexAttribPointer(loc, 3, GL_HALF_FLOAT, GL_FALSE, 0);
Run Code Online (Sandbox Code Playgroud)
数据本身的格式在ARB_texture_float扩展中定义。虽然没有正式命名,但它看起来至少与IEEE 754-2008格式非常相似。之前,我是根据该Wikipedia格式描述编写转换代码的,并且在OpenGL的使用中效果很好。
大多数语言没有用于半浮点数的内置类型。因此,您要么必须编写几行代码来完成从float到half-float的转换,要么使用别人编写的代码。
以下有关半浮点转换的资源来自快速搜索。我对其中任何一个都没有亲身经历,因此,您应该自己进行搜索以找到最适合您的需求:
_mm256_cvtps_ph从浮点数转换为半浮点数的内在函数)。__fp16ARM目标的半浮点类型()。| 归档时间: |
|
| 查看次数: |
2908 次 |
| 最近记录: |