android opengl-es 平面贴图的代码

409 阅读1分钟
将内容过程较好的一些内容做个珍藏,下面的内容是关于android opengl-es 平面贴图的内容。

package dqq.test.texture;
 
 
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
 
 
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 
 
 
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLUtils;
 
 
 
 
public class MyRenderer implements GLSurfaceView.Renderer{
 
 
     
    private float[] cubeVertices = { 
            -0.6f, -0.6f, 0.0f, 
            -0.6f, 0.6f,0.0f, 
            0.6f, 0.6f, 0.0f, 
            0.6f, 0.6f, 0.0f, 
            0.6f, -0.6f, 0.0f,
            -0.6f, -0.6f, 0.0f, 
        };
     
    private byte[] cubeFacets = { 0, 1, 2, 3, 4, 5,
            };
    private float[] cubeTextures = { 
            1.0000f, 1.0000f,
            1.0000f, 0.0000f,
            0.0000f, 0.0000f, 
            0.0000f, 0.0000f, 
            0.0000f, 1.0000f,
            1.0000f, 1.0000f, 
             
             
        };
 
 
    private Context context;
    private FloatBuffer cubeVerticesBuffer;
    private ByteBuffer cubeFacetsBuffer;
    private FloatBuffer cubeTexturesBuffer;
    private int texture;
     
     
    MyRenderer(Context main){
         
        this.context = main;
        cubeVerticesBuffer = BufferUtil.floatToBuffer(cubeVertices);
        cubeFacetsBuffer = BufferUtil.byteToBuffer(cubeFacets);
        cubeTexturesBuffer = BufferUtil.floatToBuffer(cubeTextures);
         
         
         
    }
     
     
    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glTranslatef(0f, 0.0f, -2.0f);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeVerticesBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, cubeTexturesBuffer);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
        gl.glDrawElements(GL10.GL_TRIANGLES, cubeFacetsBuffer.remaining(),
            GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);
        gl.glFinish();
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }
 
 
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        float ratio = (float) width / height;
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }
 
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(0, 0, 0, 0);
        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        loadTexture(gl);
    }
     
     
    private void loadTexture(GL10 gl)
    {
        Bitmap bitmap = null;
        try
        {
            bitmap = BitmapFactory.decodeResource(context.getResources(),
                R.drawable.sand);
            int[] textures = new int[1];
            gl.glGenTextures(1, textures, 0);
            texture = textures[0];
            gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D,
                GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D,
                GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
                GL10.GL_REPEAT);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
                GL10.GL_REPEAT);
            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);       }
        finally
        {
            if (bitmap != null)
                bitmap.recycle();
        }
    }
     
 
 
}