- 浏览: 64218 次
-
文章分类
最新评论
Android OpenGL | ES开启混合色
这一节看看混合色的开启,主要是实现立方体半透明的效果,但是今天这篇文章因为内容比较少,所以就增加了点触事件,当触及屏幕的时候,开启半透明效果,再次点击就关闭混合效果,效果图如下:
开启透明混色前
开启半透明混色后
接着上一节的Android高级进阶九 Android OpenGL对立方体进行光照处理代码,我们接着整改,看代码:
Java代码
- //设置光线,,1.0f为全光线,a=50%
- gl.glColor4f(1.0f,1.0f,1.0f,0.5f);
- //基于源象素alpha通道值的半透明混合函数
- gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE);
只需增加上述方法即可开启,现在我们通过点触事件来控制其开启:
Java代码
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- //TODOAuto-generatedmethodstub
- if(event.getAction()==MotionEvent.ACTION_DOWN){
- key=!key;
- }
- returnsuper.onTouchEvent(event);
- }
完整代码如下:
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); } }
相关推荐
OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建高性能的2D和3D图形。在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程...
在Android平台上,JNI(Java Native Interface)允许开发者使用C++代码来增强应用程序的功能,尤其是在处理图形和计算密集型任务时,如使用OpenGL ES和OpenCV。这个特定的项目旨在通过JNI调用来结合这两个强大的库...
5. **状态管理**:在OpenGL ES中,需要对各种状态进行管理,例如深度测试、混合模式、视口设置等。这些状态会影响到渲染的结果,必须正确配置才能确保人物正确地在场景中行走。 6. **性能优化**:由于Android设备的...
在Android开发中,OpenGL ES(OpenGL for Embedded Systems)是一个广泛使用的图形库,用于在移动设备上绘制复杂的2D和3D图形。本教程将详细讲解如何在Android Studio中利用OpenGL ES绘制一个三棱锥,并对其表面进行...
将国旗图片在OpenGL中绘制出来,再实现飘动效果,最后增加半透明效果。 实现步骤 1. 首先确定使用分割法将整张图片分割成若干份,画在一个网格组成的长方形中 2. 画出N*N格的方格 3. 将国旗图案贴到这个网格中 a) ...
**Android OpenGLES详解** OpenGLES,全称为OpenGL for Embedded Systems,是针对嵌入式设备,特别是移动设备(如Android智能手机和平板电脑)而设计的一种图形处理接口。它是OpenGL标准的一个子集,专为资源有限但...
此压缩包文件“opengles3.0示例(win,Linux,android,ios)”包含了适用于Windows、Linux、Android以及iOS平台的OpenGL ES 3.0实例代码,这将帮助开发者深入理解和应用这一标准。 OpenGL ES 3.0相对于前一版本2.0...
- **深入理解OpenGL ES**:学习OpenGL ES的具体函数和特性,如纹理映射、光照、混合模式等。 - **Shader编程**:掌握着色器语言(GLSL),用于控制OpenGL的渲染效果,包括顶点着色器和片段着色器。 - **3D数学基础**...
### Pro OpenGL ES for Android #### 关键知识点概览 1. **OpenGL ES简介与发展历程** - OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的一个版本,专为移动设备如智能手机和平板电脑设计。 ...
OpenGL ES 是 Android 平台上用于渲染2D和3D图形的API,而GLSL(OpenGL Shading Language)是一种专门用于编写OpenGL着色器的高级编程语言。GLSL用于定义和控制图形流水线的不同阶段,从而实现更精细的图形效果。 ...
OpenGL ES 2.0(简称OpenGL ES或OpenGLES)是一种跨语言、跨平台的应用程序编程接口(API),主要用于在嵌入式系统上绘制2D和3D图形,如智能手机和平板电脑。它是OpenGL标准的一个子集,专为移动设备设计,强调效率...
OpenGL ES是OpenGL标准的一个子集,专为嵌入式设备如智能手机、平板电脑设计,用于在这些设备上进行2D和3D图形渲染。在安卓系统中,OpenGL ES被广泛应用于游戏开发、图像处理和复杂视觉效果的创建。本项目"地月星系...
在Android系统中,OpenGL ES被广泛用于游戏开发、图像处理和实时渲染等领域。 在“50多种的图片处理效果_运用OpenGL ES.zip”这个压缩包中,包含了使用OpenGL ES Shader进行图像处理的各种示例。Shader是OpenGL ES...
1. **OpenGL ES基础知识**:包括顶点坐标、着色器语言GLSL、纹理映射、帧缓冲对象(Frame Buffer Objects, FBOs)、混合模式等基本概念和操作。 2. **NV21到RGB转换**:涉及到色彩空间转换的算法,如如何从NV21数据...
在实践中,你可能还需要了解如何在Android或iOS平台上设置和使用OpenGL ES环境,以及如何调试和优化代码。 总之,OpenGL ES 3.0的学习是一次深入图形编程的旅程,虽然有一定难度,但掌握了它,你将能够创造出令人...
在Android平台上,OpenGL ES 2.0是绘制2D和3D图形的标准。"散射光Demo"是一个利用OpenGL ES 2.0展示散射光效果的实例,它可以帮助开发者理解如何在移动设备上创建逼真的光照效果。 散射光是一种复杂的光照模型,...
这个源码包是针对OpenGL ES 3.0的一本书籍的配套代码,包含了多个章节的示例程序,这些程序可以在多种操作系统上运行,包括Ubuntu、iOS、Android和Windows。 OpenGL ES 3.0相较于前版本(如2.0)有显著的提升和改进...
说明这是一个Android OpenGLES2.0从零开始的Demo程序,仅做个人学习OpenGLES的记录,并提供给后来初学者参考。若有相关问题,也非常乐意与大家一起讨论共同进步。关于Android OpenGLES2.0学习的博客,也相当于这个...
"基于OpenGL实现的安卓滤镜相机App"是一个利用Java和OpenGL ES技术,为Android平台打造的高级摄影应用。OpenGL ES是OpenGL的一个轻量级版本,专门针对嵌入式系统,如智能手机和平板电脑,提供了强大的2D和3D图形渲染...
至于在Android平台上实现的版本,可能涉及到OpenGL ES,这是OpenGL的一个轻量级分支,专为嵌入式设备(如智能手机和平板电脑)设计。开发者需要理解Android的SurfaceView和GLSurfaceView,以及如何在Android环境下...