2012-04-24 52 views
0

我在寫一個簡單的3D渲染引擎。
我的3D處理的最終結果是像素數據。接下來我需要用GDI +在屏幕上顯示它。
我正在使用WinForms和Visual Basic。我直接在窗體的ClientRectangle上繪圖。用GDI顯示像素數據+

我有一些問題。
處理完一個像素之後,我應該先將像素數據寫入緩衝區,而不是將每個像素單獨發送給GDI +?
- 如果是這樣,我應該一次緩衝多少屏幕?全屏,一半,四分之一,八分之一?我認爲這裏可能會有RAM使用/性能的折衷。
- 什麼是像素緩衝區的最佳數據結構?
- 我使用哪個GDI +命令渲染像素緩衝區(或單個像素)?是否可以避免將位圖創建爲中間步驟並將像素數據直接發送到屏幕?

我預計最大屏幕尺寸是1600x1200。 RAM可能低至1GB。

謝謝。

+0

您應該首先寫入內存緩衝區 - 與渲染緩衝區相比,繪製單個像素效率非常低。你應該有足夠的空間;沒有理由不緩衝整個圖像。 – comingstorm 2012-04-25 00:29:14

+0

好的,所以我有一個字節數組或一個32位整數數組或一組代表像素數據的結構數組,每個像素4個字節。將這些數據發送到屏幕的有效方法是什麼? – mcu 2012-04-25 04:21:00

+1

正如@ananthonline所說,您應該從32位/像素的RGBA緩衝區開始。 「Bitmap」類允許您創建基於各種數據緩衝區[格式]的位圖(http://msdn.microsoft.com/zh-cn/library/ms534412(v = vs.85).aspx) - - 你應該試試'PixelFormat32bppARGB'或'PixelFormat32bppPARGB'。 – comingstorm 2012-04-25 15:58:27

回答

2

希望你能找到一些這些問題的答案在這裏

  1. 首先將數據寫入RGBA結構的緩衝區。例如,如果你想渲染多個「圖層」,然後再將它們合成,這將使其變得容易。如果你想在某個時候執行任何延遲處理,它也會變得很容易。完整(tile?)渲染完成後,可以將其刷新到輸出位圖/文件。
  2. 這取決於您允許用戶渲染的分辨率。如果要渲染千兆像素圖像,則需要以合理的大小進行拼貼。我會建議瓷磚尺寸可以配置,然後在測試後可以將其設置爲合理的默認值。
  3. 如果您不想執行任何延遲着色,我建議從一個簡單的RGBA緩衝區開始。
  4. 如果您沒有執行適合內存的平鋪渲染/渲染圖像,那麼您可以簡單地使用Bitmap.LockBits並以這種方式寫入數據。如果您使用的是平鋪渲染,則需要找到一個允許您一次渲染掃描線的庫(並使其成爲「圖塊」),或者修復要編寫TGA,PNG和seek/write的文件格式直接到文件。將圖像轉儲爲RAW文件,然後使用命令行工具將其轉換爲另一種選擇。

希望這會有所幫助!