2014-02-08 123 views
0

我正在使用OpenGL進行基於2D的遊戲,該遊戲已經開發用於640x480像素的分辨率。因此,設置我的OpenGL雙緩衝這樣的:OpenGL 2D doublebuffer縮放比例

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, 640, 480, 0, 0, 1); 
glDisable(GL_DEPTH_TEST); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

這個作品真的很好,我可以畫我所有的精靈和使用硬件背景滾屏加速GL紋理。現在,我還想支持其他窗口大小,即用戶應該能夠以800x600,1024x768等等運行遊戲。因此,所有圖形都應該按照新的分辨率縮放。當然,我可以通過在將紋理繪製爲四邊形時將縮放因子應用於所有頂點來實現此目的。但我不認爲我能夠以這種方式實現像素完美的定位......但像素完美的定位對於2D遊戲當然非常重要!

因此,我想問一下,如果有一個靜態的640×480雙緩衝擁有它只是之前被繪製到屏幕上,即是這樣的比例來工作的可能性:

1)我的雙緩衝會無論實際輸出窗口大小如何,始終爲640x480像素。

2)一旦我調用glfwSwapBuffers(),應將640x480雙緩衝區縮放到可以小於或大於640x480的實際窗口大小。

這是可能以某種方式?我認爲這對我的遊戲來說是最簡單的解決方案,因爲在像素完美定位時手動縮放所有頂點可能會給我帶來一些問題,不是嗎?

謝謝!

回答

2

設置我的OpenGL雙緩衝這樣的:

我想你不知道什麼是「雙緩衝」的意思。這意味着您在繪圖完成後向用戶顯示的不可見緩衝區上執行繪圖,以便用戶看不到繪圖過程。

您在那裏的代碼片段是投影設置。硬編碼像素單位的尺寸是錯誤的。

但是像素完美的定位對於2D遊戲當然非常重要!

不,不是真的。除了「像素」單位(除了紋理圖像索引和視口外,OpenGL中並不存在),你應該使用諸如世界單位之類的東西。例如,在一個簡單的跳躍和運行平臺遊戲像SMW

Super Mario World screenshot

你可以說,每塊爲一個單位高。 Yosi-sprite將會是2個單位,Mario 1.5等等。

重要的是,你可以保持你的精靈渲染尺寸與屏幕分辨率無關。這對於所有不同的屏幕分辨率和長寬比來說尤其重要。不要強制用戶使用您認爲合適的分辨率。人們有大屏幕的電腦,他們想要使用它們。

此外,您的精靈的外觀很大程度上取決於您使用的紋理圖像和過濾方法。如果你想實現像素化效果,只需使紋理圖像的分辨率較低,並使用GL_NEAREST放大濾鏡,OpenGL將完成剩下的操作(但是,您應該提供縮小mipmap並使用GL_LINEAR_MIPMAP_LINEAR進行縮小,以免看起來很糟糕)小分辨率)。

因此,我想問一下,如果有一個靜態的640×480雙緩衝擁有它只是之前被繪製到屏幕上,即是這樣的比例來工作的可能性:

是,你可以使用一個framebuffer對象。創建一組渲染尺寸(如640×480)的紋理(顏色和深度 - 模板),然後在完成時將顏色紋理繪製到主幀緩衝區上填充四邊形的視口。

+0

謝謝,使用framebuffer繪製紋理,然後使用縮放的四邊形繪製該紋理,這正是我所需要的。硬編碼glOrtho2D()中的像素尺寸的想法直接來自MSDN,請參閱:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374282(v=vs.85).aspx – Andreas

+0

@ Andreas:實際上這些「正確性提示」來自「官方OpenGL編程指南」(又名紅皮書),但已經過時了一段時間了。無論如何,這些建議只適用於你需要像素完美對齊。但是,對於你想要做的事情,你不需要像素完美對齊(像素屏幕空間過濾,後期處理或繪圖用戶界面等需要像素完美對齊)。 – datenwolf

0

像以前一樣,渲染在640x480,但是在屏幕外的紋理。然後渲染一個應用了該紋理的屏幕尺寸(800x600,1024x768,...)四方形。