windows平台下有類似framebuffer的東西嗎?
01-21
在寫一個cpu下的路徑追蹤渲染程序,計算完成每個像素的值以後該怎麼顯示到屏幕上呢?windows下有實現framebuffer的方法嗎?gdi?gdi+?d2d?那種效率最高呢?
SALVIA中把這個功能抽象成了Swap chain,用於把渲染好的Surface顯示到屏幕上。
現在的實現在:
https://github.com/wuye9036/SalviaRenderer/tree/master/salviax/src/swap_chain
用D3D和GL的。D3D的因為設備初始化的關係非常啰嗦。如果你以前就會D3D那就隨便抄一下就好了,GL相對要簡單一些(不過是GL1.4之前的古老寫法)
在更早之前SALVIA用的是GDI+做的窗口顯示,相對來說還是GDI+寫起來最方便。最簡單的方法就是,使用 CreateDIBSection function (Windows) 函數,創建一個HBITMAP,但是後面帶了一個buffer可以給你寫像素。然後你渲染出來的像素就往裡面填,填完了直接調用API刷新窗口,然後在WM_PAINT消息裡面BitBlt到窗口上就可以了。既然你的ray tracing程序是CPU寫的,那麼目前只有這種辦法可以完全不使用GPU,省掉複製數據的開銷。
win下類似framebuffer的東西是由dxgi的swapchain管理的,如果你懂dx10或者更高應該可以輕鬆搞定。看你需求應該只需要char**然後bitmap繪製到窗口就可以。那麼推薦c#和gdi+。drawing裡面應該有你想要的一切了。封裝的bitmap也允許從byte[]中讀數據。當然直接使用opengl也是可以的。以上。
自己開個buffer存內容咯。
cpu做運算,gpu顯示,傳輸數據的開銷是不可避免的。只要記得顯示的時候一次性拷貝所有需要的數據過去,至於顯示的開銷,反正是gpu的事你也不用擔心了。
我只用過也只會用opengl,這個需求,載入紋理去畫就行看你問的問題,應該不是菜鳥,只是驗證演算法的話,完全可以往一個動態數組裡面寫像素,渲染完一幀後,調用你熟悉的圖形API(Qt、cairo之類的)的drawImage這類的函數把它顯示出來。
其次推薦用SDL、SFML這種跨平台庫的離屏緩衝區和像素操作功能,這樣程序在哪兒都能跑。
用Windows原生API的話,用DIBSection應該是比較簡單高效的方法。效率最高肯定是用dx開個render target然後往裡面寫數據再swap到display buffer里了。缺點就是dx的初始化太麻煩了。你要真這麼做,順理成章的就會覺得我dx環境都創建出來了,幹嘛不把path tracing演算法寫在shader里,還省得把結果DMA到顯存里...
初始化opengl,然後修改raster內容
我之前搞這個是借用了opencv庫的自帶窗口和畫圓函數(像素就是一個半徑為1的圓),畫東西很方便肯定比直接寫buffer慢,但是真正的性能瓶頸在光線追蹤,不在這裡
推薦閱讀:
※為什麼虛幻4的渲染要比unity強,強在哪裡了,想知道底層原理解釋?
※軟體渲染有沒有辦法提高紋理採樣速度?
※在遊戲引擎中常用的光照模型有哪些?
※3D 渲染中使用 Accumulation Buffer 實現景深(Depth of Field)效果?
TAG:遊戲引擎 | MicrosoftVisualStudio | 計算機圖形學 | DirectX | 3D渲染 |