簡體   English   中英

如何在Win32上使用大紋理加速屏幕外OpenGL渲染?

[英]How to speed up offscreen OpenGL rendering with large textures on Win32?

我正在開發一些C ++代碼,這些代碼可以在兩個圖像之間執行一些精美的3D過渡效果,對此我認為OpenGL將是最好的選擇。

我從DIB部分開始,並為OpenGL進行設置,然后從輸入圖像創建兩個紋理。

然后,對於每一幀,我只繪制兩個OpenGL方形,並帶有相應的圖像紋理。 然后將DIB內容保存到文件中。

例如,一種效果是像兩個廣告牌一樣定位兩個四邊形(在3d空間中),一個在另一個廣告牌的前面(遮擋它),然后向上,向下和向下翻轉攝像機,以便可以看到第二個。

我的輸入圖像大約為1024x768,當四邊形覆蓋大部分視圖時,渲染時間非常長(100毫秒)。 如果相機距離較遠,則可以加快速度。

我嘗試將每個圖像四邊形渲染為數百個單獨的圖塊,但是這需要花費相同的時間,似乎它取決於可見紋理像素的數量。

我以為OpenGL可以每秒處理成千上萬個多邊形。 我在這里缺少什么嗎?

使用其他方法會更好嗎?

提前致謝...

編輯:

DIB版本的GL字符串顯示為:

供應商:Microsoft Corporation版本:1.1.0渲染器:GDI通用

屏幕上的版本顯示:供應商:ATI Technologies Inc.版本:3.2.9756兼容性配置文件上下文渲染器:ATI Mobility Radeon HD 3400系列

因此,我想我將不得不使用FBO,對於如何將呈現的數據從FBO導出到DIB上,我有些困惑,這上面有任何指針(雙關語意味)?

聽起來像渲染到DIB迫使渲染發生在軟件中。 我將渲染到幀緩沖區對象,然后從生成的紋理中提取數據。 Gamedev.net有一個相當不錯的教程

但是請記住,圖形硬件主要面向屏幕上的繪圖。 捕獲渲染的數據通常比顯示數據要慢,即使您確實需要硬件來進行渲染,盡管它仍比軟件渲染快很多。

編輯:DominikGöddeke有一個教程 ,其中包括用於將紋理數據讀回CPU地址空間的代碼。

您的問題有一個問題:
您沒有提供實際的渲染/紋理生成代碼。

使用其他方法會更好嗎?

您可以做的最簡單的事情是確保紋理的大小等於2的冪。 即使用1024x1024代替1024x768,並僅使用該紋理的一部分。 說明:盡管大多數現代硬件都支持非pow2紋理,但有時將它們視為“特殊情況”,使用這種紋理可能會在某些硬件上導致性能下降。

我以為OpenGL可以每秒處理成千上萬個多邊形。 我在這里缺少什么嗎?

是的,您錯過了一件重要的事情。 有幾件事限制了GPU性能:
1.系統內存到視頻內存的傳輸速率(可能不是您的情況-僅當數據每幀更改時才用於動態紋理\\幾何)。
2.計算成本。 (如果您編寫的着色器的計算量很大,那將會很慢)。
3.填充率(程序每秒可以在屏幕上顯示多少像素),AFAIK取決於現代GPU的內存速度。
4.頂點處理速率(不是您的情況)-GPU每秒可以處理多少個頂點。
5.紋理讀取率(每秒可讀取多少個紋理像素GPU)在現代GPU上取決於GPU內存速度。
6.紋理讀取緩存(不是您的情況)-即在片段着色器中,每個像素可以讀取數百次紋理,而性能下降很少,如果坐標非常接近(即每次讀取的紋理像素幾乎相同)-因為結果被緩存。 但是,如果您嘗試為每個像素訪問100個隨機定位的紋理像素,性能將大大下降。

所有這些特征均取決於硬件。

也就是說,根據某些硬件,您可能能夠每幀渲染1500000個多邊形(如果它們占用少量屏幕空間),但是如果每個多邊形都充滿整個屏幕,使用alpha混合和具有高度詳細的紋理。

如果您考慮一下,您可能會注意到有很多視頻卡可以繪制風景,但是當您進行幀緩沖效果(例如模糊,HDR等)時,fps會下降。

此外,如果您具有內置GPU,則紋理表面的性能可能會下降。 當我在以前的主板上炸毀PCIEE插槽時,我必須使用內置GPU(NVidia 6800或其他型號)。 結果並不令人滿意。 盡管GPU支持着色器模型3.0,並且可以使用計算上相對昂貴的着色器,但每次在屏幕上出現紋理對象時,fps都會迅速下降。 顯然是因為內置GPU將系統內存的一部分用作視頻內存,並且“正常” GPU內存和系統內存的傳輸速率不同。

暫無
暫無

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

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