2014-08-29 33 views
0

我正在開發飛鏢webgl應用程序,我需要從外部文件加載着色器代碼。我可以發現剩餘的代碼在着色器加載之前運行顯示錯誤。有人可以幫我嗎。如何在飛鏢中同步加載着色器文件

+0

歡迎來到StackOverflow。你能改善你的問題嗎?例如,添加一些代碼,顯示您嘗試過的內容以及有關哪些內容有效的信息。也許添加一些錯誤信息。另見http://stackoverflow.com/help/how-to-ask,http://meta.stackoverflow.com/questions/260648 – 2014-08-29 13:51:58

回答

2

我對加載着色器知之甚少,但可以異步加載資源。利用期貨的HttpRequest:

import 'dart:html'; 

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

的getString()方法返回一個未來,這是一個包含價值「準備在將來某個時候」的對象。在這種情況下,當服務器使用着色器文件進行響應時,值(HTTP請求的內容)已準備就緒。數值準備就緒後,將觸發then()回調。

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

1

使用基於WebGL的應用程序通常需要加載很多資源,可以讓應用程序設置:着色器文件,模型,紋理,世界數據等等。

我相信你想要做的是加載和處理所有這些資源之前啓動主動畫循環和渲染幀。

要做到這一點,你想安排你的資源加載和處理代碼產生期貨,然後使用靜態Future.wait()函數來等待每個資源加載和處理。

這是一個有點人爲的例子。請注意,wait()等待的期貨是在loadAndProcess()中調用then()後返回的期貨,即在執行完處理之後完成的期貨,而不是在'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