簡體   English   中英

裁剪裁剪坐標系和歸一化設備坐標系(OpenGL)

[英]Clipping in clipping coordinate system and normalized device coordinate system (OpenGL)

我聽說應該在裁剪坐標系中進行裁剪。 這本書提出了一種情況,即從攝像機后面到查看范圍內都放置一條線。 (我們將這條線定義為PQ,P位於攝像頭后面)我不明白為什么會出現問題。

(這本書說完成歸一化轉換后,P將放置在相機前面。)

我認為在制作剪裁坐標系之前,攝影機位於原始點(0、0、0、1),因為我們進行了查看變換。 但是,在NDCS中,我無法考慮相機的位置。

我還有第二個問題。 在頂點着色器中,我們先進行模型視圖轉換,然后進行投影轉換。 最后,我們將這些頂點輸出到光柵化器。 (某些頂點的w不等於“ 1”)

在這里,我很好奇。 渲染管道將自動執行除法程序(按w)? 完成剪裁后。

有時並非所有模型都可以在屏幕上看到,主要是因為模型中的某些對象位於相機后面(或“視點”)。 這些對象被裁剪掉了。 如果看不到對象的僅一部分,則必須剪裁該部分,其余部分保持可見。

OpenGL片段

OpenGL在裁剪坐標空間(CCS)中進行裁剪。 這是一個大小為2w x 2w x 2w的立方體,其中“ w”是(4x4)x(4x1)矩陣和點相乘所得的第四個坐標。 僅僅對坐標進行比較就足以判斷該點是否被裁剪。 如果該點通過測試,則其坐標除以“ w”(即“透視除法”)。 請注意,對於正交投影,“ w”始終為1,就透視而言,通常不為1。

CPU夾

如果模型太大,則可能要節省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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM