Android OpenGL ES 2.0之纹理映射学习总结

今天主要学习了纹理映射的基本原理、两种不同的拉伸方式、两种不同的采样方式、MinMap纹理、多重纹理与过程纹理等。

基本原理:

首先理解几个基本概念:纹理图、纹理坐标、映射、片元

纹理图就是Bitmap等图像,纹理坐标是以Bitmap图像左上角为原点,横轴为T,纵轴为S,范围均为(0,1)

纹理映射的基本思想就是首先为图元中的每个顶点指定恰当的纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中纹理区域中的内容根据纹理坐标映射到指定的图元上。

//生成纹理ID
int[] textures = new int[1];
GLES20.glGenTextures
(
1,          //产生的纹理id的数量
textures,   //纹理id的数组
0           //偏移量
);    
textureId=textures[0];    
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
        
     
        //通过输入流加载图片===============begin===================
        InputStream is = this.getResources().openRawResource(R.drawable.wall);
        Bitmap bitmapTmp;
        try 
        {
        bitmapTmp = BitmapFactory.decodeStream(is);
        } 
        finally 
        {
            try 
            {
                is.close();
            } 
            catch(IOException e) 
            {
                e.printStackTrace();
            }
        }
        //通过输入流加载图片===============end=====================  
        
        //实际加载纹理
        GLUtils.texImage2D
        (
        GLES20.GL_TEXTURE_2D,   //纹理类型,在OpenGL ES中必须为GL10.GL_TEXTURE_2D
        0,  //纹理的层次,0表示基本图像层,可以理解为直接贴图
        bitmapTmp,  //纹理图像
        0  //纹理边框尺寸
        );
        bitmapTmp.recycle();  //纹理加载成功后释放图片


两种纹理拉伸方式

重复拉伸方式 整块纹理被重复填充

截取拉伸方式 边缘像素被重复填充

纹理采样方式

最近点采样

线性纹理采样

当纹理图中的一个像素对应到待映射图元上的多个片元时,采用MAG采样;反之则采用MIN采样。

所以实际开发中一般情况下往往采用MIN情况设置为最近点采样,将MAG情况设置为线性采样的组合。

mipmap纹理技术

基本思想:对远处的地形采用尺寸较小分辨率低的纹理,近处的采用尺寸较大分辨率高的纹理。

GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

多重纹理与过程纹理

对同一个图元采用多幅纹理图,这种技术称之为多重纹理。

在多重纹理变化的边界根据某种规则进行平滑过渡,这种技术称之为过程纹理。

详细了解这样一个函数

void glTexParameteri( GLenum target,
  GLenum pname,
  GLint param);

target

Specifies the target texture, which must be either GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_2D_ARRAY, or GL_TEXTURE_CUBE_MAP.
pname
Specifies the symbolic name of a single-valued texture parameter. pname can be one of the following: GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_SWIZZLE_R, GL_TEXTURE_SWIZZLE_G, GL_TEXTURE_SWIZZLE_B, GL_TEXTURE_SWIZZLE_A, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, or GL_TEXTURE_WRAP_R.
param
Specifies the value of pname
.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值