OpenGL学习(一):构造OpenGL ES View

一、在Activity中

package com.example.administrator.createopenglview;

import android.opengl.GLSurfaceView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

/**
 * 构造OpenGL ES View
 * 类似   平常创建项目显示的Hello world 一样
 *
 * 编译运行后 屏幕是一个绿色界面
 */
public class CreateOpenGLActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        GLSurfaceView glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(new OpenGLRenderer());
        setContentView(glSurfaceView);
    }
}

二、在 Renderer中

package com.example.administrator.createopenglview;

import android.opengl.GLSurfaceView;
import android.opengl.GLU;

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

/**
 * Created by Administrator on 2016/9/26.
 * <p>
 * 定义一个统一图形绘制的接口
 */

public class OpenGLRenderer implements GLSurfaceView.Renderer {
    /**
     * 主要用来设置一些绘制时不常变化的参数,例如:背景色,是否打开Z-buffer(去除隐藏面)等
     *
     * @param gl
     * @param config
     */
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //设置背景的颜色
        gl.glClearColor(0f, 1f, 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, GL10.GL_NICEST);
    }

    /**
     * 如果设备支持屏幕的横向和纵向切换,
     * 这个方法将发生在横向<==>纵向互换时,
     * 此时可以重新设置绘制的纵横比率。
     *
     * @param gl
     * @param width
     * @param height
     */
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

        //将当前视图端口设置为新的大小。
        gl.glViewport(0, 0, width, height);
        //选择投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        //重置投影矩阵
        gl.glLoadIdentity();
        /**
         * 建立一个透视投影矩阵
         *
         *  gl :GL10接口
         * fovy :指定领域的视角,在Y轴方向。指定方面定量determin领域在x方向上的看法。
         *        高宽比的比例是x(宽度)y(高度)。
         * zNear :指定观众的距离不远的剪裁平面的(总是正数)。
         * zFar :指定了与观众的距离遥远的剪裁平面的(总是正数)。
         */
        //计算窗口的长宽比
        GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f, 100.0f);
        //选择modelview矩阵
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        //重置投影矩阵
        gl.glLoadIdentity();

    }

    /**
     * 定义实际的绘图操作
     *
     * @param gl
     */
    @Override
    public void onDrawFrame(GL10 gl) {
        //清除屏幕和深度缓冲。
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    }
}

三、显示结果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值