首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >半浮子GLSL的优化

半浮子GLSL的优化
EN

Stack Overflow用户
提问于 2020-07-25 19:20:20
回答 1查看 317关注 0票数 1

在阅读基于物理的长丝渲染时,我在第4.4.1节中找到了一些有趣的段落,涉及优化半精度float的GGX近似的实现。我理解1 - dot(n, h) * dot(n,h)的计算可能导致所谓的灾难性取消,以及为什么使用交叉积解决了这个问题,但是我不知道这与半精度float有什么关系。

说明符,不像HLSL (从D3D10 很可能是因为现代桌面硬件无论如何都不支持它,尽管它似乎用最新的硬件又回来了)开始简单地将其映射到float )。与丝有关的是,它是初步开发的移动平台,如安卓,其中一半精度的float是支持硬件。

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

代码语言:javascript
复制
#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);
}

为了完整起见,下面是未优化的代码:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-26 13:21:27

虽然GLSL没有half类型,但它确实具有精度限定符,其影响是对移动平台的独占和依赖。我假设示例中的(完整)优化着色器代码包含一个默认限定符设置,如:precision mediump float;注意到实际精度仍未指定,mediump浮动可能在一个平台上有16位,而在另一个平台上则有24位。

,但:正如链接文章和GLSL规范精度限定符所指出的,只支持可移植性,并且不应该对桌面平台产生任何影响。这意味着,即使具有float16支持的桌面GPU,如果符合精度限定符,也会与规范不符。在桌面平台上,您必须启用并使用适当的扩展(例如GL_AMD_gpu_shader_half_float)及其特定的语法(例如类型)来利用float16功能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63092561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档