我正在为一个WebGL项目进行优化,它基本上只是一个附加到覆盖画布的四边形的碎片着色器。着色器使用相当昂贵的循环来投射光线通过每个像素,直到它们到达某个地形。我们的想法是,不是计算每个像素的光线方向,而是计算屏幕每个角落的光线方向,然后将它们作为制服传递,然后根据uv进行插值。我已经在着色器代码中测试了这个想法而没有使用制服,它的工作原理除了它减慢速度而不是加速它。
当我尝试在实现制服的整个过程中加载网页时,Firefox说存在类型错误,{。1}}未在three.js第12914行中定义。
转到第12914行我发现:
b
在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)
},
内。
所以我的问题是:这个函数是什么,它的第二个参数是什么?
更新:
我遗漏的一个重要细节是,如果我将Firefox打开超过几秒钟,它会崩溃。
答案 0 :(得分:2)
非常确定它是this function。
上传任何在glsl中显示为vec3
的制服是一个辅助函数。这包括THREE.Vector3
,THREE.Color
和包含三个元素的数组。 See also
所以你的" b没有定义"意味着一些应该包含向量,颜色或数组的统一值是未定义的。您应该让调试器停止异常,并查看堆栈以查看是哪个统一。
答案 1 :(得分:1)
你正在使用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
。仅将缩小版本用于生产部署,而不是用于本地开发。