大家好,接下来将为大家介绍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 。