绘制一个3D的三棱锥
1.代码
package com.lanhuidong.opengl; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import com.lanhuidong.opengl.util.BufferToNativeOrder; import android.opengl.GLSurfaceView.Renderer; public class OpenGL3DRender implements Renderer { private float unit = 0.5f; private float sqrt = (float) Math.sqrt(3); private float[] triArray = new float[] { 0, unit, 0, -unit, 0, unit/sqrt, unit, 0, unit/sqrt, 0, unit, 0, unit, 0, unit/sqrt, 0, 0, -unit*2*sqrt/3, 0, unit, 0, 0, 0, -unit*2*sqrt/3, -unit, 0, unit/sqrt, -unit, 0, unit/sqrt, unit, 0, unit/sqrt, 0, 0, -unit*2*sqrt/3 }; private float colorUnit = 1f; private float[] triColor = new float[]{ colorUnit, 0, 0, colorUnit, 0, colorUnit, 0, colorUnit, 0, colorUnit, colorUnit, colorUnit, colorUnit, 0, 0, colorUnit, 0, colorUnit, colorUnit, colorUnit, colorUnit, 0, colorUnit, colorUnit, colorUnit, 0, 0, colorUnit, 0, colorUnit, 0, colorUnit, colorUnit, 0, colorUnit, colorUnit, 0, colorUnit, 0, colorUnit, 0, colorUnit, colorUnit, colorUnit, colorUnit, 0, colorUnit, colorUnit }; private float triangle = 0f; @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); FloatBuffer floatBuffer = BufferToNativeOrder.getNativeOrderFloatBuffer(triArray); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, floatBuffer); gl.glColorPointer(4, GL10.GL_FLOAT, 0, BufferToNativeOrder.getNativeOrderFloatBuffer(triColor)); gl.glRotatef(triangle, 0, 1, 0); triangle += 1f; for(int i = 0; i < 4; i++){ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 3, 3); } gl.glDisableClientState(GL10.GL_COLOR_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); float ratio = (float) width / height; gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(0, 0, 1.0f, 0.5f); } }
2.效果