看到了
Android
OpenGL开发四棱锥和立方体之后,我们是不是增加了使用OpenGL开发图形的兴趣啊,呵呵,希望大家保持热情啊,今天我们接着给已经画好的立方体进行文理处理,效果图如下:

可以看到,我们对正方体做了如下处理:
具体如何实现,我们接着看~~~
Java代码
- @Override
- publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
- 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);
- gl.glEnable(GL10.GL_TEXTURE_2D);
- IntBufferintBuffer=IntBuffer.allocate(1);
- gl.glGenTextures(1,intBuffer);
- texture=intBuffer.get();
- gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
- Bitmapbmp=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);
- }
在onSurfaceChanged方法中,我们需要做一些处理,主要有如下两个方法:
Java代码
- gl.glGenTextures(1,intBuffer);
这个方法是主要用来创建一个文理,参数1表示数量1,参数intBuffer是文理代号;
Java代码
- gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
- Bitmapbmp=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);
- }
- 接着绑定需要该纹理的target,在onSurfaceChanged方法之后,我们再在onDrawFrame方法中着色和旋转,完全代码如下:
- packageorg.ourunix.android.opengltest;
- importjava.nio.ByteBuffer;
- importjava.nio.ByteOrder;
- importjava.nio.IntBuffer;
- importjavax.microedition.khronos.egl.EGLConfig;
- importjavax.microedition.khronos.opengles.GL10;
- importandroid.app.Activity;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.opengl.GLSurfaceView;
- importandroid.opengl.GLUtils;
- importandroid.opengl.GLSurfaceView.Renderer;
- importandroid.os.Bundle;
- publicclassOpenGLTestActivityextendsActivity{
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- GLSurfaceViewglView=newGLSurfaceView(this);
- glView.setRenderer(newGLRender());
- setContentView(glView);
- }
- publicclassGLRenderimplementsRenderer{
- privateinttexture=-1;
- privateintone=0x10000;
- privateint[]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,};
- privateint[]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,};
- privateIntBufferquarterBuffer=BufferUtil.iBuffer(quarter);
- privateIntBuffertexCoordsBuffer=BufferUtil.iBuffer(texCoords);
- ByteBufferindicesBuffer=ByteBuffer.wrap(newbyte[]{
- 0,1,3,2,
- 4,5,7,6,
- 8,9,11,10,
- 12,13,15,14,
- 16,17,19,18,
- 20,21,23,22,
- });
- privatefloatrotateX;
- privatefloatrotateY;
- privatefloatrotateZ;
- @Override
- publicvoidonDrawFrame(GL10gl){
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
- gl.glLoadIdentity();
- gl.glTranslatef(0.0f,0.0f,-6.0f);
- 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);
- 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;
- }
- @Override
- publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
- floatratio=(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
- publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
- 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);
- gl.glEnable(GL10.GL_TEXTURE_2D);
- IntBufferintBuffer=IntBuffer.allocate(1);
- gl.glGenTextures(1,intBuffer);
- texture=intBuffer.get();
- gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
- Bitmapbmp=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);
- }
- }
- publicstaticclassBufferUtil{
- publicstaticIntBufferintBuffer;
- publicstaticIntBufferiBuffer(int[]a){
- ByteBuffermbb=ByteBuffer.allocateDirect(a.length*4);
- mbb.order(ByteOrder.nativeOrder());
- intBuffer=mbb.asIntBuffer();
- intBuffer.put(a);
- intBuffer.position(0);
- returnintBuffer;
- }
- }
- }
分享到:
相关推荐
本教程将深入探讨如何使用OpenGL ES在Android中实现立方体的多纹理映射以及混色光照效果,这对于游戏开发、虚拟现实应用以及其他需要动态图形的场景至关重要。 首先,我们需要了解纹理映射的概念。纹理映射是将2D...
这个“Android代码-OpenGL3D立方体多纹理贴图源码.zip”文件显然包含了实现3D立方体并应用多纹理贴图的示例代码,对于学习Android平台上的3D图形编程非常有帮助。 1. **OpenGL基础知识**:在OpenGL中,图形是通过...
Android OpenGL ES 提供了一个接口,让开发者能够利用硬件加速的图形处理能力,来绘制出立方体、球体、圆柱等几何形状。在这个场景中,我们看到描述中提到了几个关键的元素:几何形状类和renderer类。 1. **几何...
本项目"Android应用源码OpenGL 3D立方体多纹理贴图"是一个示例,展示了如何在Android平台上利用OpenGL ES(OpenGL针对嵌入式系统的版本)进行3D图形渲染,并实现多纹理贴图。下面我们将深入探讨其中涉及的关键知识点...
在这个名为“Android应用源码OpenGL 3D立方体多纹理贴图”的项目中,开发者将展示如何在Android应用中利用OpenGL ES实现3D立方体,并进行多纹理贴图。 首先,理解OpenGL ES的基本概念至关重要。OpenGL ES提供了一组...
本主题将深入探讨如何在OpenGL ES中实现立方体贴图,这是一种将六个不同图像分别映射到立方体六个面的技术。 立方体贴图是一种特殊的纹理类型,它由六个2D纹理组成,每个2D纹理对应立方体的一个面。这种技术在渲染...
总的来说,这个"android opengl 立方体"项目是一个很好的起点,它涵盖了Android OpenGL ES的基础,包括设置环境、创建几何形状、编写和使用着色器、处理顶点数据、纹理映射等关键概念。对于初学者来说,通过实践这个...
本项目“安卓Android源码——OpenGL 3D立方体多纹理贴图”着重展示了如何在Android应用中利用OpenGL ES创建一个3D立方体,并为其应用多个纹理贴图。 首先,我们需要理解OpenGL ES的基本概念,如顶点、坐标系统、...
通过此项目,您可以学习并掌握在Android平台上使用OpenGL ES进行3D图形渲染的基本技巧,包括着色器编程、纹理映射以及变换矩阵的使用等。 项目特点: 1. **多纹理贴图**:立方体的每个面都可以独立加载和显示不同...
总的来说,"Android OpenGL 立方体旋转"实例是一个基础的3D图形编程教程,涵盖了OpenGL ES的使用、基本的几何体构建、矩阵变换以及动画原理。它为开发者提供了一个理解OpenGL ES工作原理和实践3D图形编程的起点。...
这个“android opengl es三维立方体源码”是一个很好的起点,对于想要学习Android OpenGL ES编程的人来说尤其有用。 首先,我们来理解OpenGL ES的基本概念。OpenGL ES是一个基于图元的图形API,它接受顶点、颜色、...
在本文中,我们将深入探讨如何使用OpenGL ES在Android应用中实现一个贴图旋转的3D立方体。首先,我们需要理解OpenGL ES的基本概念,然后逐步构建这个示例项目。 1. **OpenGL ES基础知识**: OpenGL ES是基于OpenGL...
这个压缩包"Android OpenGL 3D 立方体多纹理贴图源码.zip"提供了一个具体的实例,展示了如何在Android应用中使用OpenGL ES实现3D立方体并进行多纹理贴图。 首先,我们需要理解3D图形的基本概念。一个3D立方体是由六...
本资源“Android OpenGL 3D 立方体多纹理贴图源码”是一个关于如何在Android上使用OpenGL ES实现3D立方体并进行多纹理贴图的示例项目。这个项目可以帮助开发者理解如何利用OpenGL ES进行3D图形编程,以及如何处理...
在OpenGL ES中,我们首先需要定义立方体的顶点坐标和纹理坐标,顶点坐标确定了立方体的形状,而纹理坐标则告诉OpenGL如何将纹理映射到这些顶点上。 1. **顶点数组**:创建立方体需要六个面的顶点信息,每个面通常由...
1. **纹理坐标**:每个顶点都有对应的纹理坐标,这些坐标告诉OpenGL ES如何将纹理映射到几何体表面。通常使用UV坐标系,U和V分别对应纹理的水平和垂直方向。 2. **纹理单元**:OpenGL ES支持同时使用多个纹理,每个...
本篇将详细介绍Android环境下使用OpenGL ES进行3D立方体的多纹理贴图的源码解析。 首先,"安卓Android源码——OpenGL3D立方体多纹理贴图源码.zip"这个压缩包包含了一些关键文件。`1_120820210603_1.png`和`1_...
在这个项目中,立方体的每个面都是由多个三角形组成的,这些三角形通过顶点数据定义,并由OpenGL ES进行渲染。 5. **动画(Animation)**:通过不断更新模型视图矩阵,可以实现物体的动态效果,如旋转、平移和缩放...
这个"安卓Android源码——OpenGL 3D立方体多纹理贴图.rar"文件显然包含了实现3D立方体并应用多纹理贴图的源代码示例。 在3D图形编程中,纹理贴图是将2D图像覆盖到3D模型表面的技术,为物体增加真实感和细节。在...