package com.yarin.android.Examples_13_04; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLUtils; import android.opengl.GLSurfaceView.Renderer; public class GLRender implements Renderer { int texture = -1; int xloop; // X��ѭ������ int yloop; // Y��ѭ������ float xrot, yrot, zrot; // ������ӵ���ʾ�б� FloatBuffer boxVertices = FloatBuffer.allocate(60); FloatBuffer boxTexCoords= FloatBuffer.allocate(40); // ������Ӷ�������ʾ�б� FloatBuffer topVertices = FloatBuffer.allocate(12); FloatBuffer topTexCoords= FloatBuffer.allocate(8); float[][] boxcol = { {1.0f, 0.0f, 0.0f}, {1.0f, 0.5f, 0.0f}, {1.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 1.0f}, }; float[][] topcol= { {0.5f, 0.0f, 0.0f}, {0.5f, 0.25f, 0.0f}, {0.5f, 0.5f, 0.0f}, {0.0f, 0.5f, 0.0f}, {0.0f, 0.5f, 0.5f}, }; public void BuildLists(GL10 gl) { boxTexCoords.put(new float[]{1.0f, 1.0f,0.0f, 1.0f,0.0f, 0.0f,1.0f,0.0f}); boxVertices.put(new float[]{-1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, -1.0f, 1.0f,-1.0f, -1.0f, 1.0f}); boxTexCoords.put(new float[]{0.0f, 0.0f,1.0f, 0.0f,1.0f, 1.0f,0.0f, 1.0f}); boxVertices.put(new float[]{-1.0f, -1.0f, 1.0f,1.0f, -1.0f, 1.0f,1.0f, 1.0f, 1.0f,-1.0f, 1.0f, 1.0f}); boxTexCoords.put(new float[]{1.0f, 0.0f,1.0f, 1.0f,0.0f, 1.0f,0.0f, 0.0f}); boxVertices.put(new float[]{-1.0f, -1.0f, -1.0f,-1.0f, 1.0f, -1.0f,1.0f, 1.0f, -1.0f,1.0f, -1.0f, -1.0f}); boxTexCoords.put(new float[]{1.0f, 0.0f,1.0f, 1.0f,0.0f, 1.0f,0.0f, 0.0f}); boxVertices.put(new float[]{1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f,1.0f, 1.0f, 1.0f,1.0f, -1.0f, 1.0f}); boxTexCoords.put(new float[]{0.0f, 0.0f,1.0f, 0.0f,1.0f, 1.0f,0.0f, 1.0f}); boxVertices.put(new float[]{-1.0f, -1.0f, -1.0f,-1.0f, -1.0f, 1.0f,-1.0f, 1.0f, 1.0f,-1.0f, 1.0f, -1.0f}); topTexCoords.put(new float[]{0.0f, 1.0f,0.0f, 0.0f,1.0f, 0.0f,1.0f, 1.0f}); topVertices.put(new float[]{-1.0f, 1.0f, -1.0f,-1.0f, 1.0f, 1.0f,1.0f, 1.0f, 1.0f,1.0f, 1.0f, -1.0f}); } @Override public void onDrawFrame(GL10 gl) { // �����Ļ����Ȼ��� gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // ������ gl.glBindTexture(GL10.GL_TEXTURE_2D, texture); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); for (yloop=1;yloop<6;yloop++) { for (xloop=0;xloop<yloop;xloop++) { gl.glLoadIdentity(); // ����ģ�ͱ仯���� // ���ú��ӵ�λ�� gl.glTranslatef(1.4f+((float)(xloop)*2.8f)-((float)(yloop)*1.4f),((6.0f-(float)(yloop))*2.4f)-7.0f,-20.0f); gl.glRotatef(45.0f-(2.0f*yloop)+xrot,1.0f,0.0f,0.0f); gl.glRotatef(45.0f+yrot,0.0f,1.0f,0.0f); gl.glColor4f(boxcol[yloop-1][0], boxcol[yloop-1][1], boxcol[yloop-1][2], 1.0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, boxVertices); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, boxTexCoords); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 4, 4); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 8, 4); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 12, 4); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 16, 4); /* Select The Top Color */ gl.glColor4f(topcol[yloop-1][0], topcol[yloop-1][1], topcol[yloop-1][2], 1.0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, topVertices); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, topTexCoords); gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); } } gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); xrot+=0.5f; yrot+=0.6f; zrot+=0.3f; } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height; //����OpenGL�����Ĵ�С gl.glViewport(0, 0, width, height); //����ͶӰ���� gl.glMatrixMode(GL10.GL_PROJECTION); //����ͶӰ���� gl.glLoadIdentity(); // �����ӿڵĴ�С gl.glFrustumf(-ratio, ratio, -1, 1, 1, 30); // ѡ��ģ�͹۲���� gl.glMatrixMode(GL10.GL_MODELVIEW); // ����ģ�͹۲���� gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // ��ɫ���� gl.glClearColor(0, 0, 0, 0); gl.glEnable(GL10.GL_CULL_FACE); // ������Ӱƽ�� gl.glShadeModel(GL10.GL_SMOOTH); // ������Ȳ��� gl.glEnable(GL10.GL_DEPTH_TEST); //��������ӳ�� gl.glClearDepthf(1.0f); //��Ȳ��Ե����� gl.glDepthFunc(GL10.GL_LEQUAL); //��ϸ��͸������ gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); //����2D��ͼ,���� gl.glEnable(GL10.GL_TEXTURE_2D); IntBuffer intBuffer = IntBuffer.allocate(1); // �������� gl.glGenTextures(1, intBuffer); texture = intBuffer.get(); // ����Ҫʹ�õ����� gl.glBindTexture(GL10.GL_TEXTURE_2D, texture); //�������� GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.mBitmap, 0); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); // ������ʾ�б� BuildLists(gl); gl.glEnable(GL10.GL_LIGHT0); // ʹ��Ĭ�ϵ�0�ŵ� //gl.glEnable(GL10.GL_LIGHTING); // ʹ�õƹ� gl.glEnable(GL10.GL_COLOR_MATERIAL); // ʹ����ɫ���� } }