opengl/webgl 可以部分重繪嗎?

我是webgl的初學者,在學習過程中發現教程中講解 webgl 動畫的時候,基本都是清除屏幕,然後應用變換,重新繪製這樣的過程來達到動起來的效果。 但是我想,如果在一個非常複雜的場景中,只有一個很小的部分在移動,那麼是否可以只繪製這很小的一部分不用全部的重新繪製呢?


實踐上通常沒太大意義。因為對於一個典型的3D場景,很多影響是全局的。比如一個物體的投影,很可能投到離得很遠的另一個物體上。再比如運動模糊、ambient occlusion這類二維特效,也得是在整個場景渲染到二維的基礎上。你只刷屏幕上面的一個塊,就「不對」了。

實際上,3D場景的剪裁,通常在場景圖上完成,而不是在屏幕空間上搞。


用scissor test,你就可以只clear一部分,只畫那塊區域的物體,再配合EGL_NV_post_sub_buffer,就可以只swap一部分。

但是實際使用中,你仍會發現這麼做沒意義,幾乎所有時候你都會需要刷全屏。


如上面大家所說的 scissor test 可以做這個。不過一般3d場景用這個意義不大。因為你這個移動的小物體,可能影響到其他物體或者全局繪製的物體。這種情況下還是要重繪的。

但在特殊的一些場景上可以用到:

1 比如那種3d編輯器的左視圖,上視圖,下視圖等等。在不同的區域顯示不同的視角。

2 立體3D 需要繪製左眼/右眼 區域。其實和1類似。

3 3D UI,就是基於OpenGL/ES 介面做的 2D UI效果。比如安卓UI系統/一些電視上Launcher等等。


你說的這種情況在遠程繪製的時候有應用。

比如一個類似足球遊戲的場景,其實顯示端不太關注觀眾台,這樣觀眾台的信息是不用每幀都傳輸的(只需要第一幀的時候傳輸背景,之後可以若干幀傳輸一次,或者再也不傳輸)。

但是我說的這個應用和你所描述的是不一樣的,因為遠程繪製的瓶頸可能是網路,而不是繪製時間。


可以的,渲染視頻的時候就這麼做過。


推薦閱讀:

推動HTML5生態發展,Gospel還能做什麼?
手把手教你擼一個跑男動畫 順便抽絲剝繭CSS3動畫奧秘
H5 遇上搖滾樂,實時呈現 Radiohead 迷幻 MV

TAG:HTML5 | OpenGL | WebGL | OpenGLES | 計算機圖形學 |