1.关于opengl和 osg的问题
2.纯sdk做界面
关于opengl和 osg的问题
简介
OpenSceneGraph是一个开放源码,跨平台的图形开发包,它为诸如飞行器仿真,游戏,虚拟现实,科学计算可视化这样的弑神游戏源码在哪高性能图形应用程序开发而设计。它基于场景图的概念,它提供一个在OpenGL之上的面向对象的框架,从而能把开发者从实现和优化底层图形的调用中解脱出来,并且它为图形应用程序的快速开发提供很多附加的实用工具。
特性
有了OpenSceneGraph,我们的目标是让所有的人在场景图技术中受益,无论是remix ide源码解析商业还是非商业的用户。它完全是由标准C++程序和OpenGL写的,充分利用STL和设计模式,发挥开源开发模型的优势来提供一个免费的开发库,并且重点集中在用户的需求上。随着使用一个全特性的场景图OpenSceneGraph的关键优势在于它的性能、可扩展性、可移植性和快速开发(productivity),更具体的来说:
性能
支持视图投影剔除(view frustum culling),隐藏面剔除(occlusion culling),小特性剔除(small feature culling),细节层次节点(LOD),状态排序(state sorting),php 源码加密思想顶点数组,顶点缓冲对象(vertex buffer objects),OpenGL着色语言和显示列表(display lists),以上所列都是场景图内核的一部分。它们共同使OpenSceneGraph成为一个高性能的图形库变为可能,OpenSceneGraph也支持绘制进程(drawing process)的定制,比如场景图的连续细节层次(CLOD)的网格(参见虚拟地形项目和Delta3D)。
快速开发
场景图的内核封装了包括最新扩展的大部分OpenGL功能,提供诸如剔除和排序的渲染优化功能,同样提供能快速开发高性能图形应用程序的一整套补充库。应用程序开发者可以更关心实质性内容和如何操控这些它们,而不再是怎么查看struts源码底层的代码
通过学习已有的场景图,比如:Performer和Open Inventor,把它们同像设计模式这样现代软件工程理念联合起来,加上早期开发周期中的大量反馈信息,设计一个清晰的可扩展的库已经成为可能。用户可以很简单的适应OpenSceneGraph并且把它集成到自己的应用程序中数据装载
为了读入和写出数据库,有一个数据库的支持库(osgDB)增加了通过后缀名动态插件机制,从而支持大量数据格式,目前的发布版本有种单独的插件支持3D数据和图像格式的装载。支持的3D数据格式包括COLLADA, LightWave (.lwo),Alias Wavefront (.obj),OpenFlight (.flt),炫酷相册 源码 多线程页面调度支持的TerraPage (.txp),Carbon Graphics GEO (.geo), 3D Studio MAX (.3ds), Peformer (.pfb),AutoCAd (.dxf), Quake Character Models (.md2). Direct X (.x), and Inventor Ascii 2.0 (.iv)/ VRML 1.0 (.wrl), Designer Workshop (.dw) ,AC3D (.ac) 和自带的.osg ASCII 文本格式。支持的图像格式包括.rgb, .gif,.jpg, .png, .tiff, .pic, .bmp, .dds (包含压缩的一系列Mip贴图影像),.tga and quicktime (在OSX环境下),全范围的高质量、抗锯齿字体也能通过freetype插件支持,基于字体的图像也可以通过.txf插件支持。
用户也可以通过与我们同行的一个项目(VirtualPlanetBuilder)生成大规模地形空间数据(multi GB),使用OpenSceneGraph的自带数据分页调度支持来查看这些数据。
节点工具箱
这个场景图同样有一套节点工具集,它们是可以在你的应用程序中编译或者在运行时装载的独立库,它们增加支持粒子系统(osgParticle),高质量抗锯齿文本(osgText),特效框架结构(osgFX),阴影框架结构(osgShadow),交互控制(osgManipulator),与虚拟仿真相关的效果(osgSim)。
可移植性
场景图的内核已经被设计成尽量少的依赖具体的平台,很少的部分超出了标准C++程序和OpenGL。这就使得这个场景图可以快速移植到大部分系统中—最开始在IRIX开发,然后移植到Linux,接着到Windows,再后来就是FreeBSD, Mac OSX,Solaris,HP-UX, AIX 甚至是PlayStation2!
完全独立与窗口操作系统的场景图内核库使得用户在它上面可以增加他们自己的指定窗口库和应用程序,在发布版本中osgViewer库提供自带窗口支持,可支持Windows (Win), Unices (X) 和 OSX (Carbon)。osgViewer库也可以轻松的和你的窗口开发包集成起来,作为OpenSceneGraph-2.0发布版本的一部分,有例子演示了如何在Qt, GLUT, FLTK, SDL, WxWidget, Cocoa and MFC中的使用。场景图内核的可扩展性使得它不仅仅可运行在便携式设备,甚至高端的多核、多GPU的系统和集群上。这可能是因为场景图内核为OpenGL的显示列表和纹理对象支持多重图形渲染环境(multiple graphics contexts),剔除和绘制的遍历过程被设计成隐藏渲染数据为局部变量,这样可以以几乎只读的方式使用场景图内核。这样就允许多对剔除—绘制过程运行在多个CPU上,CUP也是绑定在多个图形子系统之上。对多图形设备渲染环境和多线程的支持可以在osgViewer中方便使用,发布版本中所有的例子都可以以多线程和多GPU的方式运行。作为社区项目,OpenSceneGraph支持多种语言,比如Java,Lua和Python。
纯sdk做界面
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wc;
MSG msg;//消息
HWND hWnd;//这个叫窗口句柄,类似于一个指针,指向一个窗口所在的内存区域
wc.cbClsExtra=0;//这些表示设置窗口后需要多分配的内存空间,一般写0
wc.cbWndExtra=0;//同上
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景颜色
wc.hCursor=LoadCursor(NULL,IDC_CROSS);//光标的样式,也就是鼠标指针的样式
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标样式
wc.hInstance=hInstance;//实例句柄,跟上面的HINSTANCE hInstance一样
wc.lpfnWndProc=WndProc;//消息处理函数,跟上面声明的LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)函数一样,其中WndProc作为一个地址传递给窗口对象wc
wc.lpszClassName="test";//窗口名称
wc.lpszMenuName=NULL;//菜单
wc.style=CS_HREDRAW | CS_VREDRAW;//窗口样式
RegisterClass(&wc);//注册窗口类
hWnd=CreateWindow("test","hello",WS_SYSMENU,,,,,NULL,NULL,hInstance,NULL);
//上面的参数解释如下:"test"是窗口类的名称,一定要同wc.lpszClassName一样
//"hello"是窗口标题
//WS_SYSMENU窗口模式
//,,,前两个是窗口的初始位置,后两个是窗口的大小
//剩下的一般NULL,NULL,hInstance,NULL这样写
ShowWindow(hWnd,nCmdShow);//显示窗口
UpdateWindow(hWnd);//更新窗口
//下面是得到消息
while(GetMessage(&msg,NULL,0,0))
{
//下面是处理消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;//函数返回
}
//下面是消息处理,这个函数表示了程序对用户提交消息所作出的反应
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hDC;//这个叫设备描述表,主要就是做有关屏幕图像、文字之类乱七八糟的事情
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE://窗口建立后执行的东东,我们暂时设置为什么也不执行
break;
case WM_PAINT://绘制窗口
hDC=BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
break;
case WM_CLOSE://程序结束
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);//其他消息返回默认处理方式
}