2016-07-08 213 views
-1

我已經繼承了一個使用OpenGL將3D場景直接渲染到窗口的項目。該代碼工作正常,但我們現在正在將圖標繪製到3D視圖上以「退出3D視圖模式」。這也可以正常工作,但是當視圖快速旋轉時會導致很多閃爍。將OpenGL繪製到屏幕外位圖

我想能夠畫出一個離屏位圖(即沒有HWND),然後將我的圖標繪製到位圖上,最後StretchBlt位圖使用雙緩衝窗口。我們在其他環境中執行此操作(例如放大不需要OpenGL的圖像)並且效果很好。我的問題是我是一個OpenGL新手,所有嘗試從離屏位圖的DC開始並通過此DC創建HWND失敗,通常是因爲爲DC選擇了像素格式。

這裏有幾個問題在StackOverflow上提出類似的問題(eg. this question without an accepted answer。這是否可能?如果是的話,是否有相對簡單的教程描述過程?如果過程非常複雜,需要詳細的OpenGL知識,那麼我可能只是離開它,並用閃爍的生活,因爲它是在我們的軟件中很少使用的模式。

回答

0

使用OpenGL使用紋理四隻需繪製圖標。

這一切都畫上的位圖複製到DC StretchBlt涉及多個往返於圖形內存(浪費帶寬),StretchBlt可能不會GPU加速。總而言之,想做的事情效率低下,甚至可能降低質量。

我認爲你的圖標存儲在你的可執行文件中作爲資源。最簡單的方法是創建一個帶有DIBSECTION(CreateDIBSection)的內存DC(CreateCompatibleDC),並將該圖標繪製爲該圖標,並將DIBSECTION數據加載到OpenGL紋理中。然後用圖標glViewport在窗口座標中選擇目標矩形,使用標識變換繪製一個覆蓋整個視口的矩形(位置值(-1,1)→(1,1),紋理座標值(0, 0)→(1,1)給你正確的結果)。

重要的修補程序:如果您的程序在窗口中設置視口和固定功能管道GL_PROJECTION矩陣調整大小處理程序,您應該清理該反模式並將其移至它所屬的位置:在繪圖代碼中。