在阅读基于物理的长丝渲染时,我在第4.4.1节中找到了一些有趣的段落,涉及优化半精度float的GGX近似的实现。我理解1 - dot(n, h) * dot(n,h)的计算可能导致所谓的灾难性取消,以及为什么使用交叉积解决了这个问题,但是我不知道这与半精度float有什么关系。
说明符,不像HLSL (从D3D10 很可能是因为现代桌面硬件无论如何都不支持它,尽管它似乎用最新的硬件又回来了)开始简单地将其映射到float )。与丝有关的是,它是初步开发的移动平台,如安卓,其中一半精度的float是支持硬件。
我知道,使用半精度的float对移动和最现代桌面目标的性能都很重要。因此,我想了解以下代码是如何为半精度的floats优化的,因为我看不到half说明符或类似的代码,而只是一些常量和宏:
#define MEDIUMP_FLT_MAX 65504.0
#define saturateMediump(x) min(x, MEDIUMP_FLT_MAX)
float D_GGX(float roughness, float NoH, const vec3 n, const vec3 h) {
vec3 NxH = cross(n, h);
float a = NoH * roughness;
float k = roughness / (dot(NxH, NxH) + a * a);
float d = k * k * (1.0 / PI);
return saturateMediump(d);
}为了完整起见,下面是未优化的代码:
float D_GGX(float NoH, float roughness) {
float a = NoH * roughness;
float k = roughness / (1.0 - NoH * NoH + a * a);
return k * k * (1.0 / PI);
}发布于 2020-07-26 13:21:27
虽然GLSL没有half类型,但它确实具有精度限定符,其影响是对移动平台的独占和依赖。我假设示例中的(完整)优化着色器代码包含一个默认限定符设置,如:precision mediump float;注意到实际精度仍未指定,mediump浮动可能在一个平台上有16位,而在另一个平台上则有24位。
,但:正如链接文章和GLSL规范精度限定符所指出的,只支持可移植性,并且不应该对桌面平台产生任何影响。这意味着,即使具有float16支持的桌面GPU,如果符合精度限定符,也会与规范不符。在桌面平台上,您必须启用并使用适当的扩展(例如GL_AMD_gpu_shader_half_float)及其特定的语法(例如类型)来利用float16功能。
https://stackoverflow.com/questions/63092561
复制相似问题