2011-04-27 164 views
5

在WebGL的應用程序的頂點着色器程序更新的信息,我做以下。從頂點着色器

我的問題是:

是否有可能存儲在頂點着色器計算的更新P(t)的,所以我可以在接下來的時間步驟中使用它?這對於執行一些邊界測試很有用。

我已經閱讀了一些關於如何使用紋理來存儲和更新vextex位置的信息,但是在WebGL中這是可行的,因爲在OpenGL ES 1.0中不支持頂點程序的紋理訪問?

對於更具體的例子,讓我們假設我們試圖根據方程R(t)=(k * t,0,0)移動一個點。這些位置在頂點着色器中更新,從而使點移動。現在,如果我想讓點在位於R =(C,0,0)的牆上反彈。要做到這一點,我們需要在t - dt點的位置。 (前一個時間步)。

任何想法讚賞。

Regards

回答

1

除了以前的答案,您可以規避PBOs的頂點紋理獲取,但我不知道,如果它們在WebGL或GLES中受支持,因爲我只有桌面GL經驗。您將頂點位置寫入幀緩衝區。但是,不是將它們用作頂點紋理,而是將它們複製到頂點緩衝區中(通過PBO最有效),並將它們用作通常的頂點屬性。這是做變換反饋的舊方式,我認爲這不被支持。

0

您的dt恆定?如果是的話,您可以通過評估

R(t-dt)來檢索以前的位置。如果它不是一個常量,則可以使用uniform在每個渲染週期中傳遞它。

+0

不,這並不能解決您需要上一個位置的問題,例如我描述的彈跳點示例。例如,可能有一些這樣的運動約束,我認爲檢查所有這些碰撞的唯一可行的方法是訪問先前的位置/速度值... – 2011-04-29 04:07:03

0

沒有辦法在頂點着色器中存儲任何東西。您只能將值傳遞給片段着色器並將其寫入幀緩衝區像素。正如你所說,頂點紋理獲取並不是普遍支持的(例如,ANGLE在幾天前纔開始支持它),所以即使這樣做也有點不可行。

你可以做兩件事情:在JS中做所有的位置數學,並將p1和p0作爲制服傳入。或者跟蹤以前的時間值並在着色器中執行兩次位置數學運算,包括t1和t0(除非頂點着色器綁定,否則不應該對性能造成太大影響)。