Android之GLSurfaceView立方体各面不同图片纹理测试代码
2016-06-08 15:34
417 查看
public class MainActivity extends Activity { private GLSurfaceView mGLView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLView = new DemoGLSurfaceView(this); setContentView(mGLView); } } class DemoGLSurfaceView extends GLSurfaceView{ DomeGLRender mRenderer; public DemoGLSurfaceView(Context context) { super(context); mRenderer = new DomeGLRender(context.getResources()); this.setRenderer(mRenderer); } public boolean onTouchEvent(final MotionEvent event){ this.queueEvent(new Runnable() { @Override public void run() { if(mRenderer.bLight){ mRenderer.bLight = false; }else{ mRenderer.bLight = true; } } }); return true; } } class DomeGLRender implements Renderer { public boolean bLight = true;//是否开启灯光 private float[] vertices;//顶点数组 private float[] textCood;//纹理数组 float xrot,yrot; //旋转 float xSpeed,ySpeed; //移动速度 private int[] textures = new int[1]; private FloatBuffer vertexBuffer; //顶点缓冲 private FloatBuffer textCoodBuffer; //纹理缓冲 //环境光 private float[] lightAmbient; private FloatBuffer AmbientBuffer; //漫射光 private float[] lightDiffuse; private FloatBuffer diffuseBuffer; //光源位置 private float[] lightPosition; private FloatBuffer positionBuffer; public static Bitmap[] mBitmap = new Bitmap[6]; public DomeGLRender(Resources resources){ mBitmap[0] = BitmapFactory.decodeResource(resources, R.drawable.img0); mBitmap[1] = BitmapFactory.decodeResource(resources, R.drawable.img1); mBitmap[2] = BitmapFactory.decodeResource(resources, R.drawable.img2); mBitmap[3] = BitmapFactory.decodeResource(resources, R.drawable.img0); mBitmap[4] = BitmapFactory.decodeResource(resources, R.drawable.img1); mBitmap[5] = BitmapFactory.decodeResource(resources, R.drawable.img2); initData(); initBuffer(); } private void initData(){ //顶点数组 vertices = new float[] { -1f, -1f, 1f, 1f, -1f, 1f, -1f, 1f, 1f, 1f, 1f, 1f, 1f, -1f, 1f, 1f, -1f, -1f, 1f, 1f, 1f, 1f, 1f, -1f, 1f, -1f, -1f, -1f, -1f, -1f, 1f, 1f, -1f, -1f, 1f, -1f, -1f, -1f, -1f, -1f, -1f, 1f, -1f, 1f, -1f, -1f, 1f, 1f, -1f, 1f, -1f, 1f, 1f, -1f, -1f, 1f, 1f, 1f, 1f, 1f, -1f, -1f, -1f, -1f, -1f, 1f, 1f, -1f, -1f, 1f, -1f, 1f }; //纹理数组,贴图时注意android中坐标与OpengGL 中定义的不同,android,y轴是向下的 textCood = new float[] { 0, 0, 1f, 0, 0, 1f, 1f, 1f }; //灯光 lightAmbient = new float[]{0.5f,0.5f,0.5f,1.0f}; lightDiffuse = new float[]{1.0f,1.0f,1.0f,1.0f}; lightPosition = new float[]{0.0f,0.0f,2.0f,1.0f}; } private void initBuffer(){ //顶点 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); vertexBuffer = vbb.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); //纹理 ByteBuffer tbb = ByteBuffer.allocateDirect(textCood.length * 4 * 6); tbb.order(ByteOrder.nativeOrder()); textCoodBuffer = tbb.asFloatBuffer(); for (int i = 0; i < 6; i++) { textCoodBuffer.put(textCood); } textCoodBuffer.position(0); //环境光 ByteBuffer ambientbb = ByteBuffer.allocateDirect(lightAmbient.length * 4); ambientbb.order(ByteOrder.nativeOrder()); AmbientBuffer = ambientbb.asFloatBuffer(); AmbientBuffer.put(lightAmbient); AmbientBuffer.position(0); //漫射光 ByteBuffer diffusebb = ByteBuffer.allocateDirect(lightDiffuse.length * 4); diffusebb.order(ByteOrder.nativeOrder()); diffuseBuffer = diffusebb.asFloatBuffer(); diffuseBuffer.put(lightDiffuse); diffuseBuffer.position(0); //灯光位置 ByteBuffer positionbb = ByteBuffer.allocateDirect(lightPosition.length * 4); positionbb.order(ByteOrder.nativeOrder()); positionBuffer = positionbb.asFloatBuffer(); positionBuffer.put(lightPosition); positionBuffer.position(0); } @Override public void onDrawFrame(GL10 gl) { //清除颜色和深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); //启用灯光 gl.glEnable(GL10.GL_LIGHTING); //启用顶点和纹理缓存 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //移动和旋转设置 gl.glTranslatef(0.0f, 0.0f, -6.0f); gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); //设置顶点和纹理,经常忘记设置,唉! gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textCoodBuffer); //绘制六个面,贴图 for (int i = 0; i < 6; i++) { GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap[i], 0); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4); } //取消缓存,需我们自己手动 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glLoadIdentity(); xrot += 0.5f; yrot += 0.5f; if (!bLight) { gl.glDisable(GL10.GL_LIGHT1); } else { gl.glEnable(GL10.GL_LIGHT1); } } @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); //观察模型 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { //透视效果 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); //清屏 gl.glClearColor(0, 0, 0, 0); //启用阴影平滑 gl.glShadeModel(GL10.GL_SMOOTH); //清除深度缓存 gl.glClearDepthf(1f); //启用深度缓存 gl.glEnable(GL10.GL_DEPTH_TEST); //深度缓存模式 gl.glDepthFunc(GL10.GL_LEQUAL); //启用纹理 gl.glEnable(GL10.GL_TEXTURE_2D); //创建纹理 gl.glGenTextures(1, textures, 0); //绑定纹理 gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //生成纹理 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap[0], 0); //线性滤波处理 gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); //设置环境光 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, AmbientBuffer); //设置漫射光 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, diffuseBuffer); //设置灯光位置 gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, positionBuffer); //启用1号灯光 gl.glEnable(GL10.GL_LIGHT1); } }
相关文章推荐
- Android中px,dp,sp单位的区别和应用
- Android 动态生成复杂的布局(View布局的子控件含自己的点击事件)
- Android——ViewPager+RadioGroup+Fragment
- Android 5.X 新特性详解(一)——主题、Palette、阴影、着色和裁剪
- Android使用线程获取网络图片的方法
- Android图片占据的内存大小分析
- 深入了解Android自动化测试-2.monkey脚本
- android5.1平板或手机应用层一些常用的修改项(eg:MTK8163)
- Android消息循环机制源码分析
- Android开发笔记之四大组件琐碎知识回顾总结
- EventBus 3.0的使用以及要点
- android 中Fragment的简单应用
- Activity跳转最佳实践
- Android实现背景透明度渐变的效果,类似于分享底部的弹出框
- android 实现AIDL之简单计算器
- Android编译可执行程序
- 全局Context
- Android编程之LayoutInflater的inflate方法详解
- Android事件传递
- View 的绘制流程