【问题标题】:Preventing webgl glsl automatically inlining functions?防止 webgl glsl 自动内联函数?
【发布时间】:2019-02-16 22:34:28
【问题描述】:

在我的 GLSL 代码中,我有多次调用大型函数。

例如,在我的 perlin 噪声函数中,我多次运行哈希函数。

float perlinNoise (...) {
    ...
    float x0y0z0 = pcgUnit3(seedminX,seedminY,seedminZ);
    float x0y0z1 = pcgUnit3(seedminX,seedminY,seedmaxZ);
    float x0y1z0 = pcgUnit3(seedminX,seedmaxY,seedminZ);
    float x0y1z1 = pcgUnit3(seedminX,seedmaxY,seedmaxZ);
    float x1y0z0 = pcgUnit3(seedmaxX,seedminY,seedminZ);
    float x1y0z1 = pcgUnit3(seedmaxX,seedminY,seedmaxZ);
    float x1y1z0 = pcgUnit3(seedmaxX,seedmaxY,seedminZ);
    float x1y1z1 = pcgUnit3(seedmaxX,seedmaxY,seedmaxZ);
    ...
}

在我的程序生成算法中,我多次调用 perlin 噪声函数。

我注意到,每次我添加对 perlin 噪声函数的调用时,着色器的编译时间都需要更长的时间。我认为问题在于 glsl 内联函数调用,因此着色器代码变得非常大。

我对内联是否正确,如果正确,我该如何防止它发生?

【问题讨论】:

    标签: glsl webgl inlining


    【解决方案1】:

    GLSL_ES_Specification_1.00 的第 13 页上描述了如何设置 pragma derectives

    • #pragma optimize(off)
    • #pragma debug(on)

    这将是“内联”情况。 “我对内联是否正确......”。据我所知,没有。也不太清楚后台发生了什么。在 Windows 上,它被转换为 ANGEL,也许看看源代码会有所帮助。

    一般来说:尝试降低岁差,考虑到三个数字 1.000 可能已经足够“好”了。无论如何,浮点数只能存储 5 -6 位。避免分支。那应该是急救小子。

    一些在野外的调试器工具(请自行研究)

    优化器

    【讨论】:

    • "#pragma 允许依赖于实现编译器控制。"这些 pragma 可能会起作用,但它们实际上不需要做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2017-04-04
    • 2020-06-02
    • 2011-06-10
    相关资源
    最近更新 更多