Android OpenGL 教程

第六课

纹理映射:

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

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

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

package com.xinli; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class DataManage { private static Bitmap mBitmap; public static void init(Resources res){ mBitmap = BitmapFactory.decodeResource(res, R.drawable.nehe); } public static Bitmap getBitmap(){ return mBitmap; } }

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

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里面添加的代码如下

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //设置使用纹理数组 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mQuadsBuffer); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextCoordBuffer); //把纹理数组指定到纹理buffer

更多相关文章

  1. android坐标图解
  2. Android 的坐标系及矩阵变换
  3. Android进阶之光读书笔记:View体系(一) View与 ViewGroup、View坐标
  4. 获取组件坐标系
  5. android纹理
  6. Android 高德地图给指定坐标显示图片,以及聚合显示
  7. Android中ArrayList动态数组用法
  8. 【Java】java和android网络编程 - 对byte数组压缩和解压缩(zip,g

随机推荐

  1. Android(安卓)KK上对ALC5616调试笔记——
  2. 如何在Android设备上识别读取美国驾照信
  3. Android笔记——如何将软键盘的回车键改
  4. Android使用DataBinding实现MVVM模式(基本
  5. android相机Camera.Parameters所有的参数
  6. Android(安卓)Monkey压力测试环境搭建及
  7. Invoke-customs are only supported star
  8. Android中的OpenGL ES使用基础
  9. 二维码识别IOS或Android客户端
  10. 调用高德地图、百度地图客户端