1、添加图片资源
2、Draw.java 新增画矩形方法
/*
* 绘制矩形
*/
public static void drawRect(GL10 gl ,float []pos){
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.arr2ByteBuffer(pos));
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, pos.length/3);
}
3、新建MyTextureRenderer.java
/*
* 纹理
*/
public class MyTextureRenderer extends MyAbstractRenderer {
private Resources res;
public MyTextureRenderer(Resources r){
this.res =r;
}
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
gl.glClearColor(0, 0, 0, 1);
}
protected void drawBefore(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
protected void draw(GL10 gl) {
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//启用纹理
gl.glEnable(GL10.GL_TEXTURE_2D);
int []texId =new int[1]; //存放纹理id
gl.glGenTextures(1,texId,0); //获取纹理1个id
// System.out.println(texId[0]);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texId[0]);//绑定纹理id 纹理为2d
//获取 资源
Bitmap image =BitmapFactory.decodeResource(this.res, R.drawable.my);
//参数 说明
//target 参数用于定义二维纹理;
//level 如果提供了多种分辨率的纹理图像,可以使用level参数,否则level设置为0;
//bitmap 位图
//border 参数表示边框的宽度
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image, 0);//加载纹理
//指定纹理过滤
//由于提供的纹理图像很少能和最终的屏幕坐标形成对应,大小不同,所以需要设置过滤项目.允许我们进行插值或者匀和,指定放大缩小的函数.
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);//最大 线性
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);//最小 线性
//纹理环绕
//在 OpenGl 中是通过指定纹理坐标来将纹理映射到多边形上去的.
//在纹理坐标系中, 左下角是 (0,0), 右上角是 (1,1).
//2D 纹理的坐标中通过指定 (s,t) (s为x轴上,t为y轴上, 取值0~1).
//1D, 3D, 4D纹理坐标系中对应的需要指定 (s), (s,t,r), (s,t, r,q).
//openGL ES 支持 GL10.GL_CLAMP_TO_EDGE(不重复)、GL10.GL_REPEAT
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); //超过 s 则是重复出现
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); //超过 t 则是重复出现
//由于2 超过了1 所以会重复出现图片
float [] coords={
0,0,
2,0,
0,2,
2,2,
};
//指定纹理坐标
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, BufferUtil.arr2ByteBuffer(coords));
float l =0.5f;
//坐标影响 图片展示 方向
float []rectCoords ={
-l ,l ,0,
-l ,-l ,0,
l ,l ,0,
l ,-l ,0,
};
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
Draw.drawRect(gl, rectCoords);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_TEXTURE_2D);
//创建一个纹理对象后, OpenGL为其分配内存, 所以当不再使用一个纹理对象时, 为防止内存泄露, 必须删除.
gl.glDeleteTextures(1, texId,0);
}
}
4、修改MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MySurfaceView view=new MySurfaceView(this);
renderer=new MyTextureRenderer(this.getResources());
view.setRenderer(renderer);
setContentView(view);
}
5、运行效果