【问题标题】:Converting CanvasRenderer to WebGLRenderer将 CanvasRenderer 转换为 WebGLRenderer
【发布时间】:2018-04-16 10:56:25
【问题描述】:

我想在这里举个例子: https://threejs.org/examples/?q=canvas#canvas_particles_waves

通过更改将它与 WebGLRenderer 一起使用:

renderer = new THREE.CanvasRenderer();

renderer = new THREE.WebGLRenderer();

这样我就可以将这个效果与另一个已经在使用 WebGL 的效果结合起来。

但是,这样做会导致正在渲染的粒子出现错误,如下所示:

three.js:18501 Uncaught TypeError: Cannot read property 'offset' of undefined at WebGLSpriteRenderer.render (three.js:18501) at WebGLRenderer.render (three.js:22287) at render (canvas_particles_waves.html:184) at animate (canvas_particles_waves.html:157)

有什么想法吗?

非常感谢!

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    没关系,我搞定了!

    CanvasRenderer 演示使用 2D Canvas 绘图命令绘制圆,如下所示:

    var material = new THREE.SpriteCanvasMaterial( { color: 0xffffff, program: function ( context ) {
    context.beginPath(); context.arc( 0, 0, 0.5, 0, PI2, true ); context.fill(); } });

    像这样的 2D 绘图命令不能转换为 3D WebGL,所以我将其替换为:

    var geometry = new THREE.SphereGeometry( 5, 32, 32 ); var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );

    在嵌套for循环的正下方,第一行变为:

    particle = particles[ i ++ ] = new THREE.Mesh( geometry, material );

    就是这样!其他一切按原样运行。

    【讨论】:

    • THREE.SphereGeometry( 5, 32, 32 ) 是~2000 个三角形——每个! THREE.SphereGeometry( 5, 4, 4 ) 对于这个用例来说更合理。你真的应该使用THREE.Points
    • 当然,谢谢!是的,上面的代码只是从 SphereGeometry 上的 three.js 文档中复制粘贴。我来看看积分
    • 顺便说一下,这是在 WebGL 中工作的粒子波画布演示:plu.sx/v2 代码在这里:github.com/plus-x/plu.sx/blob/master/v2/js/setup-webgl.js .....接下来我会实施你的建议
    • 在控制台中输入renderer.info:6,000+ 次绘图调用; 300,000 多个三角形。试试BufferGeometryTHREE.Points
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 2013-08-26
    • 2013-07-09
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多