第三课讲了 绘制。这里 理解一下纹理
纹理:可以简单理解成图片数据
还是要同样记住一点 OpenGL 中使用的是 native 方法,所以,纹理也是用 int/long 来表示的
构建一个纹理
// 1、创建一个纹理
int texObjIds[] = new int[1];
GLES20.glGenTextures(1, texObjIds, 0);
if (texObjIds[0] == 0) {
System.out.println("majie 纹理创建失败...");
return 0;
}
// 2、 声明 下面的左右操作,都是针对 这个 纹理 的
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texObjIds[0]);
// 3、 设置纹理 放大 和 缩小采用的 过滤方式
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
//设置环绕方式
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
// 4、加载bitmap到纹理中
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// 5、因为 采用 了 GL_LINEAR_MIPMAP_LINEAR 的缩小方式,这种方式需要使用 MIP 贴图,
// 所以我们需要针对 当前的纹理,让 openGL 自动生成对应的 MIP 贴图
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
// 最后 纹理解绑 ,防止后面的代码也是针对 这个纹理进行操作的
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
1、glBindTexture 说明 将要使用纹理
2、设置纹理的属性,之后 texImage2D 这个方法就是将图片加载到纹理上
3、glBindTexture 纹理用完,在将其设置为 0
同样的也需要 第三课讲解的 着色器的加载。但是纹理的属性是 二维的 "attribute vec2 a_TextureCoordinates;\n 是这样声明定义的
private static final String vertex_shader = "uniform mat4 u_Matrix;\n" + // 横竖屏切换的时候的矩阵变换
"attribute vec4 a_Potision;\n" + // 顶点的位置属性
"attribute vec2 a_TextureCoordinates;\n" + // 顶点的 纹理 属性 的 坐标位置
"varying vec2 v_TextureCoordinates;\n" + // 纹理属性的 渐变 属性 的 坐标位置
"void main() {\n" +
" v_TextureCoordinates = a_TextureCoordinates;\n" + // 纹理属性 赋值给 该顶点的渐变 属性
" gl_Position = u_Matrix * a_Potision;\n" +
"}";
private static final String fragment_shader = "precision mediump float;\n" +
"uniform sampler2D u_textureUnit; \n" + // 实际的纹理数据
"varying vec2 v_TextureCoordinates;\n" + // 渐变属性的坐标位置
"void main() {\n" +
// 着色器 函数, 把 纹理数据 和 坐标 关联
" gl_FragColor=texture2D(u_textureUnit, v_TextureCoordinates);\n" +
"}";
其中片元着色器的 code 中,定义了 sampler2D 的类 和 使用了 texture2D的方法
纹理在 onDrawFrame 方法中 绘制也是使用的不同的
glActiveTexture(GL_TEXTURE0);
// 这个需要在 onDrawFrame 方法中 调用 一下,才可以显示出 图片来
glBindTexture(GL_TEXTURE_2D, textureId);
上面的两个方法就是激活纹理,绑定纹理
GLES20.glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
绘制纹理到那些顶点上
glBindTexture(GL_TEXTURE_2D, 0);// 纹理解除绑定
网友评论