溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SDL2和OpenGL的使用示例

發(fā)布時間:2021-08-09 11:14:46 來源:億速云 閱讀:204 作者:小新 欄目:移動開發(fā)

這篇文章將為大家詳細講解有關(guān)SDL2和OpenGL的使用示例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

SDL + OpenGL使用筆記

LFTK 是一個嵌入式GUI,為了開發(fā)方便,需要提供PC運行環(huán)境。我選擇了SDL2+OpenGL+nanovg來實現(xiàn)底層的渲染,讓LFTK可以運行在各個平臺上。GLFW+OpenGL也是一個不錯的選擇,但是GLFW沒有Android和iOS的移植,而且沒有提供原生輸入法的支持。LFTK雖然最初是為嵌入式系統(tǒng)而生,但也有一個小目標:可以用于開發(fā)嵌入式系統(tǒng),也可以開發(fā)PC軟件和移動APP,所以最后選擇了SDL2+OpenGL+nanovg。在使用SDL2+OpenGL+nanovg的過程中,踩了一些坑,這里做個筆記,給需要的朋友參考:

一、在MacPro上顯示模糊的問題。

在網(wǎng)上查了一下,有人提供的方案是設(shè)置SCALE_QUALITY,貌似也有些道理,但是效果不佳。

SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest");

花了一些時間去看SDL的源碼后,發(fā)現(xiàn)其實SDL在創(chuàng)建窗口時提供了SDL_WINDOW_ALLOW_HIGHDPI標志,可以用來解決模糊的問題:

SDL_CreateWindow("LFTK Simulator", x, y, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);

如果設(shè)置了SDL_WINDOW_ALLOW_HIGHDPI標志,窗口大小和Drawable的大小可能不一致,在繪圖時需要做相應(yīng)縮放:

SDL_GetWindowSize(sdl_window, &ww, &wh);
SDL_GL_GetDrawableSize(sdl_window, &fw, &fh);
ratio = (float)fw / (float)ww;

二、nanovg裁剪算法無效。

使用低級的OpenGL去繪圖是一個比較麻煩的事情。在LFTK中,采用了nanovg矢量圖繪圖函數(shù)庫,nanovg缺省使用的GLFW,要移植到SDL2上也不難。但是我發(fā)現(xiàn)nanovg的示例在SDL上和在GLFW上的效果有些差異,仔細觀察后,初步判斷與用stencil進行裁剪有關(guān),以為是沒有啟用stencil測試引起的,于是加了下面的代碼:

glEnable(GL_STENCIL_TEST);

但是沒有效果,在nanovg的代碼中,也發(fā)現(xiàn)它自己會啟用stencil測試。對比基于nanovg基于GLFW的例子,也沒發(fā)現(xiàn)有價值的線索。然后對比SDL_CreateWindow/glfwCreateWindow和SDL_Init/glfwInit的實現(xiàn),發(fā)現(xiàn)SDL中,stencil_size的缺省值是0,嘗試把設(shè)置它為8:

SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);

顯示正常了。

三、Windows下的OpenGL

在MacPro和Ubuntu下測試沒有問題,在Window測試時發(fā)現(xiàn)一些OpenGL函數(shù)找不到,明明已經(jīng)鏈接了opengl32.dll啊。網(wǎng)上的方案多是基于GLUT和GLFW在Windows下做OpenGL開發(fā)的,SDL則沒有找到相關(guān)資料,只好再去研讀GLFW,看能不能從中借用部分代碼。很快發(fā)現(xiàn)deps/glad是干這個的,而glad是http://glad.dav1d.de/上在線生成的。把glad.c加入項目中,并調(diào)用初始化函數(shù):

gladLoadGL();

編譯沒有問題了,不過運行起來就崩掉了。調(diào)試時發(fā)現(xiàn)glGetString(GL_VERSION)返回NULL,這個簡單的函數(shù)居然會失敗!后來在google搜索 到glGetString(GL_VERSION)失敗的原因: gladLoadGL需要放在SDL_GL_CreateContext之后調(diào)用。而我把它放在了SDL_Init和SDL_GL_CreateContext之間了。

關(guān)于“SDL2和OpenGL的使用示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI