簡體   English   中英

OpenGL-更新模型信息(例如模型矩陣)的最有效方法

[英]OpenGL - Most efficient way to update model info (e.g. model matrix)

因此,可以說我已經將OpenGL的常規緩沖區對象工作流程抽象為Model類。 要使3D模型顯示在OpenGL上下文中,我要做的就是初始化Model對象,將其添加到容器中,然后將容器中的所有Model繪制到渲染循環中。 可以說我的場景中有1000個模型。 現在,我設置模型全局坐標的方式變得非常重要。

我知道有幾種方法可以更新模型信息,例如模型矩陣。 一個方法是為每個模型共享一個着色器程序,並在渲染循環中繪制每個模型之前使用glUniformMatrix4fv設置着色器的模型矩陣。 另一種方法是讓每個Model對象包含其自己的着色器程序,並在初始化Model對象時設置該着色器的模型矩陣。 然后,在渲染循環中,在繪制之前,將glUseProgram用於每個Models着色器程序。

更新模型信息(例如模型矩陣)的最有效方法是什么(我覺得我目前已知的方法效率極低)?

由於您的問題有些籠統,因此我也將答案保留為籠統。

通常,在OpenGL繪制調用之間更改狀態的成本很高,因此,通過最小化狀態更改可獲得最佳性能。 但是,並非所有狀態更改都相等。 實際上不可能詳盡列出狀態更改要比其他狀態花費更多的成本,因為它們的成本在供應商,驅動程序版本等之間會發生變化。對完整的OpenGL管道以及計算機硬件的工作方式有很好的了解可以直觀地了解哪些代碼路徑是更好。 閱讀專注於優化圖形引擎性能的Nvidia和AMD演示文稿(來自GDC,Siggraph等)也非常有幫助。

對於您提出的特定問題,使用不同的着色器(每個包含自己的矩陣)與共享單個着色器並在每次繪制調用之前將矩陣設置為統一值相比,要慢得多。 更改活動着色器要求驅動程序重新配置GPU管道需要進行更多工作,而不僅僅是將16個浮點數寫入GPU內存。 還有其他技術可以讓您將所有矩陣存儲在單個緩沖區中,並且如果所有模型使用相同的着色器,則可以對所有模型進行單個繪制調用。

一種方法是將所有矩陣排列在單個SSBO或UBO中。 然后,每個網格都有一個索引,指示應該使用哪個矩陣。 索引可以來自頂點屬性(例如頂點位置的w分量)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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