OpenGL ES 3. 纹理基础

大家好,接下来将为大家介绍OpenGL ES 3. 纹理基础。

1、读取文件

将储存的图片文件读取到内存(方法很多)。

InputStream is = this.getResources().openRawResource(path);
Bitmap bitmapTmp;
try {
    bitmapTmp = BitmapFactory.decodeStream(is);
} 
finally {
    try {
        is.close();
    } 
    catch(IOException e) {
        e.printStackTrace();
    }
}

2、载入纹理

将内存图像数据上传到显存。

void GLAPIENTRY glTexImage2D (GLenum target,
                              GLint level,
                              GLint internalformat,
                              GLsizei width,
                              GLsizei height,
                              GLint border,
                              GLenum format,
                              GLenum type,
                              const GLvoid *pixels);

target: 纹理维度 GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D。
level: mip贴图层次,一般设置为0 。
internalformat: 每个纹理单元中存储多少颜色成分。
width、height、depth: 加载纹理的宽度、高度、深度。习惯使用2的整数次方去设置这些参数。
border: 允许为纹理贴图指定一个边界宽度。
format: OpenGL 像素格式。
type: 解释参数pixels指向的数据,告诉OpenGL 使⽤缓存区中的什么数据类型来存储颜⾊分量,像素数据的数据类型。
pixels: 指向图形数据的指针。

另外,也可以使用GLUtils的texImage2D方法。

GLUtils.texImage2D(
    GLES30.GL_TEXTURE_2D, //纹理类型
    0, 					  //纹理的层次,0表示基本图像层,可以理解为直接贴图
    bitmapTmp, 			  //纹理图像
    0					  //纹理边框尺寸
);
bitmapTmp.recycle();      //纹理加载成功后释放内存中的纹理图

3、设置纹理参数

void glTexParameterf (GLenum target, GLenum pname, GLint param);
void glTexParameteri (GLenum target, GLenum pname, GLint param);
void glTexParameterfv (GLenum target, GLenum pname, GLint param);
void glTexParameteriv (GLenum target, GLenum pname, GLint param);

target: 纹理维度 GL_TEXTURE_1D GL_TEXTURE_2D GL_TEXTURE_3D。
pname:指定需要设置哪个纹理参数。
param:指定特定的纹理参数的值。

GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, //设置纹理采样方式
       GLES30.GL_TEXTURE_MIN_FILTER,GLES30.GL_NEAREST); //纹理缩小时,临近采样
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D,
       GLES30.GL_TEXTURE_MAG_FILTER,GLES30.GL_LINEAR); //纹理放大时,线性采样
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, 
       GLES30.GL_TEXTURE_WRAP_S,GLES30.GL_CLAMP_TO_EDGE); //S方向环绕方式
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, 
       GLES30.GL_TEXTURE_WRAP_T,GLES30.GL_CLAMP_TO_EDGE); //T方向环绕方式

4、创建纹理对象

扫描二维码关注公众号,回复: 10492172 查看本文章
void glGenTextures (GLsizei n, GLuint *textures);

指定纹理对象的数量指针(指针指向一个无符号整型数组,由纹理对象标识符填充)。

int[] textures = new int[1];
GLES30.glGenTextures(
    1,          //产生的纹理id的数量
    textures,   //纹理id的数组
    0           //偏移量
);    

5、绑定纹理状态

void glBindTexture (GLenum target, GLuint texture);

target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
texture:需要绑定的纹理对象。

GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureId);//绑定纹理

6、删除纹理对象

void glDeleteTextures (GLsizei n, const GLuint *textures);

7、一个小示例

public void initTexture()//textureId
{
    //生成纹理ID
    int[] textures = new int[1];
    GLES30.glGenTextures(
        1,          //产生的纹理id的数量
        textures,   //纹理id的数组
        0           //偏移量
    );    
    textureId=textures[0];    
    GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureId);//绑定纹理
    GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, //设置纹理采样方式
           GLES30.GL_TEXTURE_MIN_FILTER,GLES30.GL_NEAREST);
    GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D,GLES30.GL_TEXTURE_MAG_FILTER,
           GLES30.GL_LINEAR);
    GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, 
           GLES30.GL_TEXTURE_WRAP_S,GLES30.GL_CLAMP_TO_EDGE);
    GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, 
           GLES30.GL_TEXTURE_WRAP_T,GLES30.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(
        GLES30.GL_TEXTURE_2D, //纹理类型
        0, 					  //纹理的层次,0表示基本图像层,可以理解为直接贴图
        bitmapTmp, 			  //纹理图像
        0					  //纹理边框尺寸
    );
    bitmapTmp.recycle(); 		  //纹理加载成功后释放内存中的纹理图
}

最后,欢迎大家一起交流学习:微信:liaosy666 ; QQ:2209115372 。

发布了29 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010281924/article/details/105321797