wince +sl 群

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

posted @ 2010-12-16 08:30  pengxinglove  阅读(1823)  评论(0)    收藏  举报
wince +sl 群