时间: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