zoukankan      html  css  js  c++  java
  • openg es 之一

    时间:8:59 2010-12-15

    将WINCE 的OPENGL ES 编程环境熟悉。

    使用OPENGL 的四大业务流程来学习。

    OPENGLES 与OPENGL其只是一些方法的多少而矣,思路是一样的。

    有了这四大业务流程,其它均是浮云。

    初始模块:
        本地窗口的初始化。
        OPENGL 初始化
        GAME 业务逻辑的初始化:( 创建对象)

    显示模块
        利用相机模型来进行分析

    用户操作模块
        鼠标操作与键盘操作
        其的操作关键是怎么样选择对象。
    结束模块
        释放资源

    这四大业务逻辑我们在OPENGL当中已经都完整地学习了。

    9:47 -- 10:45
    完成分析,与OPENGL ES

    [问题]
        在之前的使用OPENGL当中,我没有思考这个问题,实际可用的三维对象的创建,虽然三维对象的对象,其本质还是由顶点来构成的。
    业务流程:
    1. 用户想要一个什么样的三维对象。
    2. 分析,数学确定模型
    3. 使用OPENGL一个一个确定所有点的坐标。
    4. 定义光照 [ 可选]
    5. 贴粘纹理 [ 可选]
    6. 执行。

    这是创建一个三维对象本质过程,但此业务流程如果手工来完成,其的工作量很大,且用户使用OPENGL其的主要目标:使用这些三维对象,而不是创建三维对象,

    我们开始学习使用OPENGL的时候,我们是使用一些简单的对象来创建的,现在我们要去真正的创建对象。就要重新 定义此业务流程。

    重新定义后的业务流程:
    1.第一步,第二步,第三步,其均是由工具来完成创建想要的对象,工具将对象以一定的格式文件来保存。

    2.OPEGNL 程序其使用一个解析此文件的LIB来来读取数据,存入一个类当中

    3.创建对象的功能模块,根据此类的数据来创建对象

    4.显示模块,来使用此对象

    5.添加光照

    6.粘贴纹理

    -> 第一步:工具,文件格式
    maya ,MEL
    ->第二步:解析文件类,保存到专门的数据格式类当中

    ->第三步:创建对象。

    想要的用户接口:
        只要用户其只要指定一个对象的文件名就可以。创建想要的对象。

    [ 问题]
        在显示模块当中,对象在场景当中的布局还不能做随心所欲。

    [ 问题]
        对象的创建与纹理,光照其应该是可以分开,对象的创建其可以在初始化模块当中创建好,在显示化模块当中其就可以添加光照与纹理了。

    [ 进入OPENGL ES 编程之前的东西]
        1. 编程环境的建立

        略

        2OPENGL 编程库的使用。
    1.只是使用本地窗口+ egl ,gl ,glu .

    2. 使用辅助库: glutes
    glutes 在使用的时候,其是可以静态的加载,也可以动态的加载,这就是为什么可以在程序当中要定义GLUTES_STATIC,如果其定义,那么其就是使用静态库。
        glutes其的头文件 由于没有完整的收集 glues, glues.c 所以在编译的时候,出现了上面的错误。提供下载。

    3. UG 库
        其与GLUTES的作用是一样的,其均是为了方便用户的使用.

    2. 更加的满足初级的用户使用,因为其让用户只要关注OPENGL的特性的使用。

    先使用最原始的方法来学习吧。

    [ 问题]
        我们去使用 OPENGL ES 库,其有主要目的,就是为了够忽略本地窗口的差异性。另外是一个功能函数的使用。
    我们也可以单独地使用这些库,在本地窗口当中使用这些库,(这一点之前有没有想到。。。)

    在OPENGL ES当中,我们准备使用
    eglwrapper 来封装本地窗口 + glutes ,glues ,ug 库来进行使用。

    [ 问题]
        WINCE 上的GDI 与OPENGLES之间怎么样来联系使用呢。

    对于OPENGL ES的设计结构的思考
        我们还是按基本的四大业务流程思考:

    1.初始化模块
        本地窗口的初始化
        OPENGL的初始化
        GAME业务逻辑的初始化

    1.1 本地窗口的初始化
        首先来分析:OPENGL ES 与本地窗口的之间的关系。在OPEGNL当中其也是要求与窗口系统关联起来。
    这与OPENGL其是相同,但在实现与管理方面是不同的。
    在OPENGL其是没有这个标准的,OPENGL其在不同的平台上其有不同的机制与窗口系统关联。
    如:
    在WINDOWS 平台上其是有WGL,
    在X-Window 平台上其有有xgl
    在Apple os 其是有agl.

    这也就是没有有GLUT ,GLUAX这些辅助库的产生

    而在OPENGL ES当中其是使用 EGL这个标准。
    这也就是为什么 GLUTES其在OPENGL ES的编程当中不是那么样的重要。因为我们可以统一使用EGL这个标准。

    --> 所以以EGL开头的函数,其一般是与窗口系统有关的,而与创建与操作对象没有关联,创建与操作对象其还是使用OPENGL当中的函数。只因为考虑到嵌入式硬件方面的不足,其只是删除了一些功能。

    Opengl es 的初始化过程如下图所示意:

    Display   --> Config --> Surface
                 Context

    Application  --> OpenGL Command

    其是怎么样屏蔽硬件与软件的
    其主要屏蔽 硬件不同。因为OPENGL其是一套硬件标准。软件方面其可以由一个组织机构来完成。

    Display 代表显示器。

    1.  获得Display
    EGLboolean eglGetDisplay( NativeDisplay dpy)

    2.   初始化egl
        EGLboolean eglInitialize( EGLDisplay dpy, EGLint * major, EGLint *minor)

    其对于显示器做进一步的操作处理。

    3.   选择Config
    其要配置什么呢。
    其是配置FrameBuffer 的参数

    如在:Windows系统下其是使用 PixelFormat.
    EGLboolean elgChooseConfig(  EGLDisplay dpy,
                 const EGLint * attr_list,
                 const EGLConfig * config,
                 EGLint config_size,
                 EGLint * num_config)

    chooose Config 其能够选择配置,说明系统当中其有多个配置让我们来选择的。

    EGLboolean eglGetConfigs(  EGLDisplay dpy,
                       EGLConfig * config,
                                               EGLint config_size,
                                               EGLint * num_config)
    其是用来得到所有Config, 其为什么会有所有Config呢,其就是所有FrameBuffer.
    非也。

    Config 其只是FrameBuffer的参数。
    在GL.H当中所有的Config 其是定义成了

        typedef void *EGLDisplay

    EGLboolean eglGetConfigs(  EGLDisplay dpy,
                       EGLConfig * config,
                                               EGLint config_size,
                                               EGLint * num_config)

    eglGetConfigs来获得所有config。这两个函数都会返回不多于config_size个Config,
    结果保存在config[]中,系统的总Config个数保存在num_config中。
    其是返回 dpy( 所指的显示器)的FrameBuffer的参数。

    config 其是有多个Attribute,  -->每一个Config其是有不同的Attribute.
    eglGetConfigAttrib().

    4.构造Surface
        Surface其实际是一个FrameBuffer.
    其可以使用
    EGLSurface eglCreateWindowSurface( EGLDisplay dpy,
                           EGLConfig confg,
                           NativeWindow win,
                           EGLint * cfg_attr)
    来创建一个可实际显示的Surface.
    系统的当中另外两种Surface,
    PixmapSurface, PBufferSurface, 其均不可以显示,那其怎么样创建,怎么样使用。

    PixmapSurface:保存在系统内存中的位图。
    PBufferSurface : 保存在显存中的帧。

    EGLSurface eglCreateWindowSurface( EGLDisplay dpy,
                           EGLConfig confg,
                           NativeWindow win,
                           EGLint * cfg_attr)

    从此函数当中看看OPENGL ES的函数接口设计的思想:

    在哪个显示器上(硬件)在什么在窗口程序上( 软件)根据根据什么配置来进行显示。
    以返回值的形式返回所创建的对象。

    因为其是有多个配置(CONFIG),所以其是有多个,在处理的时候,其将这些参数以数组的形式来组织起来。
    同时要说明数组的大小。

    Surface 的属性其的查询:eglQuerySurface,  而不是使用eglGetSurfaceAttrib
    设置其是使用eglSurfaceAttrib ,而不是eglGetSurfaceAttrib

    5. 创建Context
        Opengl 的pipeline 其是一个状态机,其有
    当前的颜色
    当前的纹理坐标
    当前的变换矩阵
    当前的绚染模式

    这些当前的状态作用于程序提交的顶点等图元 ==> 其形成帧缓冲区的像素。
    (顶点到像素,说明OPENGL当中的,顶点,光照,纹理,其是一个一个像素为单位来表示的,最终影响此像素的RGBA)。

    EGLContext elgCreateContext( EGLDisplay dpy,
                EGLSurface write,
                EGLSurface read,
                EGLContext * share_list)

    一个窗口其是有两个FrameBuffer. EGLContext 其是有什么用处呢.

    注意:OPENGL 其所创建的对象的像素是在帧缓存当中,其要显示我们应该去使用OPENGL API 来在显示器上显示
    eglSwapBuffer(EGLDisplay dpy, EGLContext ctx).

    其说明要在哪一个显示器上显示(因为有多个显示器的情况)

    根据哪个EGLContext 其为什么不是Surface,
    其本质是Surface但没有管理方便其是使用EGLContext

    [ 问题]
        编译OPENGL ES 3D的时候,

    其要添加

    #include<cmath>

    using namespace std;
    错误    34    error C3861: “acosf”: 找不到标识符    f:\VS2008\es3dLib\es3dLib\SkyDomef.cpp    91    es3dLib

  • 相关阅读:
    Java NIO -- 通道 Channel
    【RF库Collections测试】Convert To List
    【RF库Collections测试】Create Dictionary
    【RF库Collections测试】combine lists
    【RF库Collections库测试】关键字append to list
    【RF库测试】关键字get time
    【RF库测试】DateTime库
    linux 统计命令执行后的行数或者统计目录下文件数目
    grep 同时满足多个关键字和满足任意关键字
    【python】一次执行多个linux命令
  • 原文地址:https://www.cnblogs.com/pengxinglove/p/1907511.html
Copyright © 2011-2022 走看看