標籤:height 自訂 str rem main strip 意思 轉換 代碼
首先畫個三角形
private float[] mTriangleArray={ 0.0f,1.0f,0.0f, 1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f };
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, mTriangleArray.length/3);
然後畫個兩個三角形拼成一個正方形,把之前的座標換一下就好了
private float[] mTriangleArray={ 1.0f,1.0f,0.0f, 1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f, -1.0f,1.0f,0.0f, 1.0f,1.0f,0.0f };
看來glDrawArrays是三個三個座標來畫的
我現在使用glDrawElements這個函數來畫正方形,這函數不僅可以畫多方形,而且還可以畫3D
private float[] mTriangleArray={ 1.0f,1.0f,0.0f, 1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f, -1.0f,1.0f,0.0f }; private float[] mColor ={ 1.0f,0.0f,0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f }; private byte[] cubeFacets = new byte[]{ 0, 1, 2, 0, 2, 3 }; gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer); gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer); gl.glDrawElements(GL10.GL_TRIANGLE_STRIP , cubeFacetsBuffer.remaining(), GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);
這函數的意思是你傳他畫三個點的座標組的位置(第一個從0開始,一個座標組有三個float),比如這個cubeFacets就是說0、1、2三個座標連起來畫個三角形,然後0、2、3座標畫個三角形。
以下是完整代碼
public class MainActivity extends Activity {
private GLSurfaceView mGLView;
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mGLView = new GLSurfaceView(this); //這裡使用的是自訂的GLSurfaceView的子類 mGLView.setRenderer(new GLRenderer()); setContentView(mGLView);}public void onPause(){ super.onPause(); mGLView.onPause();}public void onResume(){ super.onResume(); mGLView.onResume();}public class GLRenderer implements GLSurfaceView.Renderer { private float[] mTriangleArray={ 1.0f,1.0f,0.0f, 1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f, -1.0f,1.0f,0.0f }; private float[] mColor ={ 1.0f,0.0f,0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f }; private byte[] cubeFacets = new byte[]{ 0, 1, 2, 0, 2, 3 }; private FloatBuffer mTriangleBuffer; private FloatBuffer mColorBuffer; ByteBuffer cubeFacetsBuffer; public GLRenderer() { mTriangleBuffer = floatBufferUtil(mTriangleArray); mColorBuffer = floatBufferUtil(mColor); cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets); } @Override public void onDrawFrame(GL10 gl) { // 清除螢幕和深度緩衝 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 設定當前矩陣模式為模型視圖。 gl.glMatrixMode(GL10.GL_MODELVIEW); // 允許設定頂點 //GL10.GL_VERTEX_ARRAY頂點數組 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 允許設定顏色 //GL10.GL_COLOR_ARRAY顏色數組 gl.glEnableClientState(GL10.GL_COLOR_ARRAY); // 重設當前的模型觀察矩陣 gl.glLoadIdentity(); //將三角形在z軸上移動 gl.glTranslatef(0f, 0.0f, -2.0f); // 設定三角形 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer); // 設定三角形顏色 gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer); // 繪製三角形 gl.glDrawElements(GL10.GL_TRIANGLE_STRIP , cubeFacetsBuffer.remaining(), GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer); // 取消顏色設定 gl.glDisableClientState(GL10.GL_COLOR_ARRAY); // 取消頂點設定 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); //繪製結束 gl.glFinish(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height; // 設定OpenGL情境的大小,(0,0)表示視窗內部視口的左下角,(w,h)指定了視口的大小 gl.glViewport(0, 0, width, height); // 設定投影矩陣 gl.glMatrixMode(GL10.GL_PROJECTION); // 重設投影矩陣 gl.glLoadIdentity(); // 設定視口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); //以下兩句聲明,以後所有的變換都是針對模型(即我們繪製的圖形) gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 設定白色為清屏 gl.glClearColor(1, 1, 1, 1); }}// 定義一個工具方法,將float[]數群組轉換為OpenGL ES所需的FloatBufferprivate FloatBuffer floatBufferUtil(float[] arr){ FloatBuffer mBuffer; // 初始化ByteBuffer,長度為arr數組的長度*4,因為一個int佔4個位元組 ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4); // 數組排列用nativeOrder qbb.order(ByteOrder.nativeOrder()); mBuffer = qbb.asFloatBuffer(); mBuffer.put(arr); mBuffer.position(0); return mBuffer;}
}
Android OpenGL教程 二 2D形狀畫畫