認識OpenGL
什么是OpenGL?
Open Graphics Library
圖形領域的工業標準,是一套跨編程語言、跨平臺的、專業的圖形編程(軟件)接口
。它用于二維、三維圖像,是一個功能強大,調用方便的底層圖形庫。
與硬件無關。可以在不同的平臺如Windows、Linux、Mac、Android、IOS之間進行移植。因此,支持OpenGL的軟件具有很好的移植性,可以獲得非常廣泛的應用。
什么是OpenGL ES
針對手機、PDA和游戲主機等嵌入式設備而設計的OpenGL API 子集。
可以使用Java/JNI開發
OpenGL的繪圖原理
頂點數據->頂點著色器
(圖元裝配->光柵化)->(紋理->)片元著色器
->逐片元處理->幀緩存
頂點著色器 確認形狀
片元著色器 上色
著色器(Shader)是運行在GPU上的小程序。
頂點著色器(vertex shader):
如何處理頂點、法線等數據的小程序。
片元著色器(fragment shader):
如何處理光、陰影、遮擋、環境等等對物體表面的影響,最終生成一副圖像的小程序
Android 和 OpenGL ES
android設備對OpenGL ES的支持:
OpenGL ES 1.0 和 1.1 :Android 1.0和更高的版本支持這個API規范。
OpenGL ES 2.0 :Android 2.2(API 8)和更高的版本支持這個API規范。
OpenGL ES 3.0 :Android 4.3(API 18)和更高的版本支持這個API規范。
OpenGL ES 3.1 : Android 5.0(API 21)和更高的版本支持這個API規范。
目前廣泛支持的是2.0 使用時需要在配置文件中加入
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
GLSurfaceView:
繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。
管理Surface與EGL
允許自定義渲染器(render)。
讓渲染器在獨立的線程里運作,和UI線程分離。
支持按需渲染(on-demand)和連續渲染(continuous)。
1.setRenderer(Render render)設置渲染器
render中需要實現
onSurfaceCreated()
onSurfaceChanged()
onDrawFrame()三個方法
2.GLThread gl線程 調用渲染器
/**
* 配置GLSurfaceView
*/
//1.設置EGL版本
setEGLContextClientVersion(2);
//2.設置渲染器
setRenderer(new MyRenderer());
//3.設置渲染模式
// RENDERMODE_WHEN_DIRTY 按需渲染 當我們調動requestRender時候 請求 GLThread回調一次 onDrawFrame
// RENDERMODE_CONTINUOUSLY 連續渲染 自動請求 GLThread調用onDrawFrame
setRenderMode(RENDERMODE_WHEN_DIRTY);
EGL:
OpenGL是一個跨平臺的操作GPU的API,但OpenGL需要本地視窗系統進行交互,這就需要一個中間控制層, EGL就是連接OpenGL ES和本地窗口系統的接口,引入EGL就是為了屏蔽不同平臺上的區別。
GLSurfaceView已經提供了EGL環境的配置,不需要我們做多余的操作。
GLSL語言編寫頂點著色器和片元著色器
android studio中下載 GLSL plugin 插件,方便編寫時高亮顯示。使用插件的話對文件的后綴有要求:
頂點著色器 .vert
片元著色器 .frag
1.常用的數據類型
float 浮點型
vec2 含兩個浮點型數據的向量
vec4 含四個浮點型數據的向量(xyzw,rgba,stpq)
sampler2D 2D紋理采樣器(代表一層紋理)
2.修飾符
attribute 屬性變量。只能用于 頂點著色器 中。 一般用該變量來表示一些頂點數據,如:頂點坐標、紋理坐標、顏色等。
uniforms 一致變量。在著色器執行期間一致變量的值是不變的。與const常量不同的是,這個值在編譯時期是未知的是由著色器外部初始化的。
varying 易變變量。是從頂點著色器傳遞到片元著色器的數據變量。
3.內建函數
texture2D (采樣器,坐標) 采樣指定位置的紋理
4.內建變量
頂點 gl_Position vec4 頂點位置
片元 gl_FragColor vec4 顏色
5.其他
precision lowp 低精度
precision mediump 中精度
precision highp 高精度
為大家整理了一些GLSL語言教程,如果想更深入了解的可以參考下面的教程資料:
權威官方文檔:https://www.opengl.org/documentation/glsl/
權威民間金典新手教程:http://blog.csdn.net/racehorse
一個具體完整的GLSL代碼:http://www.ituring.com.cn/article/851
GLSL簡單介紹和全部內置變量:http://www.linuxgraphics.cn/opengl/shader_overview.html
http://blog.csdn.net/kaixinbingju/article/details/14518387
http://www.cnblogs.com/mazhenyu/p/3804518.html
百度文庫完整PPT:http://wenku.baidu.com/link?url=KUUhkIFpxtJOptnaFccKEWqOJw-yvnLoYGdkiwmYW0mnRpoSENQrk6TVst1_rHZJM_2sBh61H5tKX8pbNFyImM_ObOSrMDnp9LD2bqYjjCi
百度文庫入門WORLD教程:http://wenku.baidu.com/link?url=wokPChPUUK9nuFTefB0WgxOK7ZGsfLMSRZ8JjXrB7mHR063L61GUkpWrNe7I58peo5dt6fdLVIfLoEvh5nNHRdedcKZl0qMZzwLSzD6Nj5e
http://wenku.baidu.com/view/be62e6bcf121dd36a32d824c.html?re=view
http://wenku.baidu.com/view/518048d528ea81c758f57800.html
GLSL語言語法基礎:http://my.oschina.net/sweetdark/blog/208024#OSC_h3_12
OpenGL坐標系
以上就是openGL的一些基礎知識,大家有什么不懂的可以評論告訴我,我會根據反饋進行更新。