Android Opengles 学习一

本文详细介绍了学习OpenGL所需的基础知识,包括矩阵、坐标系统转换、算法如射线拾取和包围算法等。通过提供示例代码,展示了如何在Android环境中使用OpenGL实现一个简单的三角形旋转效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近项目中用到了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;
	}
}


   


   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值