opengl服务器源码
1. openGL 是什么软件
OpenGL三维图形标准是由AT&T公司UNIX软件实验室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL图形库标准的基础
上联合推出的开放式图形库,它使在微机上实现三维真实
感图形的生成与显示成为可能。由于OpenGL是开放的图形标
准,用户原先在UNIX下开发的OpenGL图形软件很容易移植到微
机上的WindowsNT/95上。笔者在VisualC++4.1(以下简称VC)集
成环境下,开发了基于OpenGL的三维真实感图形应用程序,现
介绍如下。
微机上的OpenGL开发环境
基于OpenGL标准开发的应用程序必须运行于32位Windows
平台下,如WindowsNT或Windows95环境;而且运行时还需有动态
链接库OpenGL32.DLL、Glu32.DLL,这两个文件在安装WindowsNT时已
自动装载到C:\WINNT\SYSTEM32目录下(这里假定用户将WindowsNT
安装在C盘上);而对于使用Windows95平台的用户,则需手工将
两个动态库复制到Windows95目录的SYSTEM子目录中。安装了
WindowsNT/95和VC4.1后,用户就具备了基于OpenGL开发三维图
形软件的基本条件。
OpenGL程序设计的基本步骤
1.OpenGL在WindowsNT下的运行机制
OpenGL工作在客户机/服务器模式下,当客户方(即基
于OpenGL标准开发的应用程序)向服务器(OpenGL核心机制)发出
命令时,由服务器负责解释这些命令。通常情况下,客户方
和服务器是运行在同一台微机上的。由于OpenGL的运行机制
是客户机/服务器模式,这使得用户能够十分方便地在网
络环境下使用OpenGL,OpenGL在WindowsNT上的这种实现方式通常
称为网络透明性。
OpenGL的图形库函数封装在动态链接库OpenGL32.DLL中,
客户机中的所有OpenGL函数调用,都被传送到服务器上,由
WinSrv.DLL实现功能,再将经过处理的指令发送到Win32设备驱
动接口(DDI),从而实现在计算机屏幕上产生图像。
若使用OpenGL图形加速卡,则上述机制中将添加两个
驱动器:OpenGL可装载客户模块(OpenGLICD)将安装在客户端;硬
件指定DDI将安装在服务器端,与WinDDI同一级别。
2.OpenGL的库函数
开发基于OpenGL的应用程序,必须先了解OpenGL的库函
数。OpenGL函数命令方式十分有规律,每个库函数均有前缀gl
、glu、aux,分别表示该函数属于OpenGL基本库、实用库或辅助
库。WindowsNT下的OpenGL包含了100多个核心函数,均以gl作为前
缀,同时还支持另外四类函数:
OpenGL实用库函数:43个,以glu作为前缀;
OpenGL辅助库函数:31个,以aux作为前缀;
Windows专用库函数(WGL):6个,以wgl作为前缀;
Win32API函数(WGL):5个,无前缀。
OpenGL的115个核心函数提供了最基本的功能,可以实
现三维建模、建立光照模型、反走样、纹理映射等;OpenGL实
用库函数在核心函数的上一层,这类函数提供了简单的调
用方法,其实质是调用核心函数,目的是减轻开发者的编程
工作量;OpenGL辅助库函数是一些特殊的函数,可以供初学者
熟悉OpenGL的编程机制,然而使用辅助库函数的应用程序只
能在Win32环境中使用,可移植性较差,所以开发者应尽量避
免使用辅助库函数;Windows专用库函数(WGL)主要针对WindowsNT
/95环境的OpenGL函数调用;Win32API函数用于处理像素存储格
式、双缓存等函数调用。
3.VC环境下基于OpenGL的编程步骤
下面介绍在VC环境中建立基于Opeetting菜单选项,在Link栏的Lib输入域中
添加openg132.lib、glu32.lib,若需使用OpenGL的辅助库函数,则还
需添加glaux.lib。
(3)选择View/ClassWizard菜单选项,打开MFC对话框,在
ClassName栏中选择CMyTestView类,进行以下操作:
选择WM_CREATE消息,鼠标单击EditCode,将OpenGL初始化代码
添加到OnCreate()函数中:
/*定义像素存储格式*/
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0,
}
CCLientdc(this);
intpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dc.m_hDC);
选择WM_DESTORY消息,在OnDestory()中添加以下代码:
wglDeleteContext(m_hRC);
在MyTestView.cpp中,将以下代码添加到PreCreateWindows()函数中:
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;
在MyTestView.cpp中,将以下代码添加到OnDraw()函数中:
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用户自定义函数,用于绘制三维场景;
wglMakeCurrent(pDC->m_hDC,NULL);
在MyTestView.cpp中,添加成员函数DrawScene():
voidCMyTestView::DrawScene()
{/*绘制三维场景*/}
(4)在MyTestView.h中包含以下头文件并添加类成员说明:
#include
#include
#include
在CTestView类中的protected:段中添加成员变量声明:
HGLRCm_hRC;
同时添加成员函数声明:
DrawScene();
这样,一个基于OpenGL标准的程序框架已经构造好,用
户只需在DrawScene()函数中添加程序代码即可。
建立三维实体模型
三维实体建模是整个图形学的基础,要生成高逼真
度的图像,首先要生成高质量的三维实体模型。
OpenGL中提供了十几个生成三维实体模型的辅助库函
数,这些函数均以aux作为函数名的前缀。简单的模型,如球
体、立方体、圆柱等可以使用这些辅助函数来实现,如
auxWireSphere(GLdoubleradius)(绘制一半径为radius的网状球体)。
但是这些函数难以满足建立复杂三维实体的需要,所以用
户可以通过其它建模工具(如3DS等)来辅助建立三维实体模
型数据库。笔者在三维实体的建模过程中采用3DS提供的2D
Shape、3DLofter和3DEditor进行模型的编辑,最后通过将模型数
据以DXF文件格式输出存储供应用程序使用。
真实感图形的绘制
1.定义光照模型和材质
(1)光源。OpenGL提供了一系列建立光照模型的库函
数,使用户可以十分方便地在三维场景中建立所需的光照
模型。OpenGL中的光照模型由环境光(AmbientLight)、漫射光
(DiffuseLight)、镜面反射光(SpecularLight)等组成,同时还可设
置光线衰减因子来模拟真实的光源效果。
例如,定义一个黄色光源如下:
GlfloatLight_position[]={1.0,1.0,1.0,0.0,};
GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,};
glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定义光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定义光源漫射光
光源必须经过启动后才会影响三维场景中的实体,可以通过以下指令使光源有效:<
glEnable(LIGHTING);//启动光照模型;
glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效;
OpenGL中一共可以定义GL_LIGHT0~GL_LIGHT7八个光源。
(2)材质。OpenGL中的材质是指构成三维实体的材料在
光照模型中对于红、绿、蓝三原色的反射率。与光源的定义
类似,材质的定义分为环境、漫射、镜面反射成分,另外还
有镜面高光指数、辐射成分等。通过对三维实体的材质定义
可以大大提高应用程序所绘制的三维场景的逼真程度。例
如:
/*设置材质的反射成分*/
GLfloatmat_ambient[]={0.8,0.8,0.8,1.0};
GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/
GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*镜面高光亮紫色*/
GLfloatmat_shiness[]={100.0};/*高光指数*/
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定义环境光反射率*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定义漫射光反射率*/
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定义镜面光反射率*/
glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定义高光指数*/
(3)材质RGB值与光源RGB值的关系。OpenGL中材质的颜色
与光照模型中光源的颜色含义略有不同。对于光源,R、G、B
值表示三原色在光源中所占有的比率;而对于材质定义,R、
G、B的值表示具有这种材质属性的物体对于三原色的反射
比率,场景中物体所呈现的颜色与光照模型、材质定义都相
关。例如,若定义的光源颜色是(Lr,Lg,Lb)=(1.0,1.0,1.0)(白光),
物体的材质颜色定义为(Mr,Mg,Mb)=(0.0,0.0,0.8),则最终到达人
眼的物体颜色应当是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(蓝色)。
2.读取三维模型数据
为了绘制三维实体,我们首先必须将预先生成的三
维实体模型从三维实体模型库中读出。下图描述了读取三
维实体模型的流程。
3.三维实体绘制
由于3DS的DXF文件中对于三维实体的描述是采用三角
形面片逼近的方法,而在OpenGL函数库中,提供了绘制三角形
面片的方法,所以为三维实体的绘制提供了方便。以下提供
了绘制三角形面片的方法:
glBegin(TRANGLES);//定义三角形绘制开始
glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一个顶点
glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二个顶点
glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三个顶点
glEnd();//绘制结束
为了提高三维实时动画的显示速度,我们利用了
OpenGL库中的显示列表(DisplayList)的功能,将三维场景中的实
体分别定义为单独的显示列表,预先生成三维实体。在图形
显示时,只需调用所需的显示列表即可显示相应的三维实
体,而不需要重新计算实体在场景中的坐标,避免了大量的
浮点运算。在调用显示列表前所作的旋转、平移、光照、材
质的设定都将影响显示列表中的三维实体的显示效果。具
体实现算法如下:
for(ObjectNo=0;ObjectNo<实体个数;ObjectNo++)
{
glNewList(ObjectNo,GL_COMPILE);//创建第ObjectNo个实体的显示列表
for(Fac
2. 云服务器不支持opengl
云服务器不支持opengl是显卡不支持模拟器。电脑显卡的驱动不存在或者太旧会出现不支持opengl。
1、下载驱动精灵检测安装显卡驱动。
2、运行驱动精灵,点击一键体检安装,更新显卡驱动。
2、装的万能驱动,显卡驱动更新下,重启电脑再安装。
3、更新显卡驱动后,出现电脑屏幕绿屏、花屏等显示不正常,回滚显卡驱动。
3. 无头服务器no root 无屏幕渲染
在headless server(无头服务器)上安装实现pyrender.offscreen render(无屏幕渲染)通常会遇到一些挑战,特别是当服务器仅配备加速计算卡(如tesla V100 32G)且没有图形渲染支持的GPU驱动时。在尝试运行包含使用GPU的openGL接口的py脚本时,程序可能会因为缺少图形显示权限或GPU驱动的渲染部分而长时间卡住。然而,是否可以在服务器上仅使用CPU实现离屏渲染呢?答案是肯定的。通过使用Osmesa/mesa作为对OpenGL接口的模拟,我们能够借助CPU实现off-screen渲染。
安装Osmesa/mesa的难度在于,它需要特殊的权限和环境配置,这通常涉及到root权限。尽管如此,为了解决这个问题,Pyrender的作者提供了源码安装方式,这为没有root权限的用户提供了一条可行的途径。首先,确保服务器具备安装Osmesa/mesa所需的一些依赖包,如llvm-6.0,一个用于编译优化的工具集。在没有sudo权限的情况下,通过源码安装llvm-6.0是一种可行且高效的方法,无需依赖于apt-get工具。
完成llvm-6.0的安装后,下一步是下载mesa的源代码。通常,下载后需要在本地创建一个目录,并将源码包放入其中。接着,通过构建、编译和安装mesa库来完成Osmesa/mesa的安装过程。在安装过程中,可能会遇到配置问题,尤其是设置PREFIX路径时,确保正确设置以避免安装失败。如果遇到安装失败,请检查路径设置和依赖包是否正确安装。
安装mesa后,接下来需要从指定源下载并安装pyrender的Osmesa/mesa支持。在进行make命令前,可能需要对mesa的配置进行一些调整,以确保与当前环境的兼容性。在遇到编译错误时,检查路径设置和编译选项,确保没有遗漏或错误。如果遇到特定错误,例如找不到llvm或其版本过低的问题,需要检查并更新相关组件。
在成功安装Osmesa/mesa后,pyrender.offscreen render(无屏幕渲染)的功能便可以在无头服务器上实现,无需额外的GPU硬件或root权限。这一过程虽然较为复杂且耗时,但通过遵循详细的步骤和调试,可以克服安装过程中的挑战,最终在无头服务器环境中实现高效的离屏渲染功能。
4. OpenCL,OpenGL和DirectX三者的区别
什么是OpenCL?
OpenCL全称Open Computing Language,是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
OpenCL 1.0主要由一个并行计算API和一种针对此类计算的编程语言组成,此外还特别定义了:
1、C99编程语言并行扩展子集;
2、适用于各种类型异构处理器的坐标数据和基于任务并行计算API;
3、基于IEEE 754标准的数字条件;
4、与OpenGL、OpenGL ES和其他图形类API高效互通。
什么是OpenGL?
OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。
Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。
今年08年正式公布OpenGL3.0版本。并且得到了,nv的支持,其官方网站上提供针对N卡的sdk下载。
什么是DirectX?
DirectX是一种应用程序接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。
DirectX是由很多API组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。
显示部分担任图形处理的关键,分为DirectDraw(DDraw)和 Direct3D(D3D),前者主要负责2D图像加速。它包括很多方面:我们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你可以把它理解成所有划线的部分都是用的DDraw。后者则主要负责3D效果的显示,比如CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的 Direct3D。
OpenCL、OpenGL和DirectX之间不得不说的故事
业界对Apple的OpenCL的支持将成为它发展的重要因素,早在90年代中期,微软就曾经努力阻止OpenGL成为行业的标准,以推行自己的DirectX显卡软件和游戏工具。微软的Direct X起初的战略是为了推动DOS游戏开发者转向Windows,从此之后它就被绑定在Windows下为PC游戏服务,所以它仅支持Windows。
断发布新版的DirectX也推动了开发者转向最新版的Windows,比如最新版的DirectX 10就带来了不少Vista专属游戏,从而推动了Vista的销量,然而它并未达到预期的效果,因为Vista的速度阻碍了DirectX10游戏的市场,开发者只能将目标再次转向XP。
OpenGL和Apple
OpenGL的前身是高端图形工作站厂商SGI在80年代所开发的IRIS G,它在90年代初期成为了开源的标准。当时微软在它的Windows 95中发布了Direct3D,将它作为OpenGL的竞争对手。而在90年代末,微软曾经和SGI进行了Fahrenheit项目的开发,试图将两者结合起来,但是没有成功。之后微软继续开发DirectX并与GPU厂商合作,留下OpenGL任其发展。
OpenGL之后几乎逐渐消失,直到90年代末Apple放弃了自己的QuickDraw 3D,将OpenGL作为Mac OS X的官方3D库。Apple的系统给OpenGL程序带来了不少拥护者。之后OpenGL正式被Linux采用,现在主流的游戏平台,包括PSP,PS3 和Wii都支持该技术。
但是微软的Xbox360例外,它采用了自己的DirectX 图形库,而将OpenGL排除在外。如今OpenGL对DirectX来说比以前更有竞争力了。而微软计划在Windows 7中的DirectX 11增加类似于OpenCL的技术,以实现GPGPU运算。但是Apple的OpenCL能更紧密地与OpenGL代码协同工作,能带来更广泛的支持。 Apple还将OpenCL作为一个免费的,开源的标准,让任何人都能参与到该平台中来。
OpenGL和OpenCL设计的相似性,使开发者更易于开发。比如在OpenCL下进行数据虚拟化计算,可以把相同的对象在OpenGL上进行图形渲染。同时OpenGL下的图形渲染可以在OpenCL下进行处理和转换。
OpenCL得到了GPU厂商NVIDIA和AMD的支持,同时支持Apple,SONY,任天堂的平台,还支持Linux和Windows,而且任何公司的开发者都可以参与到该技术的发展中来。
5. OpenGl是什么
OpenGL是一种高性能的三维图形标准,由多家知名计算机公司联合推出,如SGI、Microsoft、IBM等。它是一个开放的、通用的三维图形库,使得在微机上实现高质量的三维图形生成与显示成为可能。由于其开放性,开发的OpenGL软件可在Windows NT、95等平台之间轻松移植。在Visual C++集成开发环境中,可以利用OpenGL创建三维真实感图形应用。
为了进行OpenGL开发,首先需要在32位Windows环境中,如Windows NT或95,安装动态链接库OpenGL32.DLL和Glu32.DLL。这些库在Windows安装时会被自动加载或手动复制到指定目录。具备这些环境后,开发流程涉及以下几个关键步骤:
- OpenGL采用客户机/服务器模式,客户机应用发送命令给服务器解释,提供网络透明性。在Windows NT中,所有OpenGL函数调用通过动态链接库传递。
- OpenGL的库函数分为核心函数(100多个)、实用库(43个)、辅助库(31个)和专用库。核心函数是基础,实用库简化调用,辅助库供初学者学习,专用库针对特定环境。
- 在VC环境下,通过菜单选项添加OpenGL库,如opengl32.lib、glu32.lib,并在MFC对话框中设置像素格式和OpenGL上下文。还需编写OnCreate()和OnDestroy()函数以初始化和清理OpenGL环境。
- 在DrawScene()函数中,开发者可以创建三维模型,如使用aux库函数生成球体、立方体等,然后定义光照模型和材质,包括环境光、漫反射、镜面反射等。
- OpenGL支持读取三维模型数据和绘制,利用三角形面片逼近方法。为了提高性能,可以使用显示列表功能预先生成和存储实体,简化显示过程。
OpenGL提供了丰富的功能,如建模、变换、颜色模式、光照材质、纹理映射、位图显示增强、双缓存动画等,使得仿真和图形显示更加真实和高效。总之,OpenGL是微机三维图形开发的强大工具,为各种应用提供了丰富的可能性和良好的移植性。