Android OpenGL教程-第六课

原创 2011年01月13日 11:43:00

 

Android OpenGL 教程

第六课

纹理映射:

 

在这一课里,我将教会你如何把纹理映射到立方体的六个面。

 

激动的时刻来了,加载图片了。

复习一下android加载图片的知识。放一个pngdrawable里面。添加一个工具类,方便我们使用。

 

 

这样我们是不是可以直接用

Bitmap mBitmap = DataManage.getBitmap();

来获得这个bitmap了,当然需要在activity里面初始化这个DataManage

DataManage.init(this.getResources());

 

好了,开始把bitmap放到opengl里的纹理里面。

IntBuffer intBuffer = IntBuffer.allocate(1);

gl.glGenTextures(1, intBuffer);

首先让opengl准备些纹理,这里我们准备1个。glGenTextures第二个参数要求是IntBuffer,实际上就是一个int数组的变形,allocate几个就有几个纹理。

 

texture = intBuffer.get();

取得opengl准备的纹理,为了后面把图片绑定到这个纹理里面

 

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);

开始绑定这个2D纹理

Bitmap mBitmap = DataManage.getBitmap();

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap, 0);

这一句才重要,此纹理是一个2D纹理 ( GL_TEXTURE_2D )。参数二代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。参数四是边框的值,一般就是“0”。据说openggl_es不支持纹理边界,所以必须设置为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);

 

下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )OpenGL采用的滤波方式。通常这两种情况下我都采用 GL_LINEAR 。这使得纹理从很远处到离屏幕很近时都平滑显示。使用 GL_LINEAR 需要CPU和显卡做更多的运算。如果您的机器很慢,您也许应该采用 GL_NEAREST 。过滤的纹理在放大的时候,看起来马赛克的很。您也可以结合这两种滤波方式。在近处时使用 GL_LINEAR ,远处时 GL_NEAREST

 

 

有了纹理咋样弄的立方体上去呢,这里要用到纹理坐标:

先看纹理坐标数组

    private float[] mTextCoordArray={

           1.0f,0.0f,0.0f,0.0f,

0.0f,1.0f,1.0f,1.0f,

           0.0f,0.0f,0.0f,1.0f,

1.0f,1.0f,1.0f,0.0f,

           1.0f,1.0f,1.0f,0f,

0f,0f,0f,1.0f,

           0,1.0f,1.0f,1.0f,

1.0f,0f,0f,0f,

0f,0f,0f,1.0f,
1.0f,1.0f,1.0f,0f,

           1.0f,0f,0f,0f,

0f,1.0f,1.0f,1.0f

    };

   

    private FloatBuffer mTextCoordBuffer;

纹理的坐标就是用了把纹理贴到面上的坐标的对应关系

纹理的坐标是

左下角 00

左上角 0,1

右下角 1,0

右上角 1,1

 

这里面弄了12个面,表示六变形的12个面都画纹理。

 

OnDrawFrame里面添加的代码如下

 

 

相关文章推荐

游戏开发Camera之Cinematic Camera-深度

人的视觉系统是二维的,它通过生理和心理的暗示来感知图像的深度,在现实世界中视觉系统会自动用深度线索depth cue来确定对象之间的距离 游戏画面也是二维的,用x,y轴来定义,画面深度用z轴来定义,...
  • wolf96
  • wolf96
  • 2015年10月31日 14:03
  • 1645

基于OpenGL ES的GLfixed类型使用

OpenGL ES中引入了GLfixed类型。这个类型一般被定义为int,32位。高16位表示整数部分,低16位表示小数部分。由于其整数部分和小数部分所占用的比特数固定,所以也被称为定点类型——fix...

【OpenGL】nehe教程第六课学习笔记

nehe的第六课的内容是给六面的盒子贴上材质texture,流程主要分两步,一,利用glaux库的函数auxDIBImageLoad将图片从硬盘读到内存,再利用OpenGL的函数检测图片,给它打上"可...
  • lzh1590
  • lzh1590
  • 2017年03月26日 19:33
  • 199

OpenGL教程翻译 第六课 平移变换

OpenGL教程翻译 第六课 平移变换 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background            ...
  • Vcube
  • Vcube
  • 2015年07月26日 21:21
  • 734

用OpenSceneGraph实现的NeHe OpenGL教程 - 第六课

简介 本节课要实现的内容是为立方体的六个面添加纹理 纹理映射(Texture Mapping)是OpenGL程序开发中的一个重要概念。纹理是一个数组的概念,其中每一个数据(RGB颜色以及Alpha值...

用OpenInventor实现的NeHe OpenGL教程-第六课

用OpenInventor实现的NeHe OpenGL教程-第六课             这节课将讨论如何在OpenInventor中使用纹理。我们将会加载一个纹理文件,然后...

NeHe OpenGL教程 第六课 纹理映射

学习如何使用纹理映射有很多的好处。比如说,你想绘制一颗导弹从屏幕上飞过。这节课之前,你可能想通过使用多边形来组成导弹,再加上一些颜色。通过使用纹理映射,你可以使用一张导弹的图片来绘制导弹,然后让这张图...
  • ygc87
  • ygc87
  • 2011年09月20日 01:49
  • 2429

OpenGL入门学习——第六课

今天要讲的是动画制作——可能是各位都很喜欢的。除了讲授知识外,我们还会让昨天那个“太阳、地球和月亮”天体图画动起来。缓和一下枯燥的气氛。 本次课程,我们将进入激动人心的计算机动画世界。 想必大...

NeHe OpenGL第六课:纹理映射

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://yarin.blog.51cto.com/1130898/380337NeHe O...
  • GEOLO
  • GEOLO
  • 2011年07月14日 15:44
  • 706

Android第六课

  • 2011年06月23日 09:55
  • 4.16MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android OpenGL教程-第六课
举报原因:
原因补充:

(最多只允许输入30个字)