前面講了一些Android OpenGl 的概念問題,這一節講給大家講一下如何畫一個三角現出來.
一、建立一個Android工程命名為:OpenGL_Lesson2.
二、修改OpenGL_Lesson2.java代碼如下:
package com.android.tutor;<br />import android.app.Activity;<br />import android.os.Bundle;<br />public class OpenGL_Lesson2 extends Activity {</p><p>private OpenGlView mOpenGlView;<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> mOpenGlView = new OpenGlView(this);<br /> setContentView(mOpenGlView);</p><p> }<br />}
三、建立一個類OpenGlView.java繼承與GLSurfaceView,代碼如下:
package com.android.tutor;<br />import android.content.Context;<br />import android.opengl.GLSurfaceView;<br />public class OpenGlView extends GLSurfaceView {</p><p>private OpenGlRender mOpenGlRender;<br />public OpenGlView(Context context) {<br />super(context);<br />mOpenGlRender = new OpenGlRender();<br />setRenderer(mOpenGlRender);<br />}</p><p>}<br />
四、建立一個OpenGlRender.java類繼承與Renderer,代碼如下:
package com.android.tutor;<br />import java.nio.ByteBuffer;<br />import java.nio.ByteOrder;<br />import java.nio.FloatBuffer;<br />import java.nio.ShortBuffer;<br />import javax.microedition.khronos.egl.EGLConfig;<br />import javax.microedition.khronos.opengles.GL10;<br />import android.opengl.GLSurfaceView.Renderer;<br />public class OpenGlRender implements Renderer {</p><p>private float _red = 0f;<br />private float _green = 25f;<br />private float _blue = 200f;</p><p>private ShortBuffer _indexBuffer;</p><p>private FloatBuffer _vertexBuffer;</p><p>private short[] _indicesArray = {0, 1, 2};<br /> private int _nrOfVertices = 3;<br />@Override<br />public void onSurfaceCreated(GL10 gl, EGLConfig config) {</p><p>gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);<br />initTriangle();<br />}<br />@Override<br />public void onSurfaceChanged(GL10 gl, int width, int height) {</p><p>gl.glViewport(0, 0, width, height);<br />}</p><p>@Override<br />public void onDrawFrame(GL10 gl) {<br />gl.glClearColor(_red, _green, _blue, 1.0f);</p><p>gl.glClear(GL10.GL_COLOR_BUFFER_BIT);</p><p> gl.glColor4f(0.5f, 0f, 0f, 0.5f);<br /> gl.glVertexPointer(_nrOfVertices, GL10.GL_FLOAT, 0, _vertexBuffer);<br /> gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);<br />}</p><p>private void initTriangle() {<br /> // float has 4 bytes<br /> ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4);<br /> vbb.order(ByteOrder.nativeOrder());<br /> _vertexBuffer = vbb.asFloatBuffer();</p><p> // short has 4 bytes<br /> ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);<br /> ibb.order(ByteOrder.nativeOrder());<br /> _indexBuffer = ibb.asShortBuffer();</p><p> float[] coords = {<br /> -0.5f, -0.5f, 0f, // (x1, y1, z1)<br /> 0.5f, -0.5f, 0f, // (x2, y2, z2)<br /> 0f, 0.5f, 0f // (x3, y3, z3)<br /> };</p><p> _vertexBuffer.put(coords);</p><p> _indexBuffer.put(_indicesArray);</p><p> _vertexBuffer.position(0);<br /> _indexBuffer.position(0);<br /> }<br />}<br />
五、運行之,效果如下:
今天晚上就先不做詳細解釋了!改日在加上!謝謝~