OpenGl开发第一章-阿里云开发者社区

开发者社区> 非花非雾> 正文

OpenGl开发第一章

简介:
+关注继续查看

            一直很想学习openGl但是一直没有时间,这今天项目做的差不多了,终于有时间能好好看看了。

 OpenGl其实就是通过GlSurfaceView  跟一个渲染器来实现图形的绘制,简单的来说就是渲染器来进行绘制,在GlSurfaceView中的代码是比较少的,除非是你要做一些别的操作,比如图形的旋转。


            第一步,首先要熟悉android Activity 的布局填充,创建一个android项目


          创建一个GlSurfaceView类.我这个是为了实现旋转在里边加上了onTouch事件,不需要旋转的可以注释掉不用管


package com.example.opengl_demo;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;
import android.view.MotionEvent;


public class MySurfaceView extends GLSurfaceView {


private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private MyRander myRander;
private float mPreviousX;
private float mPreviousY;


public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}


public MySurfaceView(Context context) {
super(context);
myRander = new MyRander();
setRenderer(myRander);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
         
float x =event.getX();
float y =event.getY();


switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:

    float dx = x - mPreviousX;  
           float dy = y - mPreviousY;  
 
           // reverse direction of rotation above the mid-line  
           if (y > getHeight() / 2) {  
             dx = dx * -1 ;  
           }  
 
           // reverse direction of rotation to left of the mid-line  
           if (x < getWidth() / 2) {  
             dy = dy * -1 ;  
           }  
           
           myRander.angle += (dx + dy) * TOUCH_SCALE_FACTOR;  
           requestRender(); 

}


mPreviousX = x;  
  mPreviousY = y; 


return true;


}
}




接下来就是  建一个Render渲染类,这就是绘图的主要部分:

                


package com.example.opengl_demo;


import java.nio.FloatBuffer;


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


import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.os.SystemClock;


public class MyRander implements GLSurfaceView.Renderer {


private float[] mTriangleArray = { 0f, 1f, 0f, -1f, -1f, 0f, 1f, -1f, 0f };
private float[] mQuadsArray = {  
          1f,1f,0f,                           //右上  
          -1f,1f,0f,                          //左上  
          -1f,-1f,0f,                         //左下  
          1f,-1f,0f                           //右下  
   };  

private FloatBuffer mQuadsBuffer;  
private FloatBuffer mFloatBuffer;
float angle;


@Override
public void onDrawFrame(GL10 gl) {
// 画
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 使用相机投影模式
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(-1.5f, 0.0f, -6.0f);     //第一个参数是说这个矩阵中心点的位置,第二个 中心点上下的位置,第三个深度的位置
/* // 使用眼点
GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);*/


// 设置旋转
/*
* long time =SystemClock.uptimeMillis()%4000L; float angle
* =0.090f*(int)time;
*/
gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);


// 绘制三角形


gl.glColor4f(1f, 0f, 0f, 1f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFloatBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);


//绘制四边形,
gl.glLoadIdentity();
gl.glTranslatef(1.5f, 0.0f, -6.0f); //向右移动了1.5f的距离以后又绘制的矩形,这样不会跟三角形重叠
gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);   //这个还是设置旋转的
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mQuadsBuffer);   
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);这个是绘制矩形的

}


@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 屏幕大小改变的时候
gl.glViewport(0, 0, width, height);
float radio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-radio, radio, -1, 1, 1, 10);     //这个是为了让画出来的三角形在屏幕中的位置看起来舒服,你可以去掉试试,会布满整个屏幕
}


@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 当被创建的时候


mFloatBuffer = BufferUtil.floatToBuffer(mTriangleArray);
mQuadsBuffer =BufferUtil.floatToBuffer(mQuadsArray);

gl.glShadeModel(GL10.GL_SMOOTH); // 设置阴影平滑
gl.glClearColor(1f, 1f, 1f, 1f); // 设置清除的时候的颜色
gl.glClearDepthf(1.0f); // 深度缓存
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 绘制的时候必须调用这个方法,告诉gl你是使用的顶点绘制,如果没有这句代码你就不要想画出东西来了
}


}



主要代码就是这个样子,实现了绘制,。放置位置的调整,旋转的功能。下次试试画一个立方体,画图片,等等

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
NDK OpenGL ES 3.0 开发(十六):相机预览
相机开发是 OpenGL ES 的重要应用,利用 OpenGL 可以很方便地实现相机美颜、滤镜、塑型以及一些动态特效,其性能显著优于对应功能的 CPU 实现。
156 0
NDK OpenGL ES 3.0 开发(十五):立方体贴图(天空盒)
OpenGL ES 立方体贴图本质上还是纹理映射,是一种 3D 纹理映射。立方体贴图所使的纹理称为立方图纹理,它是由 6 个单独的 2D 纹理组成,每个 2D 纹理是立方图的一个面
50 0
NDK OpenGL ES 3.0 开发(十四):粒子(Particles)
粒子系统本质上是通过一次或者多次渲染绘制出大量位置、形状或者颜色不同的物体(粒子),形成大量粒子运动的视觉效果。所以,粒子系统天然适合用OpenGL ES 实例化(Instancing)实现。
138 0
阿里云本地开发环境搭建
简述阿里云本地开发环境的搭建
3067 0
NDK OpenGL ES 3.0 开发(十二):混合
OpenGL ES 混合本质上是将 2 个片元的颜色进行调和,产生一个新的颜色。OpenGL ES 混合发生在片元通过各项测试之后,准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值,不再是新(源)片元直接覆盖缓冲区中的(目标)片元。
81 0
NDK OpenGL ES 3.0 开发(十三):实例化(Instancing)
OpenGL ES 实例化(Instancing)是一种只调用一次渲染函数就能绘制出很多物体的技术,可以实现将数据一次性发送给 GPU ,告诉 OpenGL ES 使用一个绘制函数,将这些数据绘制成多个物体。
58 0
NDK OpenGL ES 3.0 开发(十一):模板测试
模板测试与深度测试类似,主要作用是利用模板缓冲区(Stencil Buffer)所保存的模板值决定当前片段是否被丢弃,且发生于深度测试之前。
45 0
Java之路第一步——搭建Java开发环境
一个不太成熟的程序员和大家一起学习,共同进步
967 0
+关注
81
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载