【问题标题】:What is the h function doing in THREE.WebGLUniforms?THREE.WebGLUniforms 中的 h 函数是做什么的?
【发布时间】:2017-09-18 08:39:35
【问题描述】:

我正在对 WebGL 项目进行优化,该项目基本上只是一个附加到覆盖画布的四边形的片段着色器。着色器使用一个相当昂贵的循环来投射光线穿过每个像素,直到它们到达某个地形。这个想法是,而不是计算每个像素的光线方向,而是计算屏幕每个角落的光线方向并将它们作为制服传递,然后根据 uv 在它们之间进行插值。我已经在不使用制服的情况下在着色器代码中测试了这个想法,它可以工作,只是它会减慢而不是加快速度。

当我在实现制服的整个事情时尝试加载网页时,Firefox 说存在类型错误,b 未在 three.js 行 12914 中定义。

转到我发现的第 12914 行:

h = function(a, b) {
  void 0 !== b.x ? a.uniform3f(this.addr, b.x, b.y, b.z) : void 0 !== b.r ? a.uniform3f(this.addr, b.r, b.g, b.b) : a.uniform3fv(this.addr, b)
},

Three.WebGLUniforms内。

所以我的问题是:这个函数是做什么用的,它的第二个参数是什么?

更新:

我遗漏的一个重要细节是,如果我将 Firefox 打开超过几秒钟,它就会崩溃。

【问题讨论】:

  • 用你的调试器升级调用树,看看它是从哪里调用的。

标签: javascript three.js


【解决方案1】:

很确定是this function

这是一个辅助函数,用于上传任何在 glsl 中显示为vec3 的制服。这包括THREE.Vector3THREE.Color 和具有三个元素的数组。 See also.

因此,您的“b 未定义”意味着某些应包含向量、颜色或数组的统一值未定义。您应该让调试器在出现异常时停止并查看堆栈以查看是哪个制服。

【讨论】:

    【解决方案2】:

    您正在使用 Three.js 的缩小版本。从您的threejs 脚本名称中删除.min.,例如使用https://cdnjs.cloudflare.com/ajax/libs/three.js/87/three.js 而不是https://cdnjs.cloudflare.com/ajax/libs/three.js/87/three.min.js。仅将缩小版本用于生产部署,而不用于本地开发。

    【讨论】:

    • 如果这是错误的来源,当我切换回缩小版本时,它是否仍然存在?
    • 我切换到非缩小版本并遇到了同样的问题,除了一个名为v的变量
    • 是的,它仍然会出错,但它会有人类可读的代码:)
    • 我用谷歌搜索“为什么要调试缩小的 javascript 文件”。 :D
    • @AndyRay 哦,我明白你为什么要建议这个了,这是不必要的,因为我已经用 atom 插件美化了代码
    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2010-12-20
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多