OpenGL ES TEXTURE_2D

1、添加图片资源

OpenGL ES TEXTURE_2D_第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、运行效果

OpenGL ES TEXTURE_2D_第2张图片

你可能感兴趣的:(OpenGL,ES)