1

我使用 ColladaLoader 在 Three.js 中加载 3D 场景。我尝试从网格对象纹理图像创建 mipmaps 图像。问题是当我访问图像宽度和高度时,图像没有完全加载。在完全加载之前,宽度和高度都为零。

加载 dae 文件时,ColladaLoader 会触发“完成”功能。然后我在场景中搜索各个场景对象。具有图像纹理的网格对象之一需要创建 mipmap。问题是当我访问图像时,它的属性没有设置。渲染场景时,包括图像纹理在内的所有对象都被完美渲染(尽管没有 mipmap)。有没有办法让我将事件处理程序添加到图像加载完成时触发的纹理/图像?如果有这样的事件(在 Three.js 对象中),我可以在场景/对象可能已经渲染时添加 mipmaps 吗?我必须采取什么措施来提醒渲染管道 mipmap 已更改?

示例代码有人吗?我可以在 Blender 中预先计算 mipmap 并将它们保存到 dae 文件中吗?我怎么做?我要搜索 Blender 文档...不过欢迎提示...

4

1 回答 1

1

您可以覆盖 THREE.ImageLoader.prototype.load 以进入纹理加载过程,并在加载图像和渲染器使用图像之间进行任何修改。

把它放在三个.js 脚本标签之后。此函数中的代码是three.js 原始代码的精确副本,除了我的注释标记了您可以放置​​mipmap 生成的位置或任何您想要的位置。

THREE.ImageLoader.prototype.load = function ( url, image ) {
    var scope = this;
    if ( image === undefined ) image = new Image();
    image.addEventListener( 'load', function () {
                    // DO WHATEVER WITH THE IMAGE HERE
        scope.dispatchEvent( { type: 'load', content: image } );
    }, false );
    image.addEventListener( 'error', function () {
        scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
    }, false );
    if ( scope.crossOrigin ) image.crossOrigin = scope.crossOrigin;
    image.src = url;
}
于 2013-01-09T13:50:28.117 回答