如何在dart中同步加载着色器文件

时间:2014-08-29 13:34:29

标签: dart webgl shader

我正在开发一个dart webgl应用程序,我需要从外部文件加载着色器代码。我可以发现剩余的代码在加载着色器之前运行,显示错误。有人可以帮助我。

2 个答案:

答案 0 :(得分:2)

我对加载着色器知之甚少,但您可以异步加载资源。使用Futures和HttpRequest:

import 'dart:html';

main() {
  HttpRequest.getString(pathToShaderFile).then((shader) {
    // do something with the shader, which is a String
  });
}

getString()方法返回一个Future,它是一个包含值"在将来的某个时间准备好的对象"。在这种情况下,当服务器使用着色器文件进行响应时,该值(HTTP请求的内容)就绪。值准备就绪后,将触发then()回调。

以下是HttpRequest.getString()的文档:https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-dom-html.HttpRequest#id_getString

答案 1 :(得分:1)

使用基于WebGL的应用程序通常需要加载多个资源来设置应用程序:着色器文件,模型,纹理,世界数据等。

我相信您要做的是在启动主动画循环和渲染帧之前加载并处理所有这些资源

为此,您需要安排资源加载和处理代码以生成Futures,然后使用静态Future.wait()函数等待加载和处理每个资源。

这是一个有点人为的例子。请注意,wait()等待的期货是then()loadAndProcess()的调用返回的期货,也就是说,处理代码执行后的期货已完成比'HttpRequest.getString()'完成后。

void main() {

  Future loadAndProcess(String file) {
    return HttpRequest.getString(file)
      .then((String s) {

        // Process resource content

      })
      .catchError((Error error) {

        // Deal with error

      });
  }

  Future.wait([loadAndProcess('a.txt'), loadAndProcess('b.txt'), loadAndProcess('c.txt')])
    .then((_) {

      // Go on with program ...

    });
}

以上假设加载和处理每个资源是独立的。

另见Dart Library Tour: dart:async-Asynchronous Programming