Math 针对半浮点数优化GLSL

Math 针对半浮点数优化GLSL,math,optimization,floating-point,glsl,precision,Math,Optimization,Floating Point,Glsl,Precision,在阅读过程中,我在第4.4.1节中找到了一些有趣的段落,内容是关于优化半精度floats的GGX NDF近似实现。我知道计算1-点(n,h)*点(n,h)会导致所谓的问题,为什么使用叉积可以解决这个问题,但是我不知道这与半精度floats有什么关系 不同于(从D3D10开始,它只是将其映射到float)。Filame的特点是,它最初是为Android这样的移动平台开发的,硬件支持半精度floats 我知道使用半精度floats对移动和最现代的桌面目标的性能都很重要。因此,我想了解以下代码是如何针

在阅读过程中,我在第4.4.1节中找到了一些有趣的段落,内容是关于优化半精度
float
s的GGX NDF近似实现。我知道计算
1-点(n,h)*点(n,h)
会导致所谓的问题,为什么使用叉积可以解决这个问题,但是我不知道这与半精度
float
s有什么关系

不同于(从D3D10开始,它只是将其映射到
float
)。Filame的特点是,它最初是为Android这样的移动平台开发的,硬件支持半精度
float
s

我知道使用半精度
float
s对移动和最现代的桌面目标的性能都很重要。因此,我想了解以下代码是如何针对半精度
float
s进行优化的,因为我看不到
half
说明符或类似的,而只是一些常量和宏:

#定义MEDIUMP_FLT_MAX 65504.0
#定义饱和介质泵最小值(x,介质泵最大值)
浮子D_GGX(浮子粗糙度、浮子NoH、常数向量3 n、常数向量3 h){
vec3-NxH=交叉(n,h);
浮子a=NoH*粗糙度;
浮动k=粗糙度/(点(NxH,NxH)+a*a);
浮点数d=k*k*(1.0/PI);
返回饱和介质泵(d);
}
为完整起见,以下是未优化的代码:

float D_GGX(浮子编号、浮子粗糙度){
浮子a=NoH*粗糙度;
浮子k=粗糙度/(1.0-NoH*NoH+a*a);
返回k*k*(1.0/PI);
}

虽然GLSL没有
半类
类型,但其效果对移动平台是独占的,并且依赖于移动平台。我假设您示例中的(完整的)优化着色器代码包含一个默认限定符设置,如下所示:
precision mediump float;
请注意,尽管实际精度尚未确定,但
mediump
float在一个平台上可能有16位,而在另一个平台上可能有24位


这里有一个问题:正如链接文章中所述,精度限定符只支持可移植性,应该对桌面平台没有影响。这意味着,即使支持float16的桌面GPU如果遵守精度限定符,也会违反规范。在桌面平台上,您可以我必须启用并使用适当的扩展名(例如)及其特定语法(例如类型)来利用float16功能。

虽然GLSL没有
一半的
类型,但其效果是移动平台独有的,并且依赖于移动平台。我假设(完整)示例中的优化着色器代码包含一个默认限定符设置,浮动为mediump,如下所示:
precision mediump float;
请注意,尽管实际精度尚未确定,但
mediump
float在一个平台上可能有16位,而在另一个平台上可能有24位

这里有一个问题:正如链接文章中所述,精度限定符只支持可移植性,应该对桌面平台没有影响。这意味着,即使支持float16的桌面GPU如果遵守精度限定符,也会违反规范。在桌面平台上,您可以l必须启用并使用适当的扩展(例如)及其特定语法(例如类型),以利用float16功能