android opengl es从零开始(一)

系统: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);
定义实现特殊的线索,大致可以理解为,设置画面的质量
GL_PERSPECTIVE_CORRECTION_HINT时,是指定颜色和纹理坐标的插值质量.
        GL_FASTEST为使用速度最快的模式.
        GL_NICEST为使用质量最好的模式.
        还有一个GL_DONT_CARE为由驱动设备来决定

7、gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT)
表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位,这个我也不太明白
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) 配合使用。
	glClearColor(0.0, 0.0, 1.0, 1.0);//蓝色
	glClear(GL_COLOR_BUFFER_BIT);
3. 清除颜色缓冲区的作用是,防止缓冲区中原有的颜色信息影响本次绘图( 注意!即使认为可以直接覆盖原值,也是有可能会影响的),
当绘图区域为整个窗口时,就是通常看到的,颜色缓冲区的清除值就是窗口的背景颜色。所以, 这两条清除指令并不是必须的:比如对于静态画面只需要设置一次,
比如不需要背景色/背景色为白色。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值