Android OpenGL ES(十)绘制三角形Triangle .
生活随笔
收集整理的這篇文章主要介紹了
Android OpenGL ES(十)绘制三角形Triangle .
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三角形為OpenGL ES支持的面,同樣創建一個DrawTriangle Activity,定義6個頂點使用三種不同模式來繪制三角形:
?
float vertexArray[] = {-0.8f, -0.4f * 1.732f, 0.0f,0.0f, -0.4f * 1.732f, 0.0f,-0.4f, 0.4f * 1.732f, 0.0f,0.0f, -0.0f * 1.732f, 0.0f,0.8f, -0.0f * 1.732f, 0.0f,0.4f, 0.4f * 1.732f, 0.0f, };?
本例繪制
?
public void DrawScene(GL10 gl) {super.DrawScene(gl);ByteBuffer vbb= ByteBuffer.allocateDirect(vertexArray.length*4);vbb.order(ByteOrder.nativeOrder());FloatBuffer vertex = vbb.asFloatBuffer();vertex.put(vertexArray);vertex.position(0);gl.glLoadIdentity();gl.glTranslatef(0, 0, -4);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex);index++;index%=10;switch(index){case 0:case 1:case 2:gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);break;case 3:case 4:case 5:gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 6);break;case 6:case 7:case 8:case 9:gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 6);break;}gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}?
這里index 的目的是為了延遲一下顯示(更好的做法是使用固定時間間隔)。前面說過GLSurfaceView 的渲染模式有兩種,一種是連續不斷的更新屏幕,另一種為on-demand ,只有在調用requestRender() 在更新屏幕。 缺省為RENDERMODE_CONTINUOUSLY 持續刷新屏幕。
OpenGLDemos 使用的是缺省的RENDERMODE_CONTINUOUSLY持續刷新屏幕 ,因此Activity的drawScene 會不斷的執行。本例中屏幕上順序以紅,綠,藍色顯示TRIANGLES, TRIANGLE_STRIP,TRIANGLE_FAN。
?完整代碼:
MainActivity.java
package com.example.gltest;import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.Window; import android.view.WindowManager;public class MainActivity extends Activityimplements IOpenGLDemo{float vertexArray[] = {-0.8f, -0.4f * 1.732f, 0.0f,-0.4f, 0.4f * 1.732f, 0.0f,0.0f, -0.4f * 1.732f, 0.0f,0.4f, 0.4f * 1.732f, 0.0f,};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);mGLSurfaceView = new GLSurfaceView(this);mGLSurfaceView.setRenderer(new OpenGLRenderer(this));setContentView(mGLSurfaceView);}// public void DrawScene(GL10 gl) { // gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // // Clears the screen and depth buffer. // gl.glClear(GL10.GL_COLOR_BUFFER_BIT // | GL10.GL_DEPTH_BUFFER_BIT); // // }public void DrawScene(GL10 gl) {//super.DrawScene(gl); ByteBuffer vbb= ByteBuffer.allocateDirect(vertexArray.length*4);vbb.order(ByteOrder.nativeOrder());FloatBuffer vertex = vbb.asFloatBuffer();vertex.put(vertexArray);vertex.position(0);gl.glLoadIdentity();gl.glTranslatef(0, 0, -4);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex);int index = 0;index ++;index%=10;switch(index){case 0:case 1:case 2:gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);break;case 3:case 4:case 5:gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 6);break;case 6:case 7:case 8:case 9:gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 6);break;}gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}@Overrideprotected void onResume() {// Ideally a game should implement// onResume() and onPause()// to take appropriate action when the//activity looses focus super.onResume();mGLSurfaceView.onResume();}@Overrideprotected void onPause() {// Ideally a game should implement onResume()//and onPause()// to take appropriate action when the//activity looses focus super.onPause();mGLSurfaceView.onPause();}private GLSurfaceView mGLSurfaceView;}后面的?OpenGLRenderer.java和??IOpenGLDemo.java一樣。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Android OpenGL ES(十)绘制三角形Triangle .的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (三十)java多线程一
- 下一篇: AlarmManager机制和系统唤醒锁