Android Opengles 学习一

     最近项目中用到了libgdx   于是便抽空看了下opengles,关于安卓的资料也不多,不过opengles 各个平台的代码页都差不多,IOS的资料还是比较丰富的 ,网上找到最多的就是一个三角形旋转。

     推荐一些学习opengl先要学的东西吧,  维基百科上很清楚 

矩阵  这个非常重要  基本  opengl里面很多效果实现 都靠矩阵变化

opengl中的坐标   不同于 android 本身的坐标系     物体坐标  世界坐标   

屏幕坐标映射到  世界坐标     涉及到一些算法     射线拾取 ,包围算法 等。。。

。。

     先贴代码了

public class OpenglLess1Activity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
        GLSurfaceView view = new GLSurfaceView(this);
        view.setRenderer(new OpenglLess1Render());
        setContentView(view);
	}
}


import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;

public class OpenglLess1Render implements Renderer {
	protected float near=1;  
	protected float far=20;
	protected float ratio;
	float[] lines=new float[]{-1f,0f,0f, //顶点坐标
			1.0f,0f,0f,
			0f,1.0f,0f};
	
	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// TODO Auto-generated method stub
		// 对透视进行修正
		gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
		// 启用阴影平滑
		gl.glShadeModel(GL10.GL_SMOOTH);

		gl.glClearColor(0, 0, 0, 0);
		// 设置深度缓存
		gl.glClearDepthf(1.0f);
		// 启用深度测试
		gl.glEnable(GL10.GL_DEPTH_TEST);
		// 作为深度测试的类型
		gl.glDepthFunc(GL10.GL_LEQUAL);
	}

	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub

		ratio = (float) width / height;

		Log.e("lin","width="+width+" height="+height+" ratio="+ratio);
		// 设置OpenGl场景大小
		gl.glViewport(0, 0, width, height);
		// 设置矩阵投影
		gl.glMatrixMode(GL10.GL_PROJECTION);
		gl.glLoadIdentity();
		// 设置串口的大小   near,far视野的距离   假设眼睛在原点   往Z轴负方向看   超过视野距离则看不见  
		gl.glFrustumf(-ratio, ratio, -1, 1, near, far);
		// 选择模型观察矩阵
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
	}

	@Override
	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub
		//清楚颜色,深度缓存
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		
		//开启模型试图矩阵
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		
		//加载一个基本矩阵 可以理解为重置矩阵,因为每次draw后 会保留原来的矩阵,如果不重置矩阵 ,在translate时 物体就会越离越远
		gl.glLoadIdentity();
		//眼睛设的视野距离为    -1,-20的坐标,则只有在该范围内 的物体才能看到    将物体移动到 z =-3处
		gl.glTranslatef(0, 0, -3f);
		//定义坐标点  数组  Specifies the number of coordinates per vertex. Must be 2, 3, or 4. The initial value is 4.

		gl.glVertexPointer(3, GL10.GL_FLOAT, 0,getFloatBuffer(lines));
		//启用定点数组   跟下面disable 相互对应  
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		
		//设置画笔颜色
		gl.glColor4f(1.0F, 0F,0F,1.0F);
		//绘制三角形
		gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
	}

	
	/**
	 * 分配内存空间    2.2 以前的版本冒失不需要这样实现 
	 * 浮点变量 每个占4字节
	 * @param coords
	 * @return
	 */
	public FloatBuffer getFloatBuffer(float[] coords) {
		ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);
		vbb.order(ByteOrder.nativeOrder());
		FloatBuffer mFVertexBuffer = vbb.asFloatBuffer();
		mFVertexBuffer.put(coords);
		mFVertexBuffer.position(0);
		return mFVertexBuffer;
	}
}


   


   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值