最近项目中用到了libgdx 于是便抽空看了下opengles,关于安卓的资料也不多,不过opengles 各个平台的代码页都差不多,IOS的资料还是比较丰富的 ,网上找到最多的就是一个三角形旋转。
推荐一些学习opengl先要学的东西吧, 易做图上很清楚
矩阵 这个非常重要 基本 opengl里面很多效果实现 都靠矩阵变化
opengl中的坐标 不同于 android 本身的坐标系 物体坐标 世界坐标
屏幕坐标映射到 世界坐标 涉及到一些算法 射线拾取 ,包围算法 等。。。
。。
先贴代码了
[java]
public class OpenglLess1Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
GLSu易做图ceView view = new GLSu易做图ceView(this);
view.setRenderer(new OpenglLess1Render());
setContentView(view);
}
}
public class OpenglLess1Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
GLSu易做图ceView view = new GLSu易做图ceView(this);
view.setRenderer(new OpenglLess1Render());
setContentView(view);
}
}
[java] view plaincopyprint?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.GLSu易做图ceView.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 onSu易做图ceCreated(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 onSu易做图ceChanged(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 以前的版本冒失不需要这样实现
补充:移动开发 , Android ,