Android 3D开发,OpenGL ES 的使用(一)
最近有人問OpenGL ES 的使用,我通過幾行代碼演示一下。
不需要講 來源 歷史或大篇前奏。。
通過短短的一段就能迅速理解OpenGL ES 初步使用方法,對OpenGL ES 有了大概的概念和感知。
和其他view的使用一樣:
?
<GLSurfaceViewandroid:id="@+id/gl_view"android:layout_width="match_parent"android:layout_height="match_parent"/> public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);GLSurfaceView glSurfaceView = (GLSurfaceView) findViewById(R.id.gl_view);glSurfaceView.setRenderer(new MyRender());} }是不是很簡單。。。。setRenderer(); 就算完成了.
?
發(fā)現(xiàn)了重點(diǎn),所有的繪制都在MyRender() 這個(gè)類里。。。。先不急著講MyRender(),分析一下OpenGL ES的使用步驟:
①創(chuàng)建GLSurfaceView組件,并使用Activity來顯示。
②為GLSurfaceView組件創(chuàng)建一個(gè)MyRender實(shí)例,并實(shí)現(xiàn)GLSurfaceView.Renderer 接口的三個(gè)方法。
public class MyRender implements GLSurfaceView.Renderer {
}
③調(diào)用GLSurfaceView的setRenderer(new MyRender());方法。此Renderer對象將完成GLSurfaceView的3D圖形繪制。
?
實(shí)際的使用中,難點(diǎn)在Renderer類。下面講一下Renderer的結(jié)構(gòu)。
?
import android.opengl.GLSurfaceView; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;/*** Created by Administrator on 2017/3/8.*/ public class MyRender implements GLSurfaceView.Renderer {/*** 當(dāng)SurfaceView創(chuàng)建的時(shí)候,系統(tǒng)會(huì)回調(diào)這個(gè)方法* 該方法可以對SurfaceView執(zhí)行一些無變化的初始化操作* @param gl10* @param eglConfig*/@Overridepublic void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {gl10.glDisable(GL10.GL_DITHER);//關(guān)閉抗抖動(dòng)//禁用某些功能// 設(shè)置系統(tǒng)對透視進(jìn)行修正 // 對某方面修正gl10.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);gl10.glClearColor(0,0,0,0);// 設(shè)置清屏用的顏色,RGBA// 設(shè)置陰影為平滑模式gl10.glShadeModel(GL10.GL_SMOOTH);// 設(shè)置陰影模式// 啟用深度測試即Z軸 //與glDisable相反,啟用。gl10.glEnable(GL10.GL_DEPTH_TEST);// 設(shè)置深度測試的類型gl10.glDepthFunc(GL10.GL_LEQUAL);}/*** 此初始化為SurfaceView大小變化時(shí)初始化調(diào)用* 多用于3D場景初始化* @param gl10* @param width* @param height*/@Overridepublic void onSurfaceChanged(GL10 gl10, int width, int height) {gl10.glViewport(0, 0, width, height);//設(shè)置3D視窗的大小及位置gl10.glMatrixMode(GL10.GL_PROJECTION);//當(dāng)前矩陣模式設(shè)置為投影矩陣gl10.glLoadIdentity();// 初始化單位矩陣float ratio =(float)width/height;//計(jì)算視窗的寬高比gl10.glFrustumf(-ratio,ratio,-1,1,1,0);//設(shè)置透視窗的空間大小}@Overridepublic void onDrawFrame(GL10 gl10) {gl10.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);//清除屏幕緩存和深度緩存// 下面就開始用GL10繪制自己想要的圖形了} }
此時(shí)在回顧一下OpenGL ES的使用步驟:
?
?
①創(chuàng)建GLSurfaceView組件,并使用Activity來顯示。
②為GLSurfaceView組件創(chuàng)建一個(gè)MyRender實(shí)例,并實(shí)現(xiàn)GLSurfaceView.Renderer 接口的三個(gè)方法。
public class MyRender implements GLSurfaceView.Renderer {
}
③調(diào)用GLSurfaceView的setRenderer(new MyRender());方法。此Renderer對象將完成GLSurfaceView的3D圖形繪制。
第二步應(yīng)該就明白了。。。。
實(shí)現(xiàn)GLSurfaceView.Renderer 接口然后實(shí)現(xiàn)它的三個(gè)方法。。兩個(gè)初始化方法,一個(gè)繪制方法。
初始化比如設(shè)置我們窗口打開是否啟用Z軸,是否有邊框,是否有陰影,每繪制一層都要清屏,我們用什么顏色清屏,窗口打開時(shí)的大小,窗口的某些功能是不是需要關(guān)閉等等。一系列的初始化設(shè)置。。。
然后onDrawFrame方法開始根據(jù)設(shè)置好的坐標(biāo)開始繪制圖形了。。。
繪制之前調(diào)用gl10.glClear 來清屏。然后再繪制。
具體繪制下篇再寫,繪制需要設(shè)置每個(gè)頂點(diǎn)的坐標(biāo)和顏色值,接下來就是機(jī)械式的尋找各點(diǎn)坐標(biāo),設(shè)置各個(gè)點(diǎn)的 float[] 數(shù)組。
3D圖形 頂點(diǎn)多 坐標(biāo)多,此篇理解了,下一步就是放坐標(biāo)數(shù)據(jù)。。分開不容易亂。。。
下一篇在onDrawFrame方法中加入坐標(biāo)數(shù)據(jù)開始繪制。。
熬夜寫教程不容易,
如果你欣賞我的代碼,
可以贊賞我?guī)讐K錢買個(gè)新鍵盤。
?
總結(jié)
以上是生活随笔為你收集整理的Android 3D开发,OpenGL ES 的使用(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 踏平RecyclerView使用的各种坑
- 下一篇: Android 自定义view的知识梳理