SDL2和OpenGL使用踩坑筆記經驗分享
SDL + OpenGL使用筆記
LFTK 是一個嵌入式GUI,為了開發(fā)方便,需要提供PC運行環(huán)境。我選擇了SDL2+OpenGL+nanovg來實現底層的渲染,讓LFTK可以運行在各個平臺上。GLFW+OpenGL也是一個不錯的選擇,但是GLFW沒有Android和iOS的移植,而且沒有提供原生輸入法的支持。LFTK雖然最初是為嵌入式系統(tǒng)而生,但也有一個小目標:可以用于開發(fā)嵌入式系統(tǒng),也可以開發(fā)PC軟件和移動APP,所以最后選擇了SDL2+OpenGL+nanovg。在使用SDL2+OpenGL+nanovg的過程中,踩了一些坑,這里做個筆記,給需要的朋友參考:
一、在MacPro上顯示模糊的問題。
在網上查了一下,有人提供的方案是設置SCALE_QUALITY,貌似也有些道理,但是效果不佳。
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest");
花了一些時間去看SDL的源碼后,發(fā)現其實SDL在創(chuàng)建窗口時提供了SDL_WINDOW_ALLOW_HIGHDPI標志,可以用來解決模糊的問題:
SDL_CreateWindow("LFTK Simulator", x, y, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);
如果設置了SDL_WINDOW_ALLOW_HIGHDPI標志,窗口大小和Drawable的大小可能不一致,在繪圖時需要做相應縮放:
SDL_GetWindowSize(sdl_window, &ww, &wh); SDL_GL_GetDrawableSize(sdl_window, &fw, &fh); ratio = (float)fw / (float)ww;
二、nanovg裁剪算法無效。
使用低級的OpenGL去繪圖是一個比較麻煩的事情。在LFTK中,采用了nanovg矢量圖繪圖函數庫,nanovg缺省使用的GLFW,要移植到SDL2上也不難。但是我發(fā)現nanovg的示例在SDL上和在GLFW上的效果有些差異,仔細觀察后,初步判斷與用stencil進行裁剪有關,以為是沒有啟用stencil測試引起的,于是加了下面的代碼:
glEnable(GL_STENCIL_TEST);
但是沒有效果,在nanovg的代碼中,也發(fā)現它自己會啟用stencil測試。對比基于nanovg基于GLFW的例子,也沒發(fā)現有價值的線索。然后對比SDL_CreateWindow/glfwCreateWindow和SDL_Init/glfwInit的實現,發(fā)現SDL中,stencil_size的缺省值是0,嘗試把設置它為8:
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
顯示正常了。
三、Windows下的OpenGL
在MacPro和Ubuntu下測試沒有問題,在Window測試時發(fā)現一些OpenGL函數找不到,明明已經鏈接了opengl32.dll啊。網上的方案多是基于GLUT和GLFW在Windows下做OpenGL開發(fā)的,SDL則沒有找到相關資料,只好再去研讀GLFW,看能不能從中借用部分代碼。很快發(fā)現deps/glad是干這個的,而glad是http://glad.dav1d.de/上在線生成的。把glad.c加入項目中,并調用初始化函數:
gladLoadGL();
編譯沒有問題了,不過運行起來就崩掉了。調試時發(fā)現glGetString(GL_VERSION)返回NULL,這個簡單的函數居然會失?。『髞碓趃oogle搜索 到glGetString(GL_VERSION)失敗的原因: gladLoadGL需要放在SDL_GL_CreateContext之后調用。而我把它放在了SDL_Init和SDL_GL_CreateContext之間了。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
Android自定義SwipeRefreshLayout高仿微信朋友圈下拉刷新
這篇文章主要以社交APP的BOSS微信為例,介紹了Android自定義SwipeRefreshLayout高仿微信朋友圈下拉刷新,感興趣的小伙伴們可以參考一下2016-07-07
Flutter搞定寬高不統(tǒng)一布局開發(fā)的方法詳解
我們在開發(fā)移動端界面的時候,經常會遇到一組尺寸不一的組件需要作為同一組展示,所以本文就將利用Wrap組件搞定寬高不統(tǒng)一布局開發(fā),需要的可以參考一下2023-06-06

