`
abc20899
  • 浏览: 929116 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android OpenGL es lession1

 
阅读更多
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class Lesson extends Activity {
    private OpenGLView mOpenGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //设置全屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
             WindowManager.LayoutParams.FLAG_FULLSCREEN);


        mOpenGLView = new OpenGLView(this);
        setContentView(mOpenGLView);
    }
}


我们在这里用了一个OpenGLView类,把这个类直接设为contentView。
import android.content.Context;
import android.opengl.GLSurfaceView;

public class OpenGLView extends GLSurfaceView {
    private OpenGLRenderer mRenderer;

    public OpenGLView(Context context) {
       super(context);
       mRenderer = new OpenGLRenderer();
       setRenderer(mRenderer);
    }
}

OpenGLView类继承自GLSurfaceView,这个类是android提供的用opengl画图的类。这里用了OpenGLRenderer类,Render是渲染的意思,真正画图的操作在这个类里面。
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;

public class OpenGLRenderer implements Renderer {
    @Override
    public void onDrawFrame(GL10 gl) {
       gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
       gl.glLoadIdentity();
    }
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
       // 设置输出屏幕大小
       gl.glViewport(0, 0, width, height);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

       gl.glShadeModel(GL10.GL_SMOOTH);
       gl.glClearColor(0f, 0f, 0f, 0f);
       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);
    }
}

这个类实现了GLSurfaceView.Renderer接口,实现这个接口,需要实现3个方法:OnSurfaceCreated(),OnSurfaceChanged(),OnDrawFrame()。第一个方法在Surface创建的时候调用,我们一般在这里做一个初始化openggl的操作,第二个方法在Surface发生改变的时候调用,例如从竖屏切换到横屏的时候;第三个方法是画图方法,类似于View类的OnDraw(),一般所有的画图操作都在这里实现。

注:现在我们大多是在JAVA层操作,后来学习深入后,这里画图的一些操作大多需要很多的计算,我们可以用NDK在C++层进行。

我们看OnSurfaceCreate里面的代码,这里都是在做对OpengGL的初始化。



gl.glShadeModel(GL10.GL_SMOOTH);
启用smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑,在以后的课程中会看到他的效果。

gl.glClearColor(0f, 0f, 0f, 0f);
设置清除屏幕时所用的颜色。如果您对色彩的工作原理不清楚的话,我快速解释一下。色彩值的范围从0.0f到1.0f。0.0f代表最黑的情况,1.0f就是最亮的情况。glClearColor 后的第一个参数是Red Intensity(红色分量),第二个是绿色,第三个是蓝色。最大值也是1.0f,代表特定颜色分量的最亮情况。最后一个参数是Alpha值。当它用来清除屏幕的时候,我们不用关心第四个数字。现在让它为0.0f。我会用另一个教程来解释这个参数。

通过混合三种原色(红、绿、蓝),您可以得到不同的色彩。希望您在学校里学过这些。因此,当您使用glClearColor(0.0f,0.0f,1.0f,0.0f),您将用亮蓝色来清除屏幕。如果您用 glClearColor(0.5f,0.0f,0.0f,0.0f)的话,您将使用中红色来清除屏幕。不是最亮(1.0f),也不是最暗 (0.0f)。要得到白色背景,您应该将所有的颜色设成最亮(1.0f)。要黑色背景的话,您该将所有的颜色设为最暗(0.0f)。我们在这里设置屏幕为黑色。

gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
这三行是关于depth buffer(深度缓存)的。将深度缓存设想为屏幕后面的层。深度缓存不断的对物体进入屏幕内部有多深进行跟踪。我们本节的程序其实没有真正使用深度缓存,但几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画。这样您就不会将一个圆形后面的正方形画到圆形上来。深度缓存是OpenGL十分重要的部分。

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
这里告诉OpenGL我们希望进行最好的透视修正。这会十分轻微的影响性能。但使得透视图看起来好一点。

在OnDrawFrame
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
清除屏幕和深度缓存。

gl.glLoadIdentity();
重置当前的模型观察矩阵。




1. 我们来改变背景的颜色

将gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);从SurfaceCreate放到OnDrawFrame里面,这里设置为红色了,运行下看看,是不是背景成红色了。

2. 加上点击屏幕来改变背景的颜色
第一步,在render里面加3个float
private float cr,cg,cb;
第二步,加个设置r,g,b的函数
public void setColor(float r,float g,float b){
       cr = r;
       cg = g;
       cb = b;
}

第三步在glclearColor里面用cr,cg,cb来设置颜色。
gl.glClearColor(cr, cg, cb, 0.0f);

第四步,在view里面override onTouchEvent函数,在这里响应点击屏幕的事件。
    @Override
    public boolean onTouchEvent(final MotionEvent event) {
       queueEvent(new Runnable(){
           @Override
           public void run() {
              mRenderer.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f);
           }
       });
      return super.onTouchEvent(event);
}
至于这里为什么用final,大家去网上查查,刚好也复习一下内部类调用参数,需要final这个知识点。
分享到:
评论

相关推荐

    Android教程视频 +源代码 9G

    Android面试.exe lession1_view.exe lession2_布局.exe lession2_线性布局.exe lession2_雨滴.exe lession3_按钮.exe lession3_图片.exe lession3_图片2.exe ...... lession15_手机端离线聊天.exe lession15_手机端...

    c++教学视频lession1

    "C++教学视频Lession1"旨在为初学者提供一个深入理解和掌握C++基础知识的平台。本教学视频系列从基础出发,通过直观且详细的讲解,帮助学习者构建扎实的C++编程基础。 在“Lession1”中,你将首先了解C++的历史背景...

    y_android_lession1:y_android_lession1

    小费计算器应用演示 这是小费计算器的第二个安卓应用程序。 花费时间:总共花费4小时 完成的用户故事: 用户显示指定输入金额的指定百分比的小费 用户输入交易总额 用户可以选择小费金额(即 10%、15%、20%) ...

    lession1.zip

    标题 "lession1.zip" 提供的信息有限,但根据描述中的同样内容,我们可以推测这是一个教学材料或者编程课程的初级课件。这个压缩包包含了几个关键文件,这些文件名暗示了我们可能在处理一个关于C语言编程的基础教程...

    Lession2-week1.zip

    Lession2-week1.zip

    Lession1

    【标题】:“Lession1”通常意味着这是一系列教程或课程的第一部分,专注于某一特定主题。在这种情况下,由于没有提供具体细节,我们可以假设“Lession1”是关于TypeScript编程语言的基础教学。 【描述】:“自述...

    Lession03.sql

    Lession03.sql

    Android代码-React-native-android 系列中文教材

    react-native-android-lession > 老穆记录: react native andorid 关于iOS部分可以参考vczero的lession文章 > React-Native 是Android端实现实现动态部署的另一种思路,绕过dexLoad【一些现有的Android插件框架...

    directx8_lession directx8_lession directx8_lession

    1. **DirectX 8的基础** - DirectX 8包含多个子组件,如Direct3D(3D图形)、DirectDraw(2D图形)、DirectSound(音频)和DirectInput(输入设备管理)。 - 它的主要目标是降低游戏开发者的系统级编程复杂性,...

    models-lession.zip

    models-lession.zip是一个压缩包,解压后包括目录slim,用于重新训练模型

    Lession3_4.java

    Lession3_4.java

    mooc_android_高仿qq登录界面设计与实现

    1. **Android应用程序开发基础**:首先,你需要了解Android应用开发的基础知识,包括Android Studio的使用、项目的创建和管理。在Android Studio中,你可以通过File > New > New Project创建一个新的Android应用,并...

    01.Origin概述_标清_LOT_origin_lession_

    描述中的"lession 1 of origin"进一步确认了这是一个教学序列的一部分,专注于"起源"主题。在IT学习路径中,第一课通常会介绍基础概念、术语,以及所涉及技术或工具的历史背景,帮助学习者建立对整个领域的初步理解...

    ansible_lession1

    本课程“ansible_lession1”将带你入门Ansible的基本概念和操作,帮助你理解如何利用它来提高运维效率。 首先,让我们了解Ansible的核心概念。Ansible是一个基于Python的开源工具,它的设计思想是“无代理”...

    基于Java语言的初学者入门级Lession1设计源码

    该项目为Java语言的初学者入门级课程设计源码,总计包含146个文件,其中Java源文件54个,类文件50个,属性文件16个,XML文件11个,其他类型文件包括lst、jar、yml、gitignore和iml等。

    spring_lession5

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,它允许开发者在运行时为对象提供其依赖,而不是在代码中硬编码。这样可以提高代码的灵活性和可测试性。 2. **Bean容器(Bean Container)**:...

    android简单单选框测试

    在Android开发中,单选框(Radio Button)是一种常见的用户界面元素,用于让用户在多个选项中选择一个。本文将深入探讨如何在...在lession_6的学习中,你可以深入实践这些知识,进一步提升对Android单选框的掌握。

    Android视频播放器源码

    在Android平台上,开发一款视频播放器是一项常见的任务,它涉及到多媒体处理、网络通信以及用户界面设计等多个技术领域。本资源提供了“Android视频播放器”的源码,对于想要深入理解Android视频播放器开发的开发者...

    android水滴实现

    在`lession_2.view`中,可能包含了如何将自定义的水滴视图整合到Android布局中的示例。这可能涉及到`LinearLayout`、`RelativeLayout`、`ConstraintLayout`等布局管理器的使用,或者自定义的`ViewGroup`。 通过...

    union2 Casptain Cook lession5-6 .docx

    union2 Casptain Cook lession5-6 .docx

Global site tag (gtag.js) - Google Analytics