2013-01-10 35 views
1

我想了解屏幕和邏輯之間的關係OpenGL用來決定是否應該呈現一個原語,即它是否在屏幕上。glViewport,窗口大小和剪輯

例如,假設您將視口設置爲大於屏幕(沒有理由這麼做,但舉例來說)。 OpenGL不會「知道」屏幕尺寸,所以只要正投影將它們放置在視口內,它就會「畫出」屏幕上的點,是否正確?

但是,如果我將頂點位置定義在投影所確定的視口之外,OpenGL是否將其包含在渲染中?

glViewport(0,0,100,100); 
    ApplyOrtho(50,50); // custom ES 2.0 utility to apply 2D orthographic projection 

現在位置頂點(75,75)不會被OpenGL渲染,對不對?

回答

2

邏輯OpenGL的使用,以決定如果一個圖元是否應該呈現

只有一個的邏輯塊使OpenGL使用,以決定如果一個原語應該呈現。如果原始圖像沒有被剪切/剔除,那麼阻止其被光柵化的唯一方法是如果用戶已經禁用全部原始光柵化與glEnable(GL_RASTERIZER_DISCARD)。否則,OpenGL規範將定義所有未被剔除的基元將作爲剪切的一部分進行光柵化。

現在,他們是否會產生任何明顯的影響是一個不同的問題。而且由於在屏幕外的圖元不能產生可見的效果(除非你使用圖像加載/存儲),如果需要的話,符合OpenGL的實現可以自由地剔除這些三角形。但更有可能的是,它會對它們進行光柵化處理,並簡單地檢查片段是否落在窗外。如果是這樣,它會放棄這些碎片。

一般來說,這不應該是你應該關心的事情。只要設置一個合理的視口,你就會好起來的。

+0

有關這方面的更多技術說明,要查找的術語是「像素所有權測試」,這甚至超出簡單的「在窗口範圍內」測試。例如,一個封閉渲染窗口的窗口也可能會使其下方的片段失效,從而失敗窗口所有權測試,然後OpenGL將丟棄這些片段。這是您在渲染到要存儲的紋理或圖像時應始終使用正確的屏幕外緩衝區的原因之一。 – datenwolf

+0

@datenwolf:像素所有權測試(我在寫這個答案時查找了它)並不適用於窗口以外的部分視口。它僅適用於操作系統特定的不可見部分窗口條件(窗口部分不在屏幕上,或者另一窗口部分遮擋窗口等)。請注意,在呈現給FBO時,所有片段*都會傳遞像素所有權測試。 –

+0

據我瞭解,負責放棄延伸到窗口限制之外的視口片段的代碼路徑與像素所有權測試代碼共享很多。 – datenwolf