SDL2和OpenGL使用踩坑筆記經(jīng)驗(yàn)分享
SDL + OpenGL使用筆記
LFTK
是一個(gè)嵌入式GUI,為了開發(fā)方便,需要提供PC運(yùn)行環(huán)境。我選擇了SDL2
+OpenGL
+nanovg
來實(shí)現(xiàn)底層的渲染,讓LFTK可以運(yùn)行在各個(gè)平臺(tái)上。GLFW+OpenGL也是一個(gè)不錯(cuò)的選擇,但是GLFW沒有Android和iOS的移植,而且沒有提供原生輸入法的支持。LFTK雖然最初是為嵌入式系統(tǒng)而生,但也有一個(gè)小目標(biāo):可以用于開發(fā)嵌入式系統(tǒng),也可以開發(fā)PC軟件和移動(dòng)APP,所以最后選擇了SDL2+OpenGL+nanovg。在使用SDL2+OpenGL+nanovg的過程中,踩了一些坑,這里做個(gè)筆記,給需要的朋友參考:
一、在MacPro上顯示模糊的問題。
在網(wǎng)上查了一下,有人提供的方案是設(shè)置SCALE_QUALITY,貌似也有些道理,但是效果不佳。
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest");
花了一些時(shí)間去看SDL的源碼后,發(fā)現(xiàn)其實(shí)SDL在創(chuàng)建窗口時(shí)提供了SDL_WINDOW_ALLOW_HIGHDPI標(biāo)志,可以用來解決模糊的問題:
SDL_CreateWindow("LFTK Simulator", x, y, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);
如果設(shè)置了SDL_WINDOW_ALLOW_HIGHDPI標(biāo)志,窗口大小和Drawable的大小可能不一致,在繪圖時(shí)需要做相應(yīng)縮放:
SDL_GetWindowSize(sdl_window, &ww, &wh); SDL_GL_GetDrawableSize(sdl_window, &fw, &fh); ratio = (float)fw / (float)ww;
二、nanovg裁剪算法無效。
使用低級(jí)的OpenGL去繪圖是一個(gè)比較麻煩的事情。在LFTK中,采用了nanovg矢量圖繪圖函數(shù)庫(kù),nanovg缺省使用的GLFW,要移植到SDL2上也不難。但是我發(fā)現(xiàn)nanovg的示例在SDL上和在GLFW上的效果有些差異,仔細(xì)觀察后,初步判斷與用stencil進(jìn)行裁剪有關(guān),以為是沒有啟用stencil測(cè)試引起的,于是加了下面的代碼:
glEnable(GL_STENCIL_TEST);
但是沒有效果,在nanovg的代碼中,也發(fā)現(xiàn)它自己會(huì)啟用stencil測(cè)試。對(duì)比基于nanovg基于GLFW的例子,也沒發(fā)現(xiàn)有價(jià)值的線索。然后對(duì)比SDL_CreateWindow/glfwCreateWindow和SDL_Init/glfwInit的實(shí)現(xiàn),發(fā)現(xiàn)SDL中,stencil_size的缺省值是0,嘗試把設(shè)置它為8:
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
顯示正常了。
三、Windows下的OpenGL
在MacPro和Ubuntu下測(cè)試沒有問題,在Window測(cè)試時(shí)發(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是干這個(gè)的,而glad是http://glad.dav1d.de/上在線生成的。把glad.c加入項(xiàng)目中,并調(diào)用初始化函數(shù):
gladLoadGL();
編譯沒有問題了,不過運(yùn)行起來就崩掉了。調(diào)試時(shí)發(fā)現(xiàn)glGetString(GL_VERSION)返回NULL,這個(gè)簡(jiǎn)單的函數(shù)居然會(huì)失??!后來在google搜索 到glGetString(GL_VERSION)失敗的原因: gladLoadGL需要放在SDL_GL_CreateContext之后調(diào)用。而我把它放在了SDL_Init和SDL_GL_CreateContext之間了。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- OpenGL中的glutInitDisplayMode()函數(shù)的理解
- OpenGL關(guān)于glStencilFuncSeparate()和glStencilFunc()函數(shù)的區(qū)別講解
- OpenGL Shader實(shí)例分析(7)雪花飄落效果
- OpenGL Shader實(shí)例分析(1)Wave效果
- Android利用OpenGLES繪制天空盒實(shí)例教程
- android使用OPENGL ES繪制圓柱體
- opengl實(shí)現(xiàn)任意兩點(diǎn)間畫圓柱體
- OpenGL ES透視投影實(shí)現(xiàn)方法(四)
- OpenGL ES著色器使用詳解(二)
- OpenGL實(shí)現(xiàn)Bezier曲線的方法示例
相關(guān)文章
Android實(shí)現(xiàn)實(shí)時(shí)搜索框功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)實(shí)時(shí)搜索框功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Android中的RecyclerView新組件初步上手指南
RecyclerView是Android L版本開始采用的一個(gè)組件,被人們認(rèn)為用來代替?zhèn)鹘y(tǒng)的ListView,下面我們就一起來看一下Android中的RecyclerView新組件初步上手指南2016-06-06Android編程基礎(chǔ)之獲取手機(jī)屏幕大小(DisplayMetrics應(yīng)用)示例
這篇文章主要介紹了Android獲取手機(jī)屏幕大小的方法,結(jié)合實(shí)例形式分析了TextView ,Button ,以及DisplayMetrics的使用方法,并重點(diǎn)分析了DisplayMetrics的應(yīng)用技巧,需要的朋友可以參考下2016-10-10詳解Android的MVVM框架 - 數(shù)據(jù)綁定
這篇文章主要介紹了詳解Android的MVVM框架 - 數(shù)據(jù)綁定,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Android實(shí)現(xiàn)3D層疊式卡片圖片展示
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)3D層疊式卡片圖片展示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10android 自定義ScrollView實(shí)現(xiàn)背景圖片伸縮的實(shí)現(xiàn)代碼及思路
本文純屬個(gè)人見解,是對(duì)前面學(xué)習(xí)的總結(jié),如有描述不正確的地方還請(qǐng)高手指正~,首先還是按照通例給大家看下示例.2013-05-05Android 使用selector改變按鈕狀態(tài)實(shí)例詳解
這篇文章主要介紹了Android 使用selector改變按鈕狀態(tài)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01Android studio 3.0上進(jìn)行多渠道打包遇到的問題小結(jié)(超簡(jiǎn)潔版)
這篇文章主要介紹了Android studio 3.0上進(jìn)行多渠道打包遇到的問題小結(jié)(超簡(jiǎn)潔版),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11