【问题标题】:How to know when data has been allocated on GPU memory如何知道何时在 GPU 内存上分配了数据
【发布时间】:2012-06-09 13:14:26
【问题描述】:

如何确定是否在 three.js 上的 GPU 内存上分配了缓冲区?

我第一次调用 renderer.render() 时,它渲染的网格没有纹理(看起来是黑色的),这让我觉得当调用函数时纹理在 GPU 内存上还不可用。 5-10 次调用后,纹理出现在屏幕上。

为什么这很重要?我只是在视图需要更新时触发渲染功能。如果加载了新模型,渲染函数应该等到所有数据都可用于渲染。

如何确保所有数据都准备好在 GPU 上使用?

伪代码:

textures = LoadTextures()
material = CreateMaterial(textures)
geometry = loader.load( "path/to/file" )

if( materialLoaded && geometryLoaded ) {
    needsUpdate = true
}

if( needsUpdate ) {
    renderer.render()
    needsUpdate = false
}

【问题讨论】:

  • 从技术上讲,一旦你调用完加载函数,它就应该准备好了,在 OpenGL/WebGL 中没有这样的“加载周期”。
  • 好吧,我认为有一些类似于 DirectX 上的查询。谢谢。

标签: opengl-es-2.0 gpu webgl three.js


【解决方案1】:

这似乎是一个问题,因为图像在渲染之前没有完全加载。

【讨论】:

  • 是的,它们没有完全加载。
【解决方案2】:

纹理在 GPU 上可用调用 image.onload 时。我在那里放了一个标志来确定给定的图像(作为纹理加载)是否已加载。

LITEV.Texture = function( src )
{
    [...]
    this.loaded = false;
}

LITEV.Texture.prototype =
{
    load : function( path, callback, callbackError )
    {
        image.onload = function () 
        {
            [...]
            texture.needsUpdate = true; 
            if ( callback ) 
            {
                callback( this ); 
            }
            this.loaded = true;
            [...]
        }
    },
    [...]
} 

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2014-03-01
    • 2011-07-12
    • 2019-08-29
    • 2015-05-01
    • 2019-08-17
    相关资源
    最近更新 更多