[英]Clipping in clipping coordinate system and normalized device coordinate system (OpenGL)
我聽說應該在裁剪坐標系中進行裁剪。 這本書提出了一種情況,即從攝像機后面到查看范圍內都放置一條線。 (我們將這條線定義為PQ,P位於攝像頭后面)我不明白為什么會出現問題。
(這本書說完成歸一化轉換后,P將放置在相機前面。)
我認為在制作剪裁坐標系之前,攝影機位於原始點(0、0、0、1),因為我們進行了查看變換。 但是,在NDCS中,我無法考慮相機的位置。
我還有第二個問題。 在頂點着色器中,我們先進行模型視圖轉換,然后進行投影轉換。 最后,我們將這些頂點輸出到光柵化器。 (某些頂點的w不等於“ 1”)
在這里,我很好奇。 渲染管道將自動執行除法程序(按w)? 完成剪裁后。
有時並非所有模型都可以在屏幕上看到,主要是因為模型中的某些對象位於相機后面(或“視點”)。 這些對象被裁剪掉了。 如果看不到對象的僅一部分,則必須剪裁該部分,其余部分保持可見。
OpenGL在裁剪坐標空間(CCS)中進行裁剪。 這是一個大小為2w x 2w x 2w的立方體,其中“ w”是(4x4)x(4x1)矩陣和點相乘所得的第四個坐標。 僅僅對坐標進行比較就足以判斷該點是否被裁剪。 如果該點通過測試,則其坐標除以“ w”(即“透視除法”)。 請注意,對於正交投影,“ w”始終為1,就透視而言,通常不為1。
如果模型太大,則可能要節省GPU資源或提高幀速率。 因此,您決定跳過那些將被裁剪的對象。 然后,您可以自己(在CPU上)進行數學運算,並且僅將通過測試的頂點發送到GPU。 請注意,某些對象可能會修剪某些頂點,而同一對象的其他頂點可能不會修剪。 也許您確實將它們發送到GPU,並讓其處理這些特殊情況。
您已定義一個僅在其中可見對象的卷。 該體積由六個平面定義。 讓我們將自己放在攝影機中,然后看一下該體積:如果您的投影是透視圖,則這六個平面將構成一個“圓錐台”,即一種截頂的金字塔。 如果投影是正交的,則這些平面將形成平行六面體。
為了修剪或不修剪頂點,必須使用到頂點的距離到這六個平面中的每一個。 您需要一個有符號的距離,這意味着該符號告訴您從頂點可以看到平面的哪一側。 如果六個距離符號中的任何一個都不正確,則頂點將被丟棄,修剪。
如果一個平面由等式Ax + By + Cz + D = 0定義,則到p1,p2,p3的有符號距離為(Ap1 + Bp2 + Cp3 + D)/ sqrt(A A + B B + C * C)。 您只需要符號,因此不必費心計算分母。
現在,您擁有了所有工具。 如果您知道在“攝像機視圖”中的飛機,則可以計算六個距離並修剪或不修剪頂點。 但這可能是一項昂貴的操作,因為您必須將頂點共余線從模型空間轉換為相機(視圖)空間,這是ViewModel矩陣計算。 以相同的成本,您可以使用預先計算的ProjectionViewModel矩陣來獲取CCS坐標,將其與CCS多維數據集的大小“ 2w”相比要容易得多。
有時,您不想跳過某些頂點,不是因為它們被裁剪,而是因為它們的深度違反了您正在使用的條件。 在這種情況下,CCS不是正確的處理空間,因為Z坐標已轉換為[-w,w]范圍,所以深度會以某種方式“丟失”。 相反,您可以在“視圖空間”中進行剪輯測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.