`
wo_deqing
  • 浏览: 64218 次
文章分类
社区版块
存档分类
最新评论

Android OpenGL | ES开启混合色

 
阅读更多
这一节看看混合色的开启,主要是实现立方体半透明的效果,但是今天这篇文章因为内容比较少,所以就增加了点触事件,当触及屏幕的时候,开启半透明效果,再次点击就关闭混合效果,效果图如下:

开启透明混色前

开启半透明混色后

接着上一节的Android高级进阶九 Android OpenGL对立方体进行光照处理代码,我们接着整改,看代码:

Java代码
  1. //设置光线,,1.0f为全光线,a=50%
  2. gl.glColor4f(1.0f,1.0f,1.0f,0.5f);
  3. //基于源象素alpha通道值的半透明混合函数
  4. gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE);

只需增加上述方法即可开启,现在我们通过点触事件来控制其开启:

Java代码
  1. @Override
  2. publicbooleanonTouchEvent(MotionEventevent){
  3. //TODOAuto-generatedmethodstub
  4. if(event.getAction()==MotionEvent.ACTION_DOWN){
  5. key=!key;
  6. }
  7. returnsuper.onTouchEvent(event);
  8. }

完整代码如下:


    package org.ourunix.android.opengltest;    
    import java.nio.ByteBuffer;    
    import java.nio.ByteOrder;    
    import java.nio.FloatBuffer;    
    import java.nio.IntBuffer;    
        
    import javax.microedition.khronos.egl.EGLConfig;    
    import javax.microedition.khronos.opengles.GL10;    
        
    import android.app.Activity;    
    import android.graphics.Bitmap;    
    import android.graphics.BitmapFactory;    
    import android.opengl.GLSurfaceView;    
    import android.opengl.GLUtils;    
    import android.opengl.GLSurfaceView.Renderer;    
    import android.os.Bundle;    
    import android.view.KeyEvent;    
    import android.view.MotionEvent;    
        
    public class OpenGLTestActivity extends Activity {    
        private boolean key = false;    
        /** Called when the activity is first created. */    
        @Override    
        public void onCreate(Bundle savedInstanceState) {    
            super.onCreate(savedInstanceState);    
            GLSurfaceView glView = new GLSurfaceView(this);    
            glView.setRenderer(new GLRender());    
            setContentView(glView);    
        }    
            
        public class GLRender implements Renderer{     
                
            private int texture = -1;    
            private int one = 0x10000;      
            private int[] quarter = {-one,-one,one,    
                                    one,-one,one,    
                                    one,one,one,    
                                    -one,one,one,    
                                        
                                    -one,-one,-one,    
                                    -one,one,-one,    
                                    one,one,-one,    
                                    one,-one,-one,    
                                        
                                    -one,one,-one,    
                                    -one,one,one,    
                                    one,one,one,    
                                    one,one,-one,    
                                        
                                    -one,-one,-one,    
                                    one,-one,-one,    
                                    one,-one,one,    
                                    -one,-one,one,    
                                        
                                    one,-one,-one,    
                                    one,one,-one,    
                                    one,one,one,    
                                    one,-one,one,    
                                        
                                    -one,-one,-one,    
                                    -one,-one,one,    
                                    -one,one,one,    
                                    -one,one,-one,};    
                
            private int[] texCoords = {one,0,0,0,0,one,one,one,     
                                    0,0,0,one,one,one,one,0,    
                                    one,one,one,0,0,0,0,one,    
                                    0,one,one,one,one,0,0,0,    
                                    0,0,0,one,one,one,one,0,    
                                    one,0,0,0,0,one,one,one,};    
            //准备正方体顶点      
            private IntBuffer quarterBuffer = BufferUtil.iBuffer(quarter);      
            //纹理映射数据    
            private IntBuffer texCoordsBuffer = BufferUtil.iBuffer(texCoords);     
            ByteBuffer indicesBuffer = ByteBuffer.wrap(new byte[]{    
                    0,1,3,2,    
                    4,5,7,6,    
                    8,9,11,10,    
                    12,13,15,14,    
                    16,17,19,18,    
                    20,21,23,22,    
            });    
                
            private float rotateX; //用于正方体x轴的旋转;    
            private float rotateY; //用于正方体y轴的旋转;    
            private float rotateZ; //用于正方体z轴的旋转;    
                
            //定义环境光    
            private FloatBuffer lightAmbient = FloatBuffer.wrap(new float[]{0.5f, 0.5f, 0.5f, 1.0f });    
            //定义漫射光    
            private FloatBuffer lightDiffuse = FloatBuffer.wrap(new float[]{1.0f, 1.0f, 1.0f, 1.0f });    
            //定义光源的位置    
            private FloatBuffer lightPosition = FloatBuffer.wrap(new float[]{0.0f, 0.0f, 2.0f, 1.0f });    
            //咳,咳现在开始画图了      
            @Override      
            public void onDrawFrame(GL10 gl) {      
                // TODO Auto-generated method stub      
                //清楚屏幕和深度缓存      
                gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
                //重置当前的观察模型矩阵    
                gl.glLoadIdentity();    
                //开启光源    
                gl.glEnable(GL10.GL_LIGHTING);    
                //现将屏幕向里移动,用来画正方体      
                gl.glTranslatef(0.0f, 0.0f, -6.0f);     
                //设置3个方向的旋转    
                gl.glRotatef(rotateX, 1.0f, 0.0f, 0.0f);    
                gl.glRotatef(rotateY, 0.0f, 1.0f, 0.0f);    
                gl.glRotatef(rotateZ, 0.0f, 0.0f, 1.0f);    
                //通知opnegl将文理名字texture绑定到指定的纹理目标上GL10.GL_TEXTURE_2D    
                gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);    
                   
                gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);     
                //纹理的使用与开启颜色渲染一样,需要开启纹理功能    
                gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);    
                    
                //设置正方体 各顶点    
                gl.glVertexPointer(3, GL10.GL_FIXED, 0, quarterBuffer);    
                gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texCoordsBuffer);    
                    
                //绘制    
                gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 24,  GL10.GL_UNSIGNED_BYTE, indicesBuffer);    
                gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);    
                gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);    
                    
                rotateX += 0.5f;    
                rotateY += 0.6f;     
                rotateZ += 0.3f;     
                    
                //混合开关    
                if (key)    
                {    
                    gl.glEnable(GL10.GL_BLEND);     // 打开混合    
                    gl.glDisable(GL10.GL_DEPTH_TEST);   // 关闭深度测试    
                }    
                else     
                {    
                    gl.glDisable(GL10.GL_BLEND);        // 关闭混合    
                    gl.glEnable(GL10.GL_DEPTH_TEST);    // 打开深度测试    
                }    
            }      
          
            //当窗口改变时,调用,至少在创建窗口时调用一次,这边设置下场景大小      
            @Override      
            public void onSurfaceChanged(GL10 gl, int width, int height) {      
                // TODO Auto-generated method stub      
                //设置OpenGL场景大小      
                float ratio = (float) width / height;      
                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) {      
                // TODO Auto-generated method stub      
                //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值      
                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_FASTEST);      
                //允许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);    
                    
                Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.test);    
                //生成纹理    
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 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);    
                    
                //设置光线,,1.0f为全光线,a=50%    
                gl.glColor4f(1.0f,1.0f,1.0f,0.5f);      
                // 基于源象素alpha通道值的半透明混合函数    
                gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE);      
                    
                //设置环境光    
                gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, lightAmbient);    
                //设置漫射光    
                gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, lightDiffuse);    
                //设置光源的位置    
                gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, lightPosition);    
                //开启ID号为GL_LIGHT1的光源    
                gl.glEnable(GL10.GL_LIGHT1);    
            }      
                  
        }      
              
        public static class BufferUtil {      
            public static IntBuffer intBuffer;    
            public static FloatBuffer floatBuffer;    
          
            public static IntBuffer iBuffer(int[] a) {      
                // 先初始化buffer,数组的长度*4,因为一个float占4个字节      
                ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);      
                // 数组排列用nativeOrder      
                mbb.order(ByteOrder.nativeOrder());      
                intBuffer = mbb.asIntBuffer();      
                intBuffer.put(a);      
                intBuffer.position(0);      
                return intBuffer;      
            }      
                
            public static FloatBuffer fBuffer(float[] a) {      
                // 先初始化buffer,数组的长度*4,因为一个float占4个字节      
                ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);      
                // 数组排列用nativeOrder      
                mbb.order(ByteOrder.nativeOrder());      
                floatBuffer = mbb.asFloatBuffer();      
                floatBuffer.put(a);      
                floatBuffer.position(0);      
                return floatBuffer;      
            }    
        }    
            
        @Override    
        public boolean onTouchEvent(MotionEvent event) {    
            // TODO Auto-generated method stub    
            if (event.getAction() == MotionEvent.ACTION_DOWN){    
                key = !key;    
            }    
            return super.onTouchEvent(event);    
        }    
    }   



分享到:
评论

相关推荐

    Android OpenGL ES 绘制三维/空间坐标系透明

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建高性能的2D和3D图形。在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程...

    在Android中的jni里使用OpenGL ES和OpenCV渲染一幅图片

    在Android平台上,JNI(Java Native Interface)允许开发者使用C++代码来增强应用程序的功能,尤其是在处理图形和计算密集型任务时,如使用OpenGL ES和OpenCV。这个特定的项目旨在通过JNI调用来结合这两个强大的库...

    android opengl es 经典实例

    5. **状态管理**:在OpenGL ES中,需要对各种状态进行管理,例如深度测试、混合模式、视口设置等。这些状态会影响到渲染的结果,必须正确配置才能确保人物正确地在场景中行走。 6. **性能优化**:由于Android设备的...

    Android Studio中利用OPenGL ES绘制一个三棱锥,并对三棱锥进行纹理贴图

    在Android开发中,OpenGL ES(OpenGL for Embedded Systems)是一个广泛使用的图形库,用于在移动设备上绘制复杂的2D和3D图形。本教程将详细讲解如何在Android Studio中利用OpenGL ES绘制一个三棱锥,并对其表面进行...

    android opengl es 飘动的国旗

    将国旗图片在OpenGL中绘制出来,再实现飘动效果,最后增加半透明效果。 实现步骤 1. 首先确定使用分割法将整张图片分割成若干份,画在一个网格组成的长方形中 2. 画出N*N格的方格 3. 将国旗图案贴到这个网格中 a) ...

    Android OpenGLES

    **Android OpenGLES详解** OpenGLES,全称为OpenGL for Embedded Systems,是针对嵌入式设备,特别是移动设备(如Android智能手机和平板电脑)而设计的一种图形处理接口。它是OpenGL标准的一个子集,专为资源有限但...

    opengles3.0示例(win,Linux,android,ios)

    此压缩包文件“opengles3.0示例(win,Linux,android,ios)”包含了适用于Windows、Linux、Android以及iOS平台的OpenGL ES 3.0实例代码,这将帮助开发者深入理解和应用这一标准。 OpenGL ES 3.0相对于前一版本2.0...

    Android OpenGL入门教程

    - **深入理解OpenGL ES**:学习OpenGL ES的具体函数和特性,如纹理映射、光照、混合模式等。 - **Shader编程**:掌握着色器语言(GLSL),用于控制OpenGL的渲染效果,包括顶点着色器和片段着色器。 - **3D数学基础**...

    Pro OpenGL ES for Android

    ### Pro OpenGL ES for Android #### 关键知识点概览 1. **OpenGL ES简介与发展历程** - OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的一个版本,专为移动设备如智能手机和平板电脑设计。 ...

    Android openGL-GLSL_中文推荐.pdf

    OpenGL ES 是 Android 平台上用于渲染2D和3D图形的API,而GLSL(OpenGL Shading Language)是一种专门用于编写OpenGL着色器的高级编程语言。GLSL用于定义和控制图形流水线的不同阶段,从而实现更精细的图形效果。 ...

    opengles20进阶学习多个例子代码

    OpenGL ES 2.0(简称OpenGL ES或OpenGLES)是一种跨语言、跨平台的应用程序编程接口(API),主要用于在嵌入式系统上绘制2D和3D图形,如智能手机和平板电脑。它是OpenGL标准的一个子集,专为移动设备设计,强调效率...

    OpenGL ES基于安卓开发的地月星系(Android源码)

    OpenGL ES是OpenGL标准的一个子集,专为嵌入式设备如智能手机、平板电脑设计,用于在这些设备上进行2D和3D图形渲染。在安卓系统中,OpenGL ES被广泛应用于游戏开发、图像处理和复杂视觉效果的创建。本项目"地月星系...

    50多种的图片处理效果_运用OpenGL ES.zip

    在Android系统中,OpenGL ES被广泛用于游戏开发、图像处理和实时渲染等领域。 在“50多种的图片处理效果_运用OpenGL ES.zip”这个压缩包中,包含了使用OpenGL ES Shader进行图像处理的各种示例。Shader是OpenGL ES...

    OpenGlPlayNV21.rar

    1. **OpenGL ES基础知识**:包括顶点坐标、着色器语言GLSL、纹理映射、帧缓冲对象(Frame Buffer Objects, FBOs)、混合模式等基本概念和操作。 2. **NV21到RGB转换**:涉及到色彩空间转换的算法,如如何从NV21数据...

    学习 opengl es必备.zip

    在实践中,你可能还需要了解如何在Android或iOS平台上设置和使用OpenGL ES环境,以及如何调试和优化代码。 总之,OpenGL ES 3.0的学习是一次深入图形编程的旅程,虽然有一定难度,但掌握了它,你将能够创造出令人...

    OpenGL ES 2.0 散射光demo

    在Android平台上,OpenGL ES 2.0是绘制2D和3D图形的标准。"散射光Demo"是一个利用OpenGL ES 2.0展示散射光效果的实例,它可以帮助开发者理解如何在移动设备上创建逼真的光照效果。 散射光是一种复杂的光照模型,...

    opengl es 3.0 源码

    这个源码包是针对OpenGL ES 3.0的一本书籍的配套代码,包含了多个章节的示例程序,这些程序可以在多种操作系统上运行,包括Ubuntu、iOS、Android和Windows。 OpenGL ES 3.0相较于前版本(如2.0)有显著的提升和改进...

    AndroidOpenGLDemo-master:OpenGL 3D开发原始程序圆顶

    说明这是一个Android OpenGLES2.0从零开始的Demo程序,仅做个人学习OpenGLES的记录,并提供给后来初学者参考。若有相关问题,也非常乐意与大家一起讨论共同进步。关于Android OpenGLES2.0学习的博客,也相当于这个...

    基于openGL实现的安卓滤镜相机app

    "基于OpenGL实现的安卓滤镜相机App"是一个利用Java和OpenGL ES技术,为Android平台打造的高级摄影应用。OpenGL ES是OpenGL的一个轻量级版本,专门针对嵌入式系统,如智能手机和平板电脑,提供了强大的2D和3D图形渲染...

    OpenGL实现的烟花粒子系统(VC)

    至于在Android平台上实现的版本,可能涉及到OpenGL ES,这是OpenGL的一个轻量级分支,专为嵌入式设备(如智能手机和平板电脑)设计。开发者需要理解Android的SurfaceView和GLSurfaceView,以及如何在Android环境下...

Global site tag (gtag.js) - Google Analytics