系统:windows
工具:android studio
1、新建一个项目
2、新建Reader类,代码为:
public class MReader implements GLSurfaceView.Renderer { //在这个方法中主要用来设置一些绘制时不常变化的参数,比如:背景色,是否打开 z-buffer等。 @Override public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) { gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f); gl.glShadeModel(GL10.GL_SMOOTH); gl.glClearDepthf(1.0f); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs. GL10.GL_NICEST); } //如果设备支持屏幕横向和纵向切换,这个方法将发生在横向<->纵向互换时。此时可以重新设置绘制的纵横比率 @Override public void onSurfaceChanged(GL10 gl, int width, int height) { } //定义实际的绘图操作 @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs. GL10.GL_DEPTH_BUFFER_BIT); } }
3、修改MainActivity中的代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); // (NEW) getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // (NEW) GLSurfaceView view = new GLSurfaceView(this); view.setRenderer(new MReader()); setContentView(view); } }
MainActivity中的代码好理解,那么开始研究MReader中的代码
MReader实现接口GLSurfaceView.Renderer
有三个方法
1、onSurfaceCreated(GL10 gl, EGLConfig eglConfig)
在这个方法中主要用来设置一些绘制时不常变化的参数,比如:背景色,是否打开 z-buffer等。
2、onSurfaceChanged(GL10 gl, int width, int height)
如果设备支持屏幕横向和纵向切换,这个方法将发生在横向<->纵向互换时。此时可以重新设置绘制的纵横比率3、onDrawFrame(GL10 gl)定义实际的绘图操作
如果用过SurfaceView的话,这三个方法不难理解
然后再看看这里面用到的方法
1、gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f);
这个方法参数为RGBA颜色,好理解,作用是清楚缓存区颜色,第一次学习opengl,我也不是很清楚
2、gl.glShadeModel(GL10.GL_SMOOTH)
这个方法好理解,作用是指明使用哪种着色技术,可以取值GL_FLAT和GL_SMOOTH。默认取值是GL_SMOOTH如果两点的颜色相同,使用两个参数效果相同 如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点3、gl.glClearDepthf(1.0f)
指定深度缓冲区的清除值,这个我也不太理解,以后如果理解了,再回来贴上4、glEnable(GL10.GL_DEPTH_TEST)这个方法参数很多,功能也不相同,GL_DEPTH_TEST表示启用深度测试。根据坐标的远近自动隐藏被遮住的图形(材料)
glEnable不能写在glBegin和glEnd两个函数中间。5、glDepthFunc(GL10.GL_LEQUAL)
定义用于深度缓冲区对照的数据,还是不理解6、gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);定义实现特殊的线索,大致可以理解为,设置画面的质量7、gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT)GL_PERSPECTIVE_CORRECTION_HINT时,是指定颜色和纹理坐标的插值质量. GL_FASTEST为使用速度最快的模式. GL_NICEST为使用质量最好的模式. 还有一个GL_DONT_CARE为由驱动设备来决定
表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位,这个我也不太明白GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲 GL_DEPTH_BUFFER_BIT: 深度缓冲 GL_ACCUM_BUFFER_BIT: 累积缓冲 GL_STENCIL_BUFFER_BIT: 模板缓冲贴上知乎上搜的对于glClear和glColearColor的理解1. 必须强调 glClearColor 只起到Set的作用,并不Clear任何!不要混淆~ 2. glClearColor 的作用是,指定刷新颜色缓冲区时所用的颜色。 所以,完成一个刷新过程是要 glClearColor(COLOR) 与 glClear(GL_COLOR_BUFFER_BIT) 配合使用。3. 清除颜色缓冲区的作用是,防止缓冲区中原有的颜色信息影响本次绘图( 注意!即使认为可以直接覆盖原值,也是有可能会影响的),glClearColor(0.0, 0.0, 1.0, 1.0);//蓝色 glClear(GL_COLOR_BUFFER_BIT);
当绘图区域为整个窗口时,就是通常看到的,颜色缓冲区的清除值就是窗口的背景颜色。所以, 这两条清除指令并不是必须的:比如对于静态画面只需要设置一次,比如不需要背景色/背景色为白色。