pe

阅读 / 问答 / 标签

pebbles是什么意思

鹅卵石

列宾斯基病毒Lepenski Vir简介

Lepenski Vir(塞尔维亚西里尔文:Лепенски Вир,“Lepena Whirlpool”)是塞尔维亚东部多瑙河畔的一个古老定居点;更准确地说,在 Donji Milanovac 附近的 Boljetin 村。该遗址展示了超过 8000 年历史的文化证据,其中包括社会交往、宗教习俗、建筑和艺术,具有中石器时代和新石器时代的特征和层次。考古学家在该遗址出土了有趣的石雕作品,其中一些描绘了类似人类的人物,而另一些则表明了对天文事件的欣赏。 考古调查 Lepenski Vir 位于多瑙河畔,于公元 1960 年代由 Dragoslav Srejovic 领导的一群塞尔维亚考古学家发现,他是该遗址发现和挖掘的重要贡献者。发现了 136 座住宅和骶骨建筑,可追溯到公元前。9500/7200 – c。公元前 5500 年,由于距离 Lepenski Vir 78 公里的水力发电厂 - Djerdap 1 建造期间产生的潮汐,意外发生了。公元 1965 年开始的第一次挖掘工作并不乐观。在遗址上呆了几个月后,考古学家终于挖出了第一批物品。正是在这一刻,他们明白,这次发掘不仅对塞尔维亚,而且对整个欧洲及其他地区都具有重大的历史和文化意义。 LEPENSKI VIR 的整体建筑具有特定的形状,所有房屋都按照计划建造。 公元 1967 年,在 Lepenski Vir 发现第一批物品和人工制品大约一年后,公众被正式告知了挖掘工作,消息随后传遍了世界各地。科学家们确信,他们发现的是一种新的——同时也是一种古老的——文化的痕迹,这可能是对欧洲历史的重要补充。研究人员建议 c. 9500 - c。公元前 7200 年作为定居点的开始,之后是 Lepenski Vir 的文化。Srejovic 在 Lepenski Vir 提出了对职业序列的解释:位置和意义 Lepenski Vir 位于塞尔维亚东部,靠近 Donji Milanovac。该遗址位于多瑙河右岸的铁门峡谷——在塞尔维亚语中被称为杰尔达普。由于地形的稳定,附近的河流,周围自然的丰富和美丽,以及人们非凡的知识,该遗址在很长一段时间内一直有人居住。最常见的食物是鱼,因为突出的岩石通过形成漩涡,使其成为适合鱼类的栖息地。 周围丘陵和山脉的形状和阴影,观察Treskavac上方“双重日出”的便利位置 - 罗马尼亚的悬崖,位于定居点的对面 - 以及雕刻在雕塑遗骸上的标志,制作研究人员认为,也许第一台用于测量时间的仪器就是在这里——Lepenski Vir——在c。公元前 6300/6200 年。 由于定居点停滞不前,其居民知识渊博,毫无疑问,他们会注意到“双日出”的规律过程。正如研究人员和建筑师 Pavlovic 所说: 日历的起点是特雷斯卡瓦茨悬崖上方的双重日出。从那天起,Lepenians 观察到黎明点如何向右移动并缩短白天,直到 12 月 21 日冬至,太阳从对面的库库乔沃山顶升起。然后这个过程朝相反的方向移动:黎明在地平线上向左移动,直到 3 月 21 日夏至,太阳从日历的第三个重要点 Glavica 山顶升起。 (引用于 Subasic) 该现象已被检验并确认其存在——即“双日出”很可能存在于 8000 多年前,就像现在一样。 Lepenski Vir 的建筑与规划 Lepenski Vir 的多功能建筑结构 - 以梯形形状为特征 - 用于住宅、骶骨、仪式、艺术、聚集目的。在建筑工作中,Lepenians(Lepenski Vir 的居民)使用棍棒、绳索和其他类似工具;甚至阴影的位置。除了他们的艺术技巧和利用空间的本能外,为探索这些问题而进行的研究表明,Lepenians 在当今人们不会归因于古代世界的人的领域中拥有知识。建筑师 Pavlovic 解释说,Lepenians 一定拥有关于对称、几何、直角甚至黄金比例的丰富知识,这些知识在建筑物的外部甚至内部都是可见的。 祖先被埋在房屋内,在地板结构下。 Lepenski Vir 的整体建筑具有特定的形状,所有房屋都按照计划建造。形状是梯形的,地板结构由某种石膏制成——即石灰石粘土与动物粪便和灰烬混合。石头加固物支撑着屋顶,而较小的石头被放置在靠近入口的壁炉周围。家庭火灾是现场的一个重要因素。它不仅用于取暖,还用于保护动物免受伤害。余烬被分开,覆盖着灰烬,一直运到黎明时分,因为他们需要再次生火。 在 Lepenski Vir 的新石器时代发现了一个烤炉——与我们今天使用的没有任何显着差异。事实上,房屋的建筑看起来与火炉相似。考古学家将其命名为“49 号房屋”,位于定居点的中心,其建造方式与其中一所房屋内发现的最大火炉相同。炉子和“49 号房子”的面积相同——大约 1.5 平方米——这引发了一个疑问:“49 号房子”怎么可能是真正的房子? Pavlovic 也是公认的塞尔维亚 Lepenski Vir 文化专家(除了是一名专业建筑师),他解释说这是一个比例模型,用于传达有关如何建造其他房屋的想法。事实上,Lepenski Vir 的所有房子都是一样的。包括 Pavlovic 在内的现场研究人员认为,“49 号房屋”是一个完美构建的“能量机器”。他们将其解释为空气在贝壳形房屋中循环的方式,为其居民提供舒适的环境——在建筑中也被称为“热舒适”。建筑师 Pavlovic 还坚持认为,Lepenski Vir 是欧洲第一个计划中的定居点,因为该地原住民的非凡创造力和知识。 宗教习俗 在该遗址上发现了一个关于 Lepenians 的宗教习俗,特别是他们与死亡的联系的非凡事实。在谈到他们的祖先和去毛刺的做法时,Lepenians 非常尊重。事实上,祖先被埋在房屋内,在地板结构下。在某些墓葬的情况下,有明显证据表明房屋的石膏地板上有严重的扰动,而对于其他一些墓葬,则没有这种扰动的痕迹,这意味着它们比它们所涉及的房屋更年轻。地板表面的小大厅被认为是与祖先交流的一种方式。既然他们离死亡如此之近,也许,他们并不害怕死亡。 一些提到的做法现在可以在不同的宗教中得到认可——例如将祖先埋在地下的方式以及以某种方式与他们联系的需要。Lepenians 在地板上建造了大厅,而今天的一些做法是为了纪念已故的灵魂,例如点燃蜡烛和进行祈祷。 Lepenski Vir 雕塑 在挖掘过程中发现的雕塑可以追溯到c。6300 - c。公元前 5900 年——即从定居点 Lepenski Vir I 开始,在随后的所有层中都被发现,直到 Lepenski Vir 文化结束。雕塑上可以区分两种不同的配置:简单的几何图案和人形或鱼形图形。许多雕塑被保存在住宅中,甚至建在入口处、房屋后面或靠近壁炉的地板结构中。后者可能是埋在壁炉下的死去祖先的代表。至于其余的雕塑,它们像鱼一样——意料之中——因为定居点的饮食富含鱼类。 其中最著名的是 Progenitrix - Praroditeljka - 这是 Lepenski Vir 的象征。它是唯一完整地表现人体的人物:人形头部,颈部形状清晰,身体圆润,没有下肢; *** 覆盖着双手和女性生殖器的象征性代表。雕塑的尺寸为 51 x 39 厘米。 Danubius 被解释为男性形象,另一个雕塑,是一个圆形的质量,具有人类的面部表现,没有呈现身体的其他部位。 家族创始人 - Rodonacelnik - 是一幅超自然维度的不朽肖像。它由石英砂岩制成,颈部和眼睛周围有红色颜料涂层的痕迹。雕塑的尺寸为 52 x 33 厘米。 亚当雕塑以深灰色颜料的痕迹对面部、颈部进行了细致的描绘,并没有突出身体的任何其他部位,呈现出一个男人的形象雕塑。它的面部表情暗示着一个年轻而强大的存在。该雕塑的尺寸为 23.2 x 16 厘米。 其他非凡的手工艺品,如陶器、珠宝、护身符、针和抹刀,都是由骨头、贝壳和石头制成的。许多科学家观察到一个突出的小神秘物体——来自 Lepenski Vir 的球形石头。石头,可以追溯到c。公元前 4000 年,两侧被挖空:c。上侧 6 毫米,下侧 1.5 厘米。石头上的雕刻线条看起来就像地球上的经络。雕塑尺寸为 4.5 x 3.8 厘米。 美国、德国、意大利、俄罗斯和塞尔维亚科学家对来自 Lepenski Vir 的球形石头的解释各不相同。然而,他们得出的结论非常相似:该物体具有考古天文意义,可能与太阳历有关。 今天的莱宾斯基病毒 今天,科学家们参观了 Lepenski Vir,他们仍在试图为 Lepenian 地球仪和太阳历“谜题”寻找解释。正如一位塞尔维亚古代宗教和考古天文学研究人员所指出的那样,创造该物体所付出的努力是巨大的,这表明刻在其上的信息的重要性,不幸的是,该信息尚未被阅读。 正在进行的研究探索已在 Lepenski Vir 使用的出生原理,据信该定居点的某些部分仍未被发现。证明土著人民创造力和知识的手工艺品在 Donji Milanovac(塞尔维亚)的 Lepenski Vir 博物馆和贝尔格莱德(塞尔维亚)的塞尔维亚国家博物馆的 Lepenski Vir 收藏中展出。

什么是OPENG?

写错了吧,OpenGLOpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。OpenGL是个与.硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是3D图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS等3D图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数组。在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如图一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫。Open GL现状Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。高级功能 OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加API实现: * GLX - X11(包括透明的网络) * WGL - Microsoft Windows 另外,GLUT库能够以可移植的方式提供基本的窗口功能

openGL是什么?DX?HDTV?

OPENGLDirectX是微软特有的,可以看为一种特殊驱动HDTV(连接电视机用的)(OPENGL和DirectX,一般在安装谷歌地球时,启动模式有这二种区分)

如何编辑BCD文件给WIN7光盘添加PE启动引导菜单

我的这个bcd是原版系统install。wim的配置文件,第一项default即默认启动项的标志。第二项启动设备,路径就是启动程序的路径,description没用写给自己看的。语言也是自己选择。继承一般是本地设置,这个是安装配置跟真正的win7系统不一样的。osdevice操作系统设备,一般不用你设,根目录你懂的,winpe这个才是你想用的即你的这个系统是否要添加pe启动项。我只是做pe的时候碰到了一下bcd,自己也经常改,不过感觉用处不大,pe若是在c盘重装会没的。祝你好运,希望回答对你有用,望采纳。

如何查看自己电脑支持OpenGL core版本

升级下驱动试试,我记得opengl好像都是在驱动里面的,但这集成显卡能不能找到驱动我觉得不太一定。

如何将YUV用opengl输出到屏幕上

为了保证你的程序可以输出汉字,要先用MultByteToWideChar函数把char转换到wchar_t字型里,要记得在最后面加上"".(先用malloc申请一个够长的wchar_t型的内存段,在计算长度的时候加上这个,因为一个汉字在char要两个单位,但是wchar_t就一个单位,这段代码通过检测字符的意义来判断这个字节的数据是不是独立的一个字符,以此来精确的计算空间.计算好的空间加1后才是要用的空间,因为后面要加一个""for(i=0;text[i]!=""&&i<length;++i) { if(IsDBCSLeadByte(text[i])) ++i; ++lan; })然后glGenList生成一个显示列表备用.接下来wglUseFontBitmapsW把字符的显示列表画出来保存在刚生成的显示列表里.这样就OK了,然后再选好位置glCallList 就画出来了.由于有的时候情况会比较复杂,记得管理好内存,不要造成泄露,记得及时删除用过的显示列表,因为字的转换比较快,所以没必要现写现转,但是为了避免转字的代码比较麻烦,最好写个函数用来在指定的位置上写字.在转子的过程中还要用到wgl的函数HDC描述句柄等,所以要包含头文件gdi.h连接gdi32.lib ,为了谨慎起见,最好在每次转换的时候检查一下HDC的设备像素格式,以免出了错却不知道是什么问题(有些情况HDC是不支持OpenGL的)这些函数的参数用法都可以在网上找到,在这里讲出来会非常麻烦.

OpenGL里面如何显示汉字?

wglUseFontOutlines 要求头文件 wingdi.h库 opengl32.lib

如何在mfc中配置opengl

1:新建一个MFC的工程,单文档的工程。2:工程建好之后,可以先编译运行一下。下面就是要把View的窗口初始化为OpenGL的编程环境。当然以下所有的操作都是在View类中进行的。先在Project->Settings->Link中,加上opengl32.libglu32.lib glut.lib glaux.lib,然后在View.h的类定义中加上如下引用。#include <glgl.h>#include <glglu.h> #include <glglaux.h>3:首先要让窗口支持OpenGL,那就必须要对PIXELFORMATDESCRIPTOR这个结构有所了解,先在View类中新建一个函数SetupPixFormat(CDC*pDC),类型:看下面的函数就知道为BOOL,(方法:在classview中,找到**view类,鼠标右击,添加函数)公有私有无所谓,如下:BOOL CTestGLInitialView::SetupPixFormat(CDC *pDC) //我建立的工程名叫TestGLInitial{static PIXELFORMATDESCRIPTOR pfd = //定义像素格式{ sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小 1, // 版本号 PFD_DRAW_TO_WINDOW | // 格式支持窗口 PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL PFD_DOUBLEBUFFER, // 必须支持双缓冲 PFD_TYPE_RGBA, // 申请 RGBA 格式 24, // 24位色彩深度,即1.67千万的真彩色 0, 0, 0, 0, 0, 0, // 忽略的色彩位 0, // 无Alpha缓存 0, // 忽略Shift Bit 0, // 无累加缓存 0, 0, 0, 0, // 忽略聚集位 32, // 32位 Z-缓存 (深度缓存) 0, // 无蒙板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主绘图层 0, // Reserved 0, 0, 0 // 忽略层遮罩};int nIndex = ChoosePixelFormat(pDC->GetSafeHdc(), &pfd); //选择刚刚定义的像素格式if( nIndex == 0 ) return FALSE;return SetPixelFormat(pDC->GetSafeHdc(), nIndex, &pfd); //设置像素格式}这个函数的主要目的就是设置窗口的像素格式,使之支持OpenGL,明白这点就行了。在创建窗口的时候,调用这个函数。5:刚刚那个函数是用来在创建窗口是调用的,在创建窗口时,还需要对OpenGL的环境做一些初始化,再定义一个函数InitialGL(),(方法:在classview中,找到**view类,鼠标右击,添加函数)公有私有也无所谓,反正是自己调用的,如下:BOOL CTestGLInitialView::InitialGL(){glShadeModel(GL_SMOOTH); // 启用阴影平滑glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景glClearDepth(1.0f); // 设置深度缓存glEnable(GL_DEPTH_TEST); // 启用深度测试glDepthFunc(GL_LEQUAL); // 所作深度测试的类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正return TRUE; // 初始化 OK}这里的代码我都是抄的NeHe教程上面的代码。6:现在可以捕获WM_CREATE消息了(方法:view-->classvizard -->messagesmaps:classname选**view,找到WM_CREATE,添加函数,编辑代码)。但是,还要先定义一个CClientDC*的成员,(方法:在classview中,找到**view类,鼠标右击,添加函数成员变量。类型:CClientDC*,名字:m_pDC)这个成员指向View窗口自己,是用来传递给SetupPixFormat(CDC*pDC)函数的,没别的意思。现在,来捕获WM_CREATE消息(),写上如下代码:int CTestGLInitialView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1) return -1;// TODO: Add your specialized creation code herem_pDC = new CClientDC(this);SetupPixFormat(m_pDC);HGLRC hrc = wglCreateContext(m_pDC->GetSafeHdc());wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);InitialGL();return 0;}当然,当窗口关闭的时候,还应该要释放一些资源。捕获WM_DESTROY消息,(方法:view-->classvizard-->messages maps:classname 选**view,找到WM_DESTROY,添加函数,编辑代码)写下如下代码:void CTestGLInitialView::OnDestroy(){CView::OnDestroy();// TODO: Add your message handler code hereHGLRC hrc = wglGetCurrentContext();wglMakeCurrent(NULL, 0);wglDeleteContext(hrc);delete m_pDC;}现在可以编译一下了,没有错误。7:现在,OpenGL的环境已经初始化差不多了。可以开始做图了,先定义一个作图的函数DrawScene(),写上如下的代码:BOOL CTestGLInitialView::DrawScene(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存glLoadIdentity(); // 重置当前的模型观察矩阵SwapBuffers(m_pDC->GetSafeHdc()); // 交换缓冲区return TRUE;}然后,要在OnDraw中,调用这个函数:void CTestGLInitialView::OnDraw(CDC* pDC){CTestGLInitialDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereDrawScene();}8:运行一下,黑色的背景出来了。9:这时,可以修改DrawScene()这个作图函数,作图。画出NeHe第3课的那个三角形和正方形来。写代码如下:BOOL CTestGLInitialView::DrawScene(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存glLoadIdentity(); // 重置当前的模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 单位,并移入屏幕 6.0glBegin(GL_TRIANGLES); // 绘制三角形glColor3f(1.0f, 0.0f, 0.0f);glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(-1.0f,-1.0f, 0.0f); // 左下glColor3f(0.0f, 0.0f, 1.0f);glVertex3f( 1.0f,-1.0f, 0.0f); // 右下glEnd(); // 三角形绘制结束glTranslatef(3.0f,0.0f,0.0f); // 右移3单位glColor3f(0.0f, 0.0f, 1.0f);glBegin(GL_QUADS); // 绘制正方形glVertex3f(-1.0f, 1.0f, 0.0f); // 左上glVertex3f( 1.0f, 1.0f, 0.0f); // 右上glVertex3f( 1.0f,-1.0f, 0.0f); // 左下glVertex3f(-1.0f,-1.0f, 0.0f); // 右下 glEnd();SwapBuffers(m_pDC->GetSafeHdc()); // 交换缓冲区return TRUE;}运行一下,发现图形没有出现,这个怎么回事呢。原来是因为还没有定义投影方式和视口。即用正交投影还是透视投影。定义投影,还要捕获WM_SIZE消息。写如下代码:void CTestGLInitialView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);// TODO: Add your message handler code hereif (0 == cy) // 防止被零除{ cy = 1; // 将Height设为1}glViewport(0, 0, cx, cy); // 重置当前的视口glMatrixMode(GL_PROJECTION); // 选择投影矩阵glLoadIdentity(); // 重置投影矩阵// 设置视口的大小gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵glLoadIdentity(); // 重置模型观察矩阵}再运行一下,图形已经出来了。以后,就可以在DrawScene()写任何画图的代码了,当窗口重绘的时候,都可以自动适应。如果要做一段可以运动的3D图画,可以再捕获WM_TIMER消息,通过在OnCreate的时候定义一个时钟,再配合一些变量,就可以做简单的动画了

在OpenGL编程中怎样解决屏幕闪烁的问题?

双缓冲还闪屏?你在Render里面用到了new或malloc之类的函数了么?或者是不断地打开一些图片资源之类的

opengl 在屏幕上输出 文字

这个问题的确很难,我当初查了无数资料,有这么几个函数,和一个顺序,你看一下为了保证你的程序可以输出汉字,要先用MultByteToWideChar函数把char转换到wchar_t字型里,要记得在最后面加上"".(先用malloc申请一个够长的wchar_t型的内存段,在计算长度的时候加上这个,因为一个汉字在char要两个单位,但是wchar_t就一个单位,这段代码通过检测字符的意义来判断这个字节的数据是不是独立的一个字符,以此来精确的计算空间.计算好的空间加1后才是要用的空间,因为后面要加一个""for(i=0;text[i]!=""&&i<length;++i) { if(IsDBCSLeadByte(text[i])) ++i; ++lan; })然后glGenList生成一个显示列表备用.接下来wglUseFontBitmapsW把字符的显示列表画出来保存在刚生成的显示列表里.这样就OK了,然后再选好位置glCallList 就画出来了.由于有的时候情况会比较复杂,记得管理好内存,不要造成泄露,记得及时删除用过的显示列表,因为字的转换比较快,所以没必要现写现转,但是为了避免转字的代码比较麻烦,最好写个函数用来在指定的位置上写字.在转子的过程中还要用到wgl的函数HDC描述句柄等,所以要包含头文件gdi.h连接gdi32.lib ,为了谨慎起见,最好在每次转换的时候检查一下HDC的设备像素格式,以免出了错却不知道是什么问题(有些情况HDC是不支持OpenGL的)这些函数的参数用法都可以在网上找到,在这里讲出来会非常麻烦.

java中如何调用OpenGL

JOGL是Java对OpenGLAPI绑定的开源项目并设计为采用Java开发的应用程序提供3D图形硬件支持。

如何设置魔兽争霸opengl模式

不知道你说的快是不是指游戏速度,这是不变的。但对于配置一般的机子来说(主要是显卡),用opengl模式确实更好,尤其是鼠标不会那么飘。

什么是OpeenGL

OpenGL目录 概述 Open GL现状 高级功能 OpenGL编程入门 OpenGL与DirectX的区别 概述 OpenGL - 高性能图形算法行业标准 OpenGLu2122 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGLu2122 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGLu2122 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。 OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。 在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。 OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。 OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如图一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。 目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫。[编辑本段]Open GL现状 Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。 今年08年正式公布OpenGL3.0版本。并且得到了,nv的支持,其官方网站上提供针对N卡的sdk下载。[编辑本段]高级功能 OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加API实现: * GLX - X11(包括透明的网络) * WGL - Microsoft Windows * AGL - Apple MacOS 另外,GLUT库能够以可移植的方式提供基本的窗口功能。[编辑本段]OpenGL编程入门 OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用glut 包.那样难以充分发挥 windows 的界面上的功能. 下面介绍如何在 VC++ 上进行 OpenGL 编程。 OpenGL 绘图的一般过程可以看作这样的,先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC)中画好图, 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (DC)中,实实在在地画出到屏幕上. 下面以画一条 Bezier 曲线为例,详细介绍VC++ 上 OpenGL编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 OpenGL 平台上的图形来。 一、产生程序框架 Test.dsw New Project | MFC Application Wizard (EXE) | "Test" | OK *注* : 加“”者指要手工敲入的字串 二、导入 Bezier 曲线类的文件 用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件: WorkSpace | ClassView | Test Classes| <右击弹出> New Class | Generic Class(不用MFC类) | "CBezierCurve" | OK 三、编辑好 Bezier 曲线类的定义与实现 写好下面两个文件: BezierCurve.h BezierCurve.cpp 四、设置编译环境: 1. 在 BezierCurve.h 和 TestView.h 内各加上: #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> 2. 在集成环境中 Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK 五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp ) 1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; 2. 处理 OnCreate():创建 OpenGL 的绘图设备。 OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有详细注释。 int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; myInitOpenGL(); return 0; } void CTestView::myInitOpenGL() { m_pDC = new CClientDC(this); //创建 DC ASSERT(m_pDC != NULL); if (!mySetupPixelFormat()) //设定绘图的位图格式,函数下面列出 return; m_hRC = wglCreateContext(m_pDC->m_hDC);//创建 RC wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联 } //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量 BOOL CTestView::mySetupPixelFormat() {//我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式 static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number PFD_DRAW_TO_WINDOW | // support window PFD_SUPPORT_OPENGL | // support OpenGL PFD_DOUBLEBUFFER, // double buffered PFD_TYPE_RGBA, // RGBA type 24, // 24-bit color depth 0, 0, 0, 0, 0, 0, // color bits ignored 0, // no alpha buffer 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accum bits ignored 32, // 32-bit z-buffer 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0 // layer masks ignored }; int pixelformat; if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 ) { MessageBox("ChoosePixelFormat failed"); return FALSE; } if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE) { MessageBox("SetPixelFormat failed"); return FALSE; } return TRUE; } 3. 处理 OnDestroy() void CTestView::OnDestroy() { wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC wglDeleteContext(m_hRC); //删除 RC if (m_pDC) delete m_pDC; //删除当前 View 拥有的 DC CView::OnDestroy(); } 4. 处理 OnEraseBkgnd() BOOL CTestView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default // return CView::OnEraseBkgnd(pDC); //把这句话注释掉,若不然,Window //会用白色北景来刷新,导致画面闪烁 return TRUE;//只要空返回即可。 } 5. 处理 OnDraw() void CTestView::OnDraw(CDC* pDC) { wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联 myDrawScene( ); //具体的绘图函数,在 RC 中绘制 SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而 //在屏幕上显示 wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图 } void CTestView::myDrawScene( ) { glClearColor(0.0f,0.0f,0.0f,1.0f);//设置背景颜色为黑色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated(0.0f,0.0f,-3.0f);//把物体沿(0,0,-1)方向平移 //以便投影时可见。因为缺省的视点在(0,0,0),只有移开 //物体才能可见。 //本例是为了演示平面 Bezier 曲线的,只要作一个旋转 //变换,可更清楚的看到其 3D 效果。 //下面画一条 Bezier 曲线 bezier_curve.myPolygon();//画Bezier曲线的控制多边形 bezier_curve.myDraw(); //CBezierCurve bezier_curve //是 CTestView 的成员变量 //具体的函数见附录 glPopMatrix(); glFlush(); //结束 RC 绘图 return; } 6. 处理 OnSize() void CTestView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//确认RC与当前DC关联 w=cx; h=cy; VERIFY(wglMakeCurrent(NULL,NULL));//确认DC释放RC } 7 处理 OnLButtonDown() void CTestView::OnLButtonDown(UINT nFlags, CPoint point) { CView::OnLButtonDown(nFlags, point); if(bezier_curve.m_N>MAX-1) { MessageBox("顶点个数超过了最大数MAX=50"); return; } //以下为坐标变换作准备 GetClientRect(&m_ClientRect);//获取视口区域大小 w=m_ClientRect.right-m_ClientRect.left;//视口宽度 w h=m_ClientRect.bottom-m_ClientRect.top;//视口高度 h //w,h 是CTestView的成员变量 centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置, centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原点 //centerx,centery 是 CTestView 的成员变量 GLdouble tmpx,tmpy; tmpx=scrx2glx(point.x);//屏幕上点坐标转化为OpenGL画图的规范坐标 tmpy=scry2gly(point.y); bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一个顶点 bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy; bezier_curve.m_N++;//顶点数加一 InvalidateRect(NULL,TRUE);//发送刷新重绘消息 } double CTestView::scrx2glx(int scrx) { return (double)(scrx-centerx)/double(h); } double CTestView::scry2gly(int scry) { } 附录: 1.CBezierCurve 的声明: (BezierCurve.h) class CBezierCurve { public: myPOINT2D m_Vertex[MAX];//控制顶点,以数组存储 //myPOINT2D 是一个存二维点的结构 //成员为Gldouble x,y int m_N; //控制顶点的个数 public: CBezierCurve(); virtual ~CBezierCurve(); void bezier_generation(myPOINT2D P[MAX],int level); //算法的具体实现 void myDraw();//画曲线函数 void myPolygon(); //画控制多边形 }; 2. CBezierCurve 的实现: (BezierCurve.cpp) CBezierCurve::CBezierCurve() { m_N=4; m_Vertex[0].x=-0.5f; m_Vertex[0].y=-0.5f; m_Vertex[1].x=-0.5f; m_Vertex[1].y=0.5f; m_Vertex[2].x=0.5f; m_Vertex[2].y=0.5f; m_Vertex[3].x=0.5f; m_Vertex[3].y=-0.5f; } CBezierCurve::~CBezierCurve() { } void CBezierCurve::myDraw() { bezier_generation(m_Vertex,LEVEL); } void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level) { //算法的具体描述,请参考相关书本 int i,j; level--; if(level<0)return; if(level==0) { glColor3f(1.0f,1.0f,1.0f); glBegin(GL_LINES); //画出线段 glVertex2d(P[0].x,P[0].y); glVertex2d(P[m_N-1].x,P[m_N-1].y); glEnd();//结束画线段 return; //递归到了最底层,跳出递归 } myPOINT2D Q[MAX],R[MAX]; for(i=0;i { Q.x=P.x; Q.y=P.y; } for(i=1;i<m_N;i++) { R[m_N-i].x=Q[m_N-1].x; R[m_N-i].y=Q[m_N-1].y; for(j=m_N-1;j>=i;j--) { Q[j].x=(Q[j-1].x+Q[j].x)/double(2); Q[j].y=(Q[j-1].y+Q[j].y)/double(2); } } R[0].x=Q[m_N-1].x; R[0].y=Q[m_N-1].y; bezier_generation(Q,level); bezier_generation(R,level); } void CBezierCurve::myPolygon() { glBegin(GL_LINE_STRIP); //画出连线段 glColor3f(0.2f,0.4f,0.4f); for(int i=0;i<m_N;i++) { glVertex2d(m_Vertex.x,m_Vertex.y); } glEnd();//结束画连线段 } [编辑本段]OpenGL与DirectX的区别 OpenGL 只是图形函数库。 DirectX 包含图形, 声音, 输入, 网络等模块。 OpenGL稳定,可跨平台使用。DirectX仅能用于Windows系列平台,包括Windows Mobile/CE系列以及XBOX/XBOX360。 ---------------------------------------------------------------------------------------------- 1995年至1996年,微软实行了一项新计划,以支持在Windows95上运行游戏,目标是把市场扩展到被任天堂和世嘉控制的游戏领域。然而,微软不想用已经在NT上提供的OpenGL技术。微软收购了Rendermorphics,Ltd.并得到他的被称作RealityLab的3D API。经重新整理,微软发布了新的3D API——Direct3D。 微软,推行Direct3D,冻结OpenGL! 微软当时拒绝了在Window95上支持OpenGL。不止如此,微软采取异常手段收回对OpenGL的MCD驱动接口的支持,以致硬件厂商不得不放弃已经进入最后测试的OpenGL驱动。微软的市场部门开始向游戏开发商、硬件厂商、新闻出版机构推销Direct3D,同时排斥OpenGL。 API之战! Silicon Graphics和很多OpenGL用户都依赖OpenGL创新且高性能的技术。但很明显微软打算用Direct3D代替OpenGL,尽管D3D有很多问题而且不能像OpenGL那样被硬件厂商扩展。Silicon Graphics决定在1996 SIGGRAPH会议上作一项演示。演示证明OpenGL至少和D3D一样快,从而驳倒微软的市场论调。因为OpenGL是业界公认标准,比D3D功能丰富,而且图像质量要高一些,所以演示在计算机图形和游戏开发社区导致了激烈论战。 游戏开发者要求OpenGL和D3D站在同等地位! 当技术和市场问题暴露,强烈的支持OpenGL行动开始了。Doom的开发者John Carmack声明拒绝D3D,Chris Hecker在游戏开发杂志上发表了两套API的全面分析,移微软应放弃D3D为结论。游戏开发者先后两次向微软递交请愿书。第一次由56名首席游戏开发者要求微软发行OpenGL MCD驱动,但未成功,因为会让OpenGL与D3D竞争。第二次的公开信由254人签名开始,截止时达到1400人。微软的回答仍是重申旧市场立场。尽管请愿者清楚的要求两套API同等竞争以促进发展,微软却以增加D3D的投资、更加减少OpenGL的投资为回应。 Fahrenheit——D3D与OpenGL的合并? Silicon Graphics,Microsoft, HP,Intel达成协议联合开发下一代3D API——Fahrenheit。但不了了之,因为微软的打算是把OpenGL的技术用到D3D里并且以此之名驱除OpenGL的威胁。(估计DirectX 8 Graphics即是剩下微软独自开发的Fahrenheit,吸收了OpenGL的很多东西。) OpenGL豪气不减当年! OpenGL依然是唯一能与微软单独控制的D3D对立的API,尽管Silicon Graphics不再以任何微软不能接受的方式推行OpenGL。游戏开发这是独立的,并且很多关键人物在用OpenGL,因此,硬件厂商正努力提高对其支持。D3D仍不能支持高端图像和专业应用,而OpenGL主宰着这些土地。在开放原码社区,Mesa项目正提供独立于微软的OpenGL驱动。 译者注:表面上好像D3D比OpenGL支持更多的功能,其实由于D3D不支持硬件扩展,如硬件全景阴影,硬件渲染顺序无关半透明材质等新技术根本无法使用,而D3D(特指D3D8)本身提供的功能只有一小部分能在使用HAL且硬件不支持时模拟,你要用大量代码分析硬件能力和采取不同策略

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:WINNTSYSTEM32目录下(这里假定用户将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 OpenGL是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家 世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通 用共享的开放式三维图形标准。目前,包括Microsoft、SGI、IBM、DEC、SUN、 HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL 为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image 和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软 件ProEngineer、GIS软ARC/INFO等等。值得一提的是,随着Microsoft公司在 Windows NT和最新的Windows 95中提供了OpenGL标准及OpenGL三维图形加速卡 (如北京黎明电子技术公司的AGC-3D系列三维图形加速卡)的推出,OpenGL将 在微机中有广泛地应用,同时也为广大用户提供了在微机上使用以前只能在高 性能图形工作站上运行的各种软件的机会。 OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统, 以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以 与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算 法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能: 1) 建模 OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提 供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面 (如Bezier、Nurbs等曲线或曲面)绘制函数。 2) 变换 OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、 旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透 视投影两种变换。其变换方法与机器人运动学中的坐标变换方法完全一 致,有利于减少算法的运行时间,提高三维图形的显示速度。 3) 颜色模式设置 OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。 4) 光照和材质设置 OpenGL光有辐射光(Emitted Light)、环境光 (Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。 材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光 的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。 5) 纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真 地表达物体表面细节。 6) 位图显示和图象增强 图象功能除了基本的拷贝和像素读写外,还提供 融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。 以上三条可是被仿真物更具真实感,增强图形显示的效果。 7) 双缓存(Double Buffering)动画 双缓存即前台缓存和后台缓存,简而言 之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。 此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等 特殊效果。从而实现了消隐算法。

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:WINNTSYSTEM32目录下(这里假定用户将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

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:WINNTSYSTEM32目录下(这里假定用户将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(FacOpenGL是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家 世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通 用共享的开放式三维图形标准。目前,包括Microsoft、SGI、IBM、DEC、SUN、 HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL 为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image 和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软 件ProEngineer、GIS软ARC/INFO等等。值得一提的是,随着Microsoft公司在 Windows NT和最新的Windows 95中提供了OpenGL标准及OpenGL三维图形加速卡 (如北京黎明电子技术公司的AGC-3D系列三维图形加速卡)的推出,OpenGL将 在微机中有广泛地应用,同时也为广大用户提供了在微机上使用以前只能在高 性能图形工作站上运行的各种软件的机会。 OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统, 以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以 与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算 法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能: 1) 建模 OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提 供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面 (如Bezier、Nurbs等曲线或曲面)绘制函数。 2) 变换 OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、 旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透 视投影两种变换。其变换方法与机器人运动学中的坐标变换方法完全一 致,有利于减少算法的运行时间,提高三维图形的显示速度。 3) 颜色模式设置 OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。 4) 光照和材质设置 OpenGL光有辐射光(Emitted Light)、环境光 (Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。 材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光 的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。 5) 纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真 地表达物体表面细节。 6) 位图显示和图象增强 图象功能除了基本的拷贝和像素读写外,还提供 融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。 以上三条可是被仿真物更具真实感,增强图形显示的效果。 7) 双缓存(Double Buffering)动画 双缓存即前台缓存和后台缓存,简而言 之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。 此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等 特殊效果。从而实现了消隐算法。

opengl在windows系统下编程,如何实现在窗口外绘图?

二、生成OpenGL程序的基本步骤和条件   本文将给出一个例子,这个例子是一个用OpenGL显示图像的Windows程序,通过这个程序我们也可以知道用OpenGL编程的基本要求。我们知道,GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令需要传给它一个DC,与GDI不同,OpenGL使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,所有在此线程中的OpenGL命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。本例将首先产生一个OpenGL RC并使之成为当前RC,分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。   一、首先创建工程   用AppWizard产生一个EXE文件,选择工程目录,并在工程名字中输入"GLSample一",保持其他的不变;第一步、选单文档(SDI);第二步、不支持数据库;第三步、不支持OLE;第四步、不选中浮动工具条、开始状态条、打印和预览支持、帮助支持的复选框(选中也可以,本文只是说明最小要求),选中三维控制(三D Controls);第五步、选中产生源文件注释并使用MFC为共享动态库;第六步、保持缺省选择。按Finish结束,工程创建完毕。   二、将此工程所需的OpenGL文件 和库加入到工程中   在工程菜单中,选择"Build"下的"Settings"项。单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"OpenGL三二.lib glu三二.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。然后打开文件"stdafx.h",将下列语句插入到文件中(划下划线的语句为所加语句):   #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers   #include // MFC core and standard components   #include // MFC extensions   #include   #include   #ifndef _AFX_NO_AFXCMN_SUPPORT   #include // MFC support for Windows 95 Common Controls   #endif // _AFX_NO_AFXCMN_SUPPORT   三、改写OnPreCreate函数并给视 类添加成员函数和成员变量   OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和 WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。把OnPreCreate改写成如下所示:    BOOL CGLSample一View::PreCr- eateWindow(CREATESTRUCT& cs)   {    cs.style |= (WS_CLIPCHI- LDREN | WS_CLIPSIBLINGS);    return CView::PreCreate- Window(cs);   }    产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将有对这些参数的设置。我们先在CGLSample一View的类中添加一个保护型的成员函数BOOL SetWindowPixel-Format(HDC hDC)(用鼠标右键添加),并编辑其中的代码,见程序一。   BOOL CGLSample一View::SetWindowPixelFormat(HDC hDC)   {    PIXELFORMATDESCRIPTOR pixelDesc;   pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);    pixelDesc.nVersion = 一;    pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |    PFD_DRAW_TO_BITMAP |    PFD_SUPPORT_OpenGL |    PFD_SUPPORT_GDI |    PFD_STEREO_DONTCARE;    pixelDesc.iPixelType = PFD_TYPE_RGBA;    pixelDesc.cColorBits = 三二;    pixelDesc.cRedBits = 吧;    pixelDesc.cRedShift = 一陆;    pixelDesc.cGreenBits = 吧;    pixelDesc.cGreenShift = 吧;    pixelDesc.cBlueBits = 吧;    pixelDesc.cBlueShift = 0;    pixelDesc.cAlphaBits = 0;    pixelDesc.cAlphaShift = 0;    pixelDesc.cAccumBits = 陆四;    pixelDesc.cAccumRedBits = 一陆;    pixelDesc.cAccumGreenBits = 一陆;    pixelDesc.cAccumBlueBits = 一陆;    pixelDesc.cAccumAlphaBits = 0;    pixelDesc.cDepthBits = 三二;    pixelDesc.cStencilBits = 吧;    pixelDesc.cAuxBuffers = 0;    pixelDesc.iLayerType = PFD_MAIN_PLANE;    pixelDesc.bReserved = 0;    pixelDesc.dwLayerMask = 0;    pixelDesc.dwVisibleMask = 0;    pixelDesc.dwDamageMask = 0;       m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);    if (m_GLPixelIndex==0) // Lets choose a default index.    { m_GLPixelIndex = 一;    if (DescribePixelFormat(hDC, m_GLPixelIndex,    sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)    { return FALSE;    }    }    if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE)    { return FALSE;    }    return TRUE;   }   接着用鼠标右键在CGLSample一View中添加保护型的成员变量:   int m_GLPixelIndex;   四、用ClassWizard添加WM_CREATE的消息处理函数OnCreate   添加OnCreate函数后如程序一所示。   至此,OpenGL工程的基本框架就建好了。但如果你现在运行此工程,则它与一般的MFC程序看起来没有什么两样。   5、代码解释   现在我们可以看一看Describe-PixelFormat提供有哪几种像素格式,并对代码进行一些解释:   PIXELFORMATDESCRIPTOR包括了定义像素格式的全部信息。    DWFlags定义了与像素格式兼容的设备和接口。   通常的OpenGL发行版本并不包括所有的标志(flag)。wFlags能接收以下标志:   PFD_DRAW_TO_WINDOW 使之能在窗口或者其他设备窗口画图;   PFD_DRAW_TO_BITMAP 使之能在内存中的位图画图;   PFD_SUPPORT_GDI 使之能调用GDI函数(注:如果指定了PFD_DOUBLEBUFFER,这个选项将无效);   PFD_SUPPORT_OpenGL 使之能调用OpenGL函数;   PFD_GENERIC_FORMAT 假如这种象素格式由Windows GDI函数库或由第三方硬件设备驱动程序支持,则需指定这一项;   PFD_NEED_PALETTE 告诉缓冲区是否需要调色板,本程序假设颜色是使用二四或 三二位色,并且不会覆盖调色板;   PFD_NEED_SYSTEM_PALETTE 这个标志指明缓冲区是否把系统调色板当作它自身调色板的一部分;   PFD_DOUBLEBUFFER 指明使用了双缓冲区(注:GDI不能在使用了双缓冲区的窗口中画图);   PFD_STEREO 指明左、右缓冲区是否按立体图像来组织。   PixelType定义显示颜色的方法。PFD_TYPE_RGBA意味着每一位(bit)组代表着红、绿、蓝各分量的值。PFD_TYPE_COLORINDEX 意味着每一位组代表着在彩色查找表中的索引值。本例都是采用了PFD_TYPE_RGBA方式。   ● cColorBits定义了指定一个颜色的位数。对RGBA来说,位数是在颜色中红、绿、蓝各分量所占的位数。对颜色的索引值来说,指的是表中的颜色数。   ● cRedBits、cGreenBits、cBlue-Bits、cAlphaBits用来表明各相应分量所使用的位数。   ● cRedShift、cGreenShift、cBlue-Shift、cAlphaShift用来表明各分量从颜色开始的偏移量所占的位数。   一旦初始化完我们的结构,我们就想知道与要求最相近的系统象素格式。我们可以这样做:      m_hGLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc);      ChoosePixelFormat接受两个参数:一个是hDc,另一个是一个指向PIXELFORMATDESCRIPTOR结构的指针&pixelDesc;该函数返回此像素格式的索引值。如果返回0则表示失败。假如函数失败,我们只是把索引值设为一并用DescribePixelFormat得到像素格式描述。假如你申请一个没得到支持的像素格式,则Choose-PixelFormat将会返回与你要求的像素格式最接近的一个值。一旦我们得到一个像素格式的索引值和相应的描述,我们就可以调用SetPixelFormat设置像素格式,并且只需设置一次。   现在像素格式已经设定,我们下一步工作是产生绘制环境(RC)并使之成为当前绘制环境。在CGLSample一View中加入一个保护型的成员函数BOOL CreateViewGLContext(HDC hDC),使之如下所示:   BOOL CGLSample一View::CreateView GLContext(HDC hDC)   { m_hGLContext = wglCreate Context(hDC);//用当前DC产生绘制环境(RC)    if (m_hGLContext == NULL)    { return FALSE;    }    if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)    { return FALSE;    }    return TRUE;   }   并加入一个保护型的成员变量HGLRC m_hGLContext;HGLRC是一个指向rendering context的句柄。   在OnCreate函数中调用此函数:   int CGLSample一View::OnCreate (LPCREATESTRUCT lpCreateStruct)   {   if (CView::OnCreate(lpCreateS truct) == -一)    return -一;    HWND hWnd = GetSafeHwnd();    HD

介绍常用的OpenGL的函数(定义+功能)

OpenGL 函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图1可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。  1.OpenGL核心库  核心库包含有115个函数,函数名的前缀为gl。  这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。  核心库中的函数主要可以分为以下几类函数:  (1)绘制基本几何图元的函数。如绘制图元的函数glBegain()、glEnd()、glNormal*()、glVertex*()。  (2)矩阵操作、几何变换和投影变换的函数。如矩阵入栈函数glPushMatrix()、矩阵出栈函数glPopMatrix()、装载矩阵函数glLoadMatrix()、矩阵相乘函数glMultMatrix(),当前矩阵函数 glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和 glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport()等等。  (3)颜色、光照和材质的函数。如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial()等等。  (4)显示列表函数、主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()。  (5)纹理映射函数,主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、 设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()等。  (6)特殊效果函数。融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。  (7)光栅化、象素操作函数。如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel()等。  (8)选择与反馈函数。主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()等。  (9)曲线与曲面的绘制函数。生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。  (10)状态设置与查询函数。主要有glGet*()、glEnable()、glGetError()等。  2.OpenGL实用库The OpenGL Utility Library (GLU)  包含有43个函数,函数名的前缀为glu。  OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由 glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。  主要包括了以下几种:  (1)辅助纹理贴图函数,有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。  (2)坐标转换和投影变换函数,定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和 gluUnProject()等等。  (3)多边形镶嵌工具,有gluNewTess()、 gluDeleteTess()、gluTessCallback()、gluBeginPolygon() gluTessVertex()、gluNextContour()、gluEndPolygon()等等。  (4)二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。  (5)非均匀有理B样条绘制工具,主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer()、 gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、 gluNurbsProperty()等函数。  (6)错误反馈工具,获取出错信息的字符串gluErrorString()。  3.OpenGL辅助库  包含有31个函数,函数名前缀为aux。  这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。此函数由glaux.dll来负责解释执行。创建aux库是为了学习和编写 OpenGL程序,它更像是一个用于测试创意的预备基础接管。Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。  辅助库函数主要包括以下几类:  (1)窗口初始化和退出函数,auxInitDisplayMode()和auxInitPosition()。  (2)窗口处理和时间输入函数,auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。  (3)颜色索引装入函数,auxSetOneColor()。  (4)三维物体绘制函数。包括了两种形式网状体和实心体,如绘制立方体auxWireCube()和 auxSolidCube()。这里以网状体为例,长方体auxWireBox()、环形圆纹面auxWireTorus()、圆柱 auxWireCylinder()、二十面体auxWireIcosahedron()、八面体auxWireOctahedron()、四面体 auxWireTetrahedron()、十二面体auxWireDodecahedron()、圆锥体auxWireCone()和茶壶 auxWireTeapot()。  (5)背景过程管理函数auxIdleFunc()。  (6)程序运行函数auxMainLoop()。  4.OpenGL工具库 OpenGL Utility Toolkit  包含大约30多个函数,函数名前缀为glut。  glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。  这部分函数主要包括:  (1)窗口操作函数,窗口初始化、窗口大小、窗口位置等函数glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等。  (2)回调函数。响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()。  (3)创建复杂的三维物体。这些和aux库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。在此不再叙述。  (4)菜单函数。创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。  (5)程序运行函数,glutMainLoop()。

在opengl中编写的程序没有错误,可是就是不显示图形

void CGeneric2View::OnDrawBezierCurve(){ // TODO: 在此添加命令处理程序代码 HWND hWnd=GetSafeHwnd(); HDC hDC=::GetDC(hWnd); wglMakeCurrent(hDC,hglrc); drawb_curve(); wglMakeCurrent(NULL,NULL); SwapBuffers(hDC);}我怎么没有看到HGLRC的赋值过程?wglCreateContext(hDC);

Delphi中有没有OpenGL现成的控件

GLPanel也能用,下面是源码,给大家共享: unit GLPanel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,OpenGL,Printers; type TGLPanel = class(TCustomPanel) private { Private declarations } //DC: HDC; RC: HGLRC; procedure initDC; procedure initGL; procedure PreparePixelFormat(var DC: HDC); protected { Protected declarations } FOnPaint:TNotifyEvent; FOnInit:TNotifyEvent; FOnPreInit:TNotifyEvent; FOnResize:TNotifyEvent; procedure Paint;override; procedure Resize;override; procedure WMDestroy(var Msg: TWMDestroy);message WM_DESTROY; procedure WMCreate(var Msg:TWMCreate); message WM_CREATE; public { Public declarations } DC: HDC; constructor Create(Owner:TComponent);override; procedure SaveToBMPFile(FileName: String); procedure PrintIt; published { Published declarations } property Alignment; property Align; property DragCursor; property DragMode; property Enabled; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDrag; property OnEnter; property OnExit; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDrag; property OnInit:TNotifyEvent read FOnInit write FOnInit; property OnPreInit:TNotifyEvent read FOnPreInit write FOnPreInit; property OnResize:TNotifyEvent read FOnResize write FOnResize; property OnPaint:TNotifyEvent read FOnPaint write FOnPaint; end; procedure Register; implementation procedure Register; begin RegisterComponents("Samples", [TGLPanel]); end; //--------------------------------------------- constructor TGLPanel.Create; begin inherited; end; //--------------------------------------------- procedure TGLPanel.WMDestroy(var Msg: TWMDestroy); begin wglMakeCurrent(0, 0); wglDeleteContext(RC); ReleaseDC(Handle, DC); end; //--------------------------------------------------- procedure TGLPanel.initDC; begin DC := GetDC(Handle); PreparePixelFormat(DC); end; procedure TGLPanel.initGL; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); gluPerspective(45.0, self.ClientWidth/self.ClientHeight, 1.0, 500.0); //glOrtho(-1, 1, -1, 1, -1, 50); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glShadeModel(GL_SMOOTH); gluLookAt(0, 0, 6, 0, 0, 0, 0, 1, 0); SwapBuffers(DC); end; //--------------------------------------------- procedure TGLPanel.PreparePixelFormat(var DC: HDC); var PFD : TPixelFormatDescriptor; ChosenPixelFormat : Integer; begin FillChar(PFD, SizeOf(TPixelFormatDescriptor), 0); with PFD do begin nSize := SizeOf(TPixelFormatDescriptor); nVersion := 1; dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType := PFD_TYPE_RGBA; cColorBits := 16; // 16位颜色 cDepthBits := 32; // 32位深度缓冲 iLayerType := PFD_MAIN_PLANE; { Should be 24, but we must allow for the clunky WKU boxes } end; ChosenPixelFormat := ChoosePixelFormat(DC, @PFD); if ChosenPixelFormat = 0 then Raise Exception.Create("ChoosePixelFormat failed!"); SetPixelFormat(DC, ChosenPixelFormat, @PFD); end; procedure TGLPanel.WMCreate(var Msg:TWMCreate); begin //在这里做初始化工作 //修改DC的象素格式,使之支持OpenGL绘制 initDC; RC := wglCreateContext(DC); if Assigned(FOnInit) then begin if (wglMakeCurrent(DC,RC)=false) then ShowMessage("wglMakeCurrent:" + IntToStr (GetLastError)); FOnInit(self); end; wglMakeCurrent(DC, RC); //初始化GL绘制系统 initGL; end; //--------------------------------------------------------------------------- procedure TGLPanel.Paint; begin //TCustomPanel::Paint(); if Assigned(FOnPaint) then begin wglMakeCurrent(DC,RC); FOnPaint(self); SwapBuffers(DC); end; end; //--------------------------------------------------------------------------- procedure TGLPanel.Resize; begin inherited; if Assigned(FOnResize) then begin wglMakeCurrent(DC,RC); glViewport(0,0,ClientWidth,ClientHeight); FOnResize(self); end; end; procedure TGLPanel.SaveToBMPFile(FileName: String); var BitMap : TBitmap; begin Bitmap:= TBitmap.Create; BitMap.Height := Height; BitMap.Width := Width; BringToFront; Paint; BitMap.Canvas.CopyRect(ClientRect ,Canvas,ClientRect); BitMap.SaveToFile(FileName); //delete BitMap; end; procedure TGLPanel.PrintIt; var Bitmap:TBitMap; XPixelsPerInch,YPixelsPerInch:integer; Rect:TRECT; PrintDlg:TPrintDialog; begin PrintDlg:=TPrintDialog.Create(self); if PrintDlg.Execute then begin BitMap := TBitmap.Create; BitMap.Height:= Height; BitMap.Width := Width; BringToFront; Paint; BitMap.Canvas.CopyRect(ClientRect,Canvas,ClientRect); XPixelsPerInch:=GetDeviceCaps(Printer.Handle,LOGPIXELSX); YPixelsPerInch:=GetDeviceCaps(Printer.Handle,LOGPIXELSY); Rect.left :=round(0.18*XPixelsPerInch); Rect.top :=round(0.18*YPixelsPerInch); //根据需要调整right/bottom可以达到按比例打印或打满整纸等效果 //必要时可使用GetDeviceCaps(Printer.Handle,HORZRES/VERTRES) //查询相关信息 Rect.right :=BitMap.Width+Rect.left; Rect.bottom:=BitMap.Height+Rect.right; Printer.BeginDoc; Printer.Canvas.CopyRect(Rect,BitMap.Canvas,ClientRect); Printer.EndDoc; end; //if(dlg.execute) PrintDlg.Destroy; end; end.

如何在vc++环境下建立OpenGL程序

你说的是MFC还是WIN32??我假设你的编译器是vc++6.01.加入头文件#include <glglut.h>#include <glgl.h>#include <glglaux.h>2.alt+f7在link选项卡添加opengl32.lib glu32.lib glaux.lib就这样了吧。关键不知道你想建立什么项目,这很让人纠结

vb OpenGL 程序修改

你图片框的AutoRedraw有没有设置成true?

关于魔兽用opengl模式玩!

  概述  [编辑本段]  OpenGL 是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。  OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数组。  在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。  OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了 OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。  OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如图一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。  目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的2.0版本面世,在其中加入了很多类似于DirectX中可编程单元的设计,但厂商的用户的认知程度并不高,未来的OpenGL发展前景迷茫。  Open GL现状  [编辑本段]  Open GL仍然是唯一能够取代微软对3D图形技术的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已经不再以任何让微软不悦的方式推广Open GL,因而它存在较高的风险。游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。最后,开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持。  高级功能  [编辑本段]  OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加API实现:  * GLX - X11(包括透明的网络)  * WGL - Microsoft Windows  * AGL - Apple MacOS  另外,GLUT库能够以可移植的方式提供基本的窗口功能。  OpenGL编程入门  [编辑本段]  OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用glut 包.那样难以充分发挥 windows 的界面上的功能.  下面介绍如何在 VC++ 上进行 OpenGL 编程。 OpenGL 绘图的一般过程可以看作这样的,先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC)中画好图, 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (DC)中,实实在在地画出到屏幕上.  下面以画一条 Bezier 曲线为例,详细介绍VC++ 上 OpenGL编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 OpenGL 平台上的图形来。  一、产生程序框架 Test.dsw  New Project | MFC Application Wizard (EXE) | "Test" | OK  *注* : 加“”者指要手工敲入的字串  二、导入 Bezier 曲线类的文件  用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件:  WorkSpace | ClassView | Test Classes| <右击弹出> New Class | Generic Class(不用MFC类) | "CBezierCurve" | OK  三、编辑好 Bezier 曲线类的定义与实现  写好下面两个文件:  BezierCurve.h BezierCurve.cpp  四、设置编译环境:  1. 在 BezierCurve.h 和 TestView.h 内各加上:  #include <GL/gl.h>  #include <GL/glu.h>  #include <GL/glaux.h>  2. 在集成环境中  Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK  五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp )  1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格  cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;  2. 处理 OnCreate():创建 OpenGL 的绘图设备。  OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有详细注释。  int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)  {  if (CView::OnCreate(lpCreateStruct) == -1)  return -1;  myInitOpenGL();  return 0;  }  void CTestView::myInitOpenGL()  {  m_pDC = new CClientDC(this); //创建 DC  ASSERT(m_pDC != NULL);  if (!mySetupPixelFormat()) //设定绘图的位图格式,函数下面列出  return;  m_hRC = wglCreateContext(m_pDC->m_hDC);//创建 RC  wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联  } //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量  BOOL CTestView::mySetupPixelFormat()  {//我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式  static PIXELFORMATDESCRIPTOR pfd =  {  sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd  1, // version number  PFD_DRAW_TO_WINDOW | // support window  PFD_SUPPORT_OPENGL | // support OpenGL  PFD_DOUBLEBUFFER, // double buffered  PFD_TYPE_RGBA, // RGBA type  24, // 24-bit color depth  0, 0, 0, 0, 0, 0, // color bits ignored  0, // no alpha buffer  0, // shift bit ignored  0, // no accumulation buffer  0, 0, 0, 0, // accum bits ignored  32, // 32-bit z-buffer  0, // no stencil buffer  0, // no auxiliary buffer  PFD_MAIN_PLANE, // main layer  0, // reserved  0, 0, 0 // layer masks ignored  };  int pixelformat;  if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )  {  MessageBox("ChoosePixelFormat failed");  return FALSE;  }  if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)  {  MessageBox("SetPixelFormat failed");  return FALSE;  }  return TRUE;  }  3. 处理 OnDestroy()  void CTestView::OnDestroy()  {  wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC  wglDeleteContext(m_hRC); //删除 RC  if (m_pDC)  delete m_pDC; //删除当前 View 拥有的 DC  CView::OnDestroy();  }  4. 处理 OnEraseBkgnd()  BOOL CTestView::OnEraseBkgnd(CDC* pDC)  {  // TODO: Add your message handler code here and/or call default  // return CView::OnEraseBkgnd(pDC);  //把这句话注释掉,若不然,Window  //会用白色北景来刷新,导致画面闪烁  return TRUE;//只要空返回即可。  }  5. 处理 OnDraw()  void CTestView::OnDraw(CDC* pDC)  {  wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 与当前 DC 相关联  myDrawScene( ); //具体的绘图函数,在 RC 中绘制  SwapBuffers(m_pDC->m_hDC);//把 RC 中所绘传到当前的 DC 上,从而  //在屏幕上显示  wglMakeCurrent(m_pDC->m_hDC,NULL);//释放 RC,以便其它 DC 进行绘图  }  void CTestView::myDrawScene( )  {  glClearColor(0.0f,0.0f,0.0f,1.0f);//设置背景颜色为黑色  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  glPushMatrix();  glTranslated(0.0f,0.0f,-3.0f);//把物体沿(0,0,-1)方向平移  //以便投影时可见。因为缺省的视点在(0,0,0),只有移开  //物体才能可见。  //本例是为了演示平面 Bezier 曲线的,只要作一个旋转  //变换,可更清楚的看到其 3D 效果。  //下面画一条 Bezier 曲线  bezier_curve.myPolygon();//画Bezier曲线的控制多边形  bezier_curve.myDraw(); //CBezierCurve bezier_curve  //是 CTestView 的成员变量  //具体的函数见附录  glPopMatrix();  glFlush(); //结束 RC 绘图  return;  }  6. 处理 OnSize()  void CTestView::OnSize(UINT nType, int cx, int cy)  {  CView::OnSize(nType, cx, cy);  VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//确认RC与当前DC关联  w=cx;  h=cy;  VERIFY(wglMakeCurrent(NULL,NULL));//确认DC释放RC  }  7 处理 OnLButtonDown()  void CTestView::OnLButtonDown(UINT nFlags, CPoint point)  {  CView::OnLButtonDown(nFlags, point);  if(bezier_curve.m_N>MAX-1)  {  MessageBox("顶点个数超过了最大数MAX=50");  return;  }  //以下为坐标变换作准备  GetClientRect(&m_ClientRect);//获取视口区域大小  w=m_ClientRect.right-m_ClientRect.left;//视口宽度 w  h=m_ClientRect.bottom-m_ClientRect.top;//视口高度 h  //w,h 是CTestView的成员变量  centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置,  centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原点  //centerx,centery 是 CTestView 的成员变量  GLdouble tmpx,tmpy;  tmpx=scrx2glx(point.x);//屏幕上点坐标转化为OpenGL画图的规范坐标  tmpy=scry2gly(point.y);  bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一个顶点  bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy;  bezier_curve.m_N++;//顶点数加一  InvalidateRect(NULL,TRUE);//发送刷新重绘消息  }  double CTestView::scrx2glx(int scrx)  {  return (double)(scrx-centerx)/double(h);  }  double CTestView::scry2gly(int scry)  {  }  附录:  1.CBezierCurve 的声明: (BezierCurve.h)  class CBezierCurve  {  public:  myPOINT2D m_Vertex[MAX];//控制顶点,以数组存储  //myPOINT2D 是一个存二维点的结构  //成员为Gldouble x,y  int m_N; //控制顶点的个数  public:  CBezierCurve();  virtual ~CBezierCurve();  void bezier_generation(myPOINT2D P[MAX],int level);  //算法的具体实现  void myDraw();//画曲线函数  void myPolygon(); //画控制多边形  };  2. CBezierCurve 的实现: (BezierCurve.cpp)  CBezierCurve::CBezierCurve()  {  m_N=4;  m_Vertex[0].x=-0.5f;  m_Vertex[0].y=-0.5f;  m_Vertex[1].x=-0.5f;  m_Vertex[1].y=0.5f;  m_Vertex[2].x=0.5f;  m_Vertex[2].y=0.5f;  m_Vertex[3].x=0.5f;  m_Vertex[3].y=-0.5f;  }  CBezierCurve::~CBezierCurve()  {  }  void CBezierCurve::myDraw()  {  bezier_generation(m_Vertex,LEVEL);  }  void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level)  { //算法的具体描述,请参考相关书本  int i,j;  level--;  if(level<0)return;  if(level==0)  {  glColor3f(1.0f,1.0f,1.0f);  glBegin(GL_LINES); //画出线段  glVertex2d(P[0].x,P[0].y);  glVertex2d(P[m_N-1].x,P[m_N-1].y);  glEnd();//结束画线段  return; //递归到了最底层,跳出递归  }  myPOINT2D Q[MAX],R[MAX];  for(i=0;i {  Q.x=P.x;  Q.y=P.y;  }  for(i=1;i<m_N;i++)  {  R[m_N-i].x=Q[m_N-1].x;  R[m_N-i].y=Q[m_N-1].y;  for(j=m_N-1;j>=i;j--)  {  Q[j].x=(Q[j-1].x+Q[j].x)/double(2);  Q[j].y=(Q[j-1].y+Q[j].y)/double(2);  }  }  R[0].x=Q[m_N-1].x;  R[0].y=Q[m_N-1].y;  bezier_generation(Q,level);  bezier_generation(R,level);  }  void CBezierCurve::myPolygon()  {  glBegin(GL_LINE_STRIP); //画出连线段  glColor3f(0.2f,0.4f,0.4f);  for(int i=0;i<m_N;i++)  {  glVertex2d(m_Vertex.x,m_Vertex.y);  }  glEnd();//结束画连线段  }  OpenGL与DirectX的区别  [编辑本段]  OpenGL 只是图形函数库。  DirectX 包含图形, 声音, 输入, 网络等模块。  OpenGL稳定,可跨平台使用。DirectX仅能用于Windows系列平台,包括Windows Mobile/CE系列以及XBOX/XBOX360。  ----------------------------------------------------------------------------------------------  1995年至1996年,微软实行了一项新计划,以支持在Windows95上运行游戏,目标是把市场扩展到被任天堂和世嘉控制的游戏领域。然而,微软不想用已经在NT上提供的OpenGL技术。微软收购了Rendermorphics,Ltd.并得到他的被称作RealityLab的3D API。经重新整理,微软发布了新的3D API——Direct3D。  微软,推行Direct3D,冻结OpenGL!  微软当时拒绝了在Window95上支持OpenGL。不止如此,微软采取异常手段收回对OpenGL的MCD驱动接口的支持,以致硬件厂商不得不放弃已经进入最后测试的OpenGL驱动。微软的市场部门开始向游戏开发商、硬件厂商、新闻出版机构推销Direct3D,同时排斥OpenGL。  API之战!  Silicon Graphics和很多OpenGL用户都依赖OpenGL创新且高性能的技术。但很明显微软打算用Direct3D代替OpenGL,尽管D3D有很多问题而且不能像OpenGL那样被硬件厂商扩展。Silicon Graphics决定在1996 SIGGRAPH会议上作一项演示。演示证明OpenGL至少和D3D一样快,从而驳倒微软的市场论调。因为OpenGL是业界公认标准,比D3D功能丰富,而且图像质量要高一些,所以演示在计算机图形和游戏开发社区导致了激烈论战。  游戏开发者要求OpenGL和D3D站在同等地位!  当技术和市场问题暴露,强烈的支持OpenGL行动开始了。Doom的开发者John Carmack声明拒绝D3D,Chris Hecker在游戏开发杂志上发表了两套API的全面分析,移微软应放弃D3D为结论。游戏开发者先后两次向微软递交请愿书。第一次由56名首席游戏开发者要求微软发行OpenGL MCD驱动,但未成功,因为会让OpenGL与D3D竞争。第二次的公开信由254人签名开始,截止时达到1400人。微软的回答仍是重申旧市场立场。尽管请愿者清楚的要求两套API同等竞争以促进发展,微软却以增加D3D的投资、更加减少OpenGL的投资为回应。  Fahrenheit——D3D与OpenGL的合并?  Silicon Graphics,Microsoft, HP,Intel达成协议联合开发下一代3D API——Fahrenheit。但不了了之,因为微软的打算是把OpenGL的技术用到D3D里并且以此之名驱除OpenGL的威胁。(估计 DirectX 8 Graphics即是剩下微软独自开发的Fahrenheit,吸收了OpenGL的很多东西。)  OpenGL豪气不减当年!  OpenGL依然是唯一能与微软单独控制的D3D对立的API,尽管Silicon Graphics不再以任何微软不能接受的方式推行OpenGL。游戏开发这是独立的,并且很多关键人物在用OpenGL,因此,硬件厂商正努力提高对其支持。D3D仍不能支持高端图像和专业应用,而OpenGL主宰着这些土地。在开放原码社区,Mesa项目正提供独立于微软的OpenGL驱动。  译者注:表面上好像D3D比OpenGL支持更多的功能,其实由于D3D不支持硬件扩展,如硬件全景阴影,硬件渲染顺序无关半透明材质等新技术根本无法使用,而D3D(特指D3D8)本身提供的功能只有一小部分能在使用HAL且硬件不支持时模拟,你要用大量代码分析硬件能力和采取不同策略

GLFWError #65542 Happen,WGL;The driver does not a

GLFWError #65542 Happen,WGL;The driver does not asgbxdh

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:WINNTSYSTEM32目录下(这里假定用户将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

用vb OpenGL 在picture中画一个三角形。

  要想在VB6.0中使用OpenGL绘图,必须先下载一个SDK,名字叫vbogl.tlb。  下载该文件后,直接在VB6.0“工程”-“引用”里面引用  1、在form中加入一个PictureBox控件  2、要在Windows里面使用OpenGL,必须先进行像素格式设置,函数代码如下  Dim hRC As Long"全局变量  "启用OGL  Sub EnableOpenGL(ghDC As Long)  On Error GoTo Err  Dim pfd As PIXELFORMATDESCRIPTOR "pfd像素格式设置.  ZeroMemory pfd, Len(pfd)  pfd.nSize = Len(pfd) "大小  pfd.nVersion = 1 "版本  pfd.dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER "标志  pfd.iPixelType = PFD_TYPE_RGBA "像素类型  pfd.cColorBits = 24 "颜色位数  pfd.cDepthBits = 32 "位宽  pfd.iLayerType = PFD_MAIN_PLANE "图层类型  Dim PixFormat As Long  PixFormat = ChoosePixelFormat(ghDC, pfd) "选择设备中最匹配我们所设置的像素  SetPixelFormat ghDC, PixFormat, pfd "设置成当前的像素  hRC = wglCreateContext(ghDC) "建立翻译描述表  wglMakeCurrent ghDC, hRC "将建立的翻译描述表设置为当前  Exit Sub  Err:  MsgBox "Can"t create OpenGL context!", vbCritical, "Error"  End  End Sub  在工程的FORM的load中加入调用代码  Call EnableOpenGL(Picture1.hDC)  3、与启用对应的禁用  "禁用OGL  Sub DisableOpenGL()  wglMakeCurrent 0, 0  wglDeleteContext hRC  End Sub  在工程的form的unload中加入禁用代码  Call DisableOpenGL  4、绘图  Private Sub Display()  glClearColor 0#, 0#, 1#, 0# "清空颜色缓存的RGBA颜色值  glClear clrColorBufferBit "为绘下帧曲面清除缓冲区  glColor3f 0.8, 0.3, 0.5 "设置显示的字体颜色  glPushMatrix "依据当前模式(模式-视图矩阵)使矩阵入栈  glBegin glBeginModeConstants.bmPolygon "开始绘图,绘制一个三角形  glVertex2f -0.5, -0.5 "三角形的3个顶点  glVertex2f -0.5, 0.5  glVertex2f 0.5, -0.5  glEnd  glPopMatrix "依据当前模式(模式-视图矩阵)使矩阵出栈  SwapBuffers Picture1.hDC "切换缓存  End Sub  5、在PictureBox1的PAINT事件,调用显示的函数  Display

如何设置魔兽争霸opengl模式

在你的桌面上的魔兽快捷方式上单击右键,选属性,进入属性单击快捷方式选项卡,在目标一栏的配置符最后加" -opengl"(不包括引号),注意在"-"之前一定要加上一个英文状态下的空格,不然是连游戏也进不去的。最后点应用,确定.在桌面上刷新两次进游戏。扩展资料:高级功能OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加API实现:GLX - X11(包括透明的网络)WGL - Microsoft WindowsAGL - Apple MacOS另外,GLUT库能够以可移植的方式提供基本的窗口功能。参考资料:OpenGL—百度百科

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:WINNTSYSTEM32目录下(这里假定用户将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

介词语法问题More and more people live in towns instead of on farms?

第一个因为三者搭配的介词不都相同,三个名词得分别用不同的介词来连接所以不可省略: 【in】 town 【on】farm 【in】 village 而如果要是town和village搁在一起,把这三个词调一下个可就不一样了.由于town和village的介词相同,所以可用同一个in来连接: More and more people live on farms instead of in towns and(in)villages. 第二个两者搭配的介词相同所以可以省略: 【in】 a classroom 【in】 a department store classroom和department store可以用相同的介词in,所以就省略成了: How to act in a classroom,or (in) a department store? 而如果后者不是a department store 而是farm,那就不一样了: How to act in a classroom,or on a farm? 我是认真回答的.希望能对你有所帮助.,10,应该是因为第一句中的三个名词用不同的介词才可以 town , farm, village, 而第二句中的classroom, department store可以用相同的介词in 所以就省略了的原因吧。,1,第一个因为两者搭配的介词不同 所以不可省略 第二个两者搭配的介词相同所以可省 加上去也是对的,1,这是因为英语中与不同名词连用时要用不同的介词 in a town, in towns (cities) on a farm, on farms 这个比较特殊 in villages in a classroom, in a department store前面已经有了同样的in,英语中同样要避免不必要的重复,所以这里只用一个,0,介词语法问题 More and more people live in towns instead of on farms and in villages. How to act in a classroom,or a department store? 都是有两个介词词组,为什么第一句中ON 和IN都要,而第二句中就只用了一个IN呢?

laughed,climbed,stopped他们哪一个读音不一样?

climbed中的ed读音不一样

怎样用英文介绍超人 100字左右吧,(不要superman这样的答案了)谢~

Superman must have a special ability,he or Xuhui Fei,perhaps the mighty,might be short of space shuttle .he is human,but different from ordinary people,justice will be full of chivalric Superman ,crime punish evil,and evil Superman is different,they only know destruction everywhere,caused some controversy.超人一定是具有特殊能力的人,他或许会飞,或许力大无穷,或许会空间穿梭.总之他是普通人,而又不同与普通人,正义的超人会到处行侠仗义,除恶惩奸,而邪恶的超人则不同,他们只知道到处破坏,引来争议. 全是原创哦,以后不懂得要经常提问哦.

the good news is that this stormy period will not last这句话是什么从句

答:这个是含有表语从句的复合句。that...... last.. 这个句子是表语从句呵。

stormy temper与 short temper 的区别

Astormy temper只是暴脾气题目里说他朋友很少,说明他脾气一定很暴躁。

super junior幸福的歌词

ud55cubc88ub3c4 ub09c ub108ub97c uc78auc5b4ubcf8uc801 uc5c6uc5b4 uc624uc9c1uadf8ub300ub9ccuc744 uc0dduac01ud588ub294uac78 uadf8ub7f0 ub108ub294 ubb50uc57c ub0a0 uc78auc5c8ub358 uac70uc57c uc9c0uae08 ub0b4 ub208uc5d0uc120 ub208ubb3cuc774 ud758ub7ec ubc30uc2e0uac10 ub290uaef4 ub110 ucc3euc544uac08uae4c uc0dduac01ud588uc5b4 ub09c ub09c uc798 ubaa8ub974uaca0uc5b4 uc774 uc138uc0c1uc774 ub3ccuace0uc788ub294 uc9c0uae08 ub0b4 ub208uc5d0ub294 ub108ubc16uc5d0 ubb50uc9c0 ud560ub9d0uc774 uc5c6uc5b4 uac08 uc218ub3c4 uc5c6uc5b4 ub208ubb3cub3c4 uc5c6uc5b4 ub290ub08cub3c4 uc5c6uc5b4 ub124 uc55euc5d0 uc11c uc788ub294 ub0a0 ubc14ub77cubd10 uc774ub807uac8c ub110 uc704ud574 uc0b4uc544uc788ub294 ub0a0 uc57duc18dub41c uc2dcuac04uc774 uc654uc5b4uc694 uadf8ub300 uc55euc5d0 uc788uc5b4uc694 ub450ub824uc6c0uc5d0 uc6b8uace0 uc788uc9c0ub9cc ub208ubb3cuc744 ub2e6uc544uc8fcuc5c8uc5b4uc694 uadf8ub54c ub0b4 uc190uc7a1uc558uc8e0 uc77cuc5b4ub0a0uac70uc57c ud568uaed8 ud574uc900 uadf8ub300uc5d0uac8c ud589ubcf5uc744 ub208uac10uace0 uadf8ub308 uadf8ub824uc694 ub9d8uc18d uadf8ub308 ucc3euc558uc8e0 ub098ub97c ubc1dud600uc8fcub294 ube5buc774 ubcf4uc5ec uc601uc6d0ud55c ud589ubcf5uc744 ub193uce60 uc21c uc5c6uc8e0 uadf8ub300 ub098 ubcf4uc774ub098uc694 ub098ub97c ubd88ub7ecuc918uc694 uadf8ub300uacc1uc5d0 uc788uc744uaebcuc57c ub108ub97c uc0acub791ud574 ud568uaed8ud574uc694 uadf8ub300uc640 uc601uc6d0ud788 ud55cubc88ub3c4 ub09c ub108ub97c(ub108ub97c) uc78auc5b4 ubcf8uc801 uc5c6uc5b4(uc5c6uc5b4) uc624uc9c1 uadf8ub300ub9ccuc744 uc0dduac01ud588ub294uac78(ubab0ub77c ubab0ub77c) uadf8ub7f0 ub108ub294 ubb50uc57c(ubb50uc57c) ub0a0 uc78auc5c8ub358 uac70uc57c(uac70uc57c) uc9c0uae08 ub0b4 ub208uc5d0uc120 ub208ubb3cuc774 ud758ub7ec ubc30uc2e0uac10 ub290uaef4 uc57duc18dub41c uc2dcuac04uc774 uc654uc5b4uc694 uadf8ub300 uc55euc5d0 uc788uc5b4uc694 ub450ub824uc6c0uc5d0 uc6b8uace0 uc788uc9c0ub9cc ub208ubb3cuc744 ub2e6uc544uc8fcuc5c8uc5b4uc694 uadf8ub54c ub0b4 uc190uc7a1uc558uc8e0 uc77cuc5b4ub0a0uac70uc57c ud568uaed8 ud574uc900 uadf8ub300uc5d0uac8c ud589ubcf5uc744 ub208uac10uace0 uadf8ub308 uadf8ub824uc694 ub9d8uc18d uadf8ub308 ucc3euc558uc8e0 ub098ub97c ubc1dud600uc8fcub294 ube5buc774 ubcf4uc5ec uc601uc6d0ud55c ud589ubcf5uc744 ub193uce60 uc21c uc5c6uc8e0 uadf8ub300 ub098 ubcf4uc774ub098uc694 ub098ub97c ubd88ub7ecuc918uc694 uadf8ub300uacc1uc5d0 uc788uc744uaebcuc57c ub108ub97c uc0acub791ud574 ud568uaed8ud574uc694 uadf8ub300uc640 uc601uc6d0ud788 ub208uac10uace0 uadf8ub308 uadf8ub824uc694 ub9d8uc18d uadf8ub308 ucc3euc558uc8e0 ub098ub97c ubc1dud600uc8fcub294 ube5buc774 ubcf4uc5ec uc601uc6d0ud55c ud589ubcf5uc744 ub193uce60 uc21c uc5c6uc8e0 uadf8ub300 ub098 ubcf4uc774ub098uc694 ub098ub97c ubd88ub7ecuc918uc694 uc5b8uc81cub77cub3c4 uadf8ub300 ub9c8uc74cuc744 uc5f4uc5b4 ubcf4uc544uc694 uc55euc5d4 ub0b4uac00 uc788uc5b4uc694 ub098ub97c ubd88ub7ecuc918uc694 uadf8ub300 uacc1uc5d0 uc788uc744uaebcuc57c ub108ub97c uc0acub791ud574 ud568uaed8ud574uc694 uadf8ub300uc640 uc601uc6d0ud788 从来没有忘记过你 天天都在思念你 可是你却忘记了我 我的眼里在流泪 有一种背叛感 我也不明白为何总去想你 难道在这世界里我心中只有你 也不敢去找你 也没有眼泪 更没了感觉 请你抬头看看我 这样为你而过的我 约会的那天 颤抖的我站在你面前 是你替我擦干眼泪 紧紧握住了我的手 请相信我 我一定会给你幸福 闭目想你的样子 终于找到了我心中的你 我看见了幸福的光亮 不能在失去你 我爱你 我会永远和你在一起 打开你的心扉 我永远站在你面前 请你呼唤我 我永远会在你身边 我爱你

superjunior----《幸福》的中文歌词

[晟敏]我一次试着忘记你的时候都没有只想着你一个人[韩庚]但是你呢?把我全忘记了![希澈]现在我眼中流下的泪水充满了背叛感[神童]想着是否去寻找你[恩赫]我我真的不知道?[神童]这个世界在忙碌着[恩赫]我除了你什么也没有了[神童]说不出话也做不了事[恩赫]没有泪水也没有感觉[神童]看着站在我面前的你为了你而活着的我[东海]约定的时间到了在你面前很害怕,但现在不能哭[始源]擦掉眼泪抓住我的手站起来吧[利特]我们在一起吧我会给你幸福的[晟敏]假装看不见回忆你的样子在心中找回你看着理解我的(你的)神色直到永远[强仁]不要错过了幸福请你看着我,呼喊我的名字吧我会在你身边[丽旭]我爱你永远和你在一起[希澈]我一次试着忘记你的时候都没有只想着你一个人[基范]但是你呢?你却把我忘记了![艺声]我眼中流下的泪水充满了背叛感[晟敏]约定的时间到了在你面前很害怕,但现在不能哭[强仁]擦掉眼泪抓住我的手站起来吧[恩赫]我们在一起吧我会给你幸福的[东海]假装看不见回忆你的样子在心中找回你看着理解我的(你的)神色直到永远[利特]不要错过了幸福请你看着我,呼喊我的名字吧我会在你身边[艺声]我爱你永远和你在一起[希澈]那些青鸟传递的叫做"幸福"的东西[丽旭]常常在我们身边[ALL]假装看不见回忆你的样子在心中找回你看着理解我的(你的)神色直到永远不要错过了幸福请你看着我,呼喊我的名字吧什么时候也打开你的心看看吧你的未来有我呼喊我的名字吧我会在你身边[丽旭]我爱你[ALL]永远和你在一起

关于独立宣言 United States Declaration of Independence 的英文论文

The The Declaration of Independence, completed and signed in July of 1776, marked the official separation between the 13 colonies and Great Britain. An armed struggle between the colonies and Britain had begun just over a year before, with the Battles of Lexington and Concord. The formal declaration of independence established the new American revolutionary government and officially declared war against Great Britain. The primary purpose of the declaration was to assist the Second Continental Congress in obtaining aid from foreign countries. The document also clearly outlines the history of abuses the colonists had suffered under British rule since the end of the French and Indian war in 1763. <--DisplayAds("Middle,Middle2,Right!Middle");//--><-- --><-- -->Prior to the French and Indian war, the colonists had enjoyed over a hundred years of "salutary neglect." In other words, although laws were in place to maintain the subordinate status of the colonies to Great Britain, they were usually not enforced. After the French and Indian war, which increased Britain"s share of North America, King George III and Parliament sought to establish firm control over the land newly obtained from France, and to help pay war debts by taxing the colonies. They did this by enacting a number of acts that either taxed the colonists or placed stricter controls on trade. These laws included the Sugar Act (1764), the Stamp Tax (1765), the Townshend Acts (1767), and the Tea Act (1773). Additionally, Parliament enacted the Quartering Act (1765) which forced colonists to help pay for the British military stationed in the colonies. Colonists initially protested these acts through peaceful means such as petition, boycott, and committees. They argued that since they had no representation in Parliament, they could not be rightfully taxed by Parliament. As their petitions were repeatedly ignored, and taxes continually added, colonists turned to increasingly more destructive actions, like the Boston Tea Party of 1774. In response to this rebellious action by the Massachusetts Colony, the King and Parliament exacted punishment through legislation referred to by colonists as the "Intolerable Acts." The Intolerable Acts sparked the colonies to call an inter-colonial congress for the purpose of discussing a unified response to the King and Parliament. This First Continental Congress, as it was called, met in September 1774 in Philadelphia. All 13 colonies were present except for Georgia. The Congress drafted a declaration claiming that the Intolerable Acts were unconstitutional, that the colonists retained the same civil rights as English citizens, and that they would boycott all English goods until reconciliation was reached. The negotiations never happened. Instead, tensions continued to mount between the colonists and Great Britain. The First Continental Congress agreed to meet again in May 1775 if no reconciliation had been reached. At this Second Continental Congress, all thirteen colonies were present. It took 14 months, military mobilization, persuasive pamphleteering, and the further abuse of colonial rights before all 13 colonies agreed to pursue independence. At issue were political as well as practical concerns. Upper class colonists tended to fear the lower class gaining too much power through revolution. Middle class colonists could not afford to see their businesses continue to decline due to trade restrictions. All colonists resented that the King and Parliament denied them representative government and their civil rights. However, they also doubted whether they would be strong enough to resist the British military. Early in 1776, Thomas Paine published his pamphlet Common Sense, which won over many colonists to the cause of independence. Meanwhile, the congress had sent the King an Olive-Branch Petition as a last effort towards reconciliation. Not only did he refuse to respond to the colonists" plea, he sent an additional 20,000 troops to North America and hired mercenaries from Germany to bolster his military force. An all-out war seemed imminent and even moderate delegates realized that in order to obtain much-needed military support from France, they would have to declare themselves wholly independent from Great Britain. Richard Henry Lee of Virginia proposed a resolution for independence in June of 1776. The Congress appointed a committee to draft a declaration of independence that consisted of John Adams (MA), Benjamin Franklin (PA), Thomas Jefferson (VA), Robert Livingston (NY) and Roger Sherman (CT). <--DisplayAds("Middle,Middle2,Right!Middle2");//--><-- --><-- -->The job of drafting the Declaration of Independence fell to the youngest member of the committee, Thomas Jefferson. In composing the declaration, Jefferson drew on ideas from the Enlightenment, especially those of John Locke. Not only did the declaration represent a milestone in the history of the United States, it also turned the political philosophies of 18th century Europe into real political practice.

volcano-type trend是什么意思

volcano type trend 火山型的趋势

Seven leg penncil发音不同的是哪个?

这个应该是pencil 其他两个都发[e]的音第三个en是一个整体,发[en]的音

KimPenn是什么职业

KimPennKimPenn是一名演员,主要作品有《中国匣》,《运财五福星》等。外文名:KimPenn职业:演员代表作品:黑色城市合作人物:林万掌主要作品人物关系

Melanie Penn的《Balloon》 歌词

歌曲名:Balloon歌手:Melanie Penn专辑:Wake Up Loveballoon - The Pancakesi never show that i sometimes do not wanna see youyou"ll never know everything i tell you is not trueevery night in my lifeyou worry about mewait there for mei wonder when you"ll set me freewould you read it if i say i"ll write a letter to youwould you believe when i say i"m already twenty twoin my life in your eyesso much is differentso little"s the samebut none of us is gonna changedo we really careif it is worth the trouble worth the sorrowthey"re like a balloon in the airfloating to nowhereyou know there are ups and downsin the course of our livesit"s the rule of the gameplease do not keep on asking whyyou call me but i pretend to be too busy to talkthe chemistry between us is not enough at alli don"t understand you don"t understand mewhat a pitywith nothing else more can we agreedo we really careif it is worth the trouble worth the sorrowthey"re like a balloon in the airfloating to nowhereyou know there are ups and downsin the course of our livesit"s the rule of the gameplease do not keep on asking whyyou call me but i pretend to be too busy to talkhttp://music.baidu.com/song/24241593

曼哈顿坐火车怎么去纽瓦克机场? 是不是在麦迪逊花园球馆旁边的NEW YORK PENN车站坐火车去

1、最省事的方法:从纽瓦克机场搭出租车到曼哈顿$50~60,时间30分钟;到法拉盛$60~70,时间40分钟。这一路可不近,纽瓦克国际机场到法拉盛的公路距离是44公里,价钱差不多在70美金左右。    2、最省钱的方法:搭巴士62路到Newark Penn Station($1.35),再搭PATH到曼哈顿的WTC($1.2),如需去法拉盛,先搭地铁E线到74ST再转7线($2.00)。  3、最经济的方法:搭机场内的免费shuttle bus到Economy Long-Term Parking lot,到路边搭107路巴士到曼哈顿42街巴士总站($4.40);如需去法拉盛,再转地铁7线。  很多人会问在纽瓦克机场如何可以找到shuttle bus的上车点,或者107巴士的时刻表什么的,我可以为你解答:看下图    图中的P6就是shuttle bus的上车点了。    这个就是Bus的上班时间了。  4、最可靠的方法:搭AIRTAIN接火车到曼哈顿Penn Station($15),如需去法拉盛再转地铁($2.00)或火车($5.00)。(AirTrain在机场之内有三个主要驻地,一为每个主要终端(A、B和C)。 有其他四个驻地(P1、P2、P3和P4)为停车场和出租车设施加上八在东北走廊.)    5、最直接的方法:搭Newark Liberty Airport Express巴士到曼哈顿中城$14。  6、最快的方法:坐直升飞机,时间10分钟,价格$170。  另外再加一个方法:如果坐公共交通的话不妨选择New Jersey Transit的通勤火车,从纽瓦克机场出来按着路标不用出机场就能走到New Jersey Transit的火车站,在自动售票机上购买到New York Penn Station的车票,应该是15美元,然后上车,不按车次的,随到随上的。到达New York Penn Station后换乘地铁1号线(时代广场方向)一站地到达时代广场站,换乘地铁7号线终点站下车就是法拉盛。  另外还有一个方法:这边当然也有接机的服务,就是下面介绍的:  梦之旅接车服务全年无休,美国纽约或洛杉矶当时上午九点至下午六点可来电预约,网上二十四小时接受预订,您只需要填写您的服务需求单,我们的工作人员将尽快为您安排您所需要的服务。请尽量提前至少三天进行预订,您的预订一旦确认,我们将提前一天与您取得联系。  我把网址附在上面:  http://usa.dreams-travel.com/dsztravelaircraft  记得没错的话,到曼哈顿应该是60几美金。  最后最后就没有了。。。。。

penn-rich是什么品牌

是一个美国中档男装品牌

SEAN PENN演员有人知道吗

  肖恩-潘个人档案(附图)  姓名:Sean Penn  译名: 西恩/肖恩-潘  生日:1960年8月17日  创意贺岁更精彩 专家破解增高之迷!  肝病治疗重大突破 新浪旅游 招贤纳仕  出生地:美国加州伯班  前妻:麦当娜  主要作品:  《死囚漫步》、《她是如此可爱》、《细细的红线》  《夜晚降临前》、《誓言》、《我是山姆》  获奖情况:  2002年因《我是山姆》获第74届奥斯卡奖最佳男主角提名  2000年因《甜蜜与卑微》获第72届奥斯卡奖最佳男主角提名  1998年因《喧嚣》获第55届威尼斯国际电影节最佳男主角奖  1997年因《她是如此可爱》获第50届戛纳电影节最佳男演员  1996年因《死囚漫步》获第68届奥斯卡奖最佳男主角提名  1996年因《死囚漫步》获第46届柏林电影节最佳男演员  凭着《我是山姆》(“I Am Sam”)一片而获得今年奥斯卡最佳男主角提名的西恩-潘,是好莱坞众多"坏小子"中的一个,他脾气火爆,行事乖张。虽然他在银幕上的表现相当不错,能演、能编、能导,从1981年的《熄灯号》(“Taps”)到近期的《我是山姆》,他的表演堪称是可圈可点。但西恩-潘因脾气火爆,令许多记者都尝过他的拳头,而且与麦当娜(Madonna)的短暂婚姻也使他的形象贬过于褒。离婚后,西恩-潘似乎变了个人,也迎来他的演艺事业的第二春。他在随后的影片中以风流倜傥的形象再次出尽风头,3次获得了奥斯卡奖最佳男  体验佳能,获佳能大奖! 不见不散约会新主张  小户型主阵容揭晓 多媒体互动学英语  演员提名。  西恩-潘1960年8月17日出生在美国加州的伯班,父亲利奥-佩恩是导演、母亲艾琳-莱恩是演员,他是家中的老二,他还有一个哥哥叫麦克尔,弟弟克里斯。童年的西恩-潘在圣莫尼卡一所豪宅内长大,家庭环境的薰陶,使他很小就对演戏发生兴趣。虽然西恩-潘曾有过当律师的理想,但他后来发现自己真正感兴趣的还是子承父业。于是高中毕业后,西恩-潘没有上大学便直接加入了洛杉矶剧团工作。两年后他开始上表演课,不久又从舞台转向电视,参加电视节目的演出。1980年,西恩-潘搬到了纽约,在哪里他很快就在一些影视剧中担任角色。  度过了一段跑龙套的平淡时光后,1981年,西恩-潘终于迎来了脱颖而出的机会,在哈罗德-贝克尔(Harold Becker)执导的剧情片《熄灯号》中得到了个人的第一个银幕角色,影片展示了一群军校学生的生活和他们追求荣誉与责任的信念。几位偶像明星---- “巴顿”乔治-C-斯科特(George C. Scott)、蒂莫西-赫顿(Timothy Hutton)、汤姆-克鲁斯(Tom Cruise)都是成名于此。  1982年,佩恩主演了女导演埃米-赫克琳(Amy Heckerling)的青春片《开放的美国学府》(“Fast Times at Ridgemont High”),出道不久的他在片中放荡不羁,表演得无懈可击,使该片成为一部经典的青春片,他也从一个默默无闻的小演员成为一颗冉冉升起的新星。随后的二年,他分别接拍了里克-罗森塔尔(Rick Rosenthal)的《坏小子》(“Bad Boys”,1983)和理查德-本杰明(Richard Benjamin)的《与月亮赛跑》(“Racing with the Moon”,1984)。他的不俗表演,使评论界对他的表演天赋产生了浓厚兴趣,并凭《坏小子》获1983年第9届洛杉矶影评人协会新世纪奖。  1984年,西恩-潘在约翰-施莱辛格(John Schlesinger)的根据真实事件改编的剧情片《苏联间谍》(“The Falcon and the Snowman”)中饰演了一个将国家机密出卖给苏联间谍的瘾君子,全新的演绎使他实现了“要塑造一个真实角色”的诺言。此时的他仅仅24岁,就跃入了好莱坞一线明星的行列。可是自从1985年在《物质女孩》("Material Girl")的摄录现场结识了麦当娜之后,西恩-潘的演艺事业便触上了暗礁。1985年他和麦当娜结婚,但关系只维持了4年便划上了句号。在这几年中,西恩-潘除频繁地出现在一些小报上之外,值得一提的就是他与麦当娜合演、也是他迄今为止最糟糕的一部影片----1986年的《上海惊奇》 (“Shanghai Surprise”)了。他俩的差异不仅使两人互相吸引,同时也互相诋毁。想当初正是麦当娜宣称了西恩-潘是"全宇宙最酷的人",但是不久后,也是她对丈夫提出伤害诉讼,最终走上了离婚之路。  此时,西恩-潘已决定转向幕后发展。1991年导演了处女作《印第安信使》(“The Indian Runner”),1995年他又自编自制自导、由奥斯卡影帝杰克-尼克尔森(Jack Nicholson) 主演的《72小时生死线》(“The Crossing Guard”)皆获得不少好评。他在完成《印第安信使》的执导工作后曾宣布不再出演任何影片,全心全意地作一名导演。可是资金的窘迫使他不得不再度出山,出山后的他却“意外”地获得了一连串的成功。先后获得了1996年第46届柏林电影节最佳男演员奖,1997年第50届戛纳电影节最佳男演员奖、1998 年第55届威尼斯电影节最佳男演员等大奖,特别是1995年和1999年更是两获奥斯卡奖最佳男演员提名。  1993年,佩恩与金奖影帝艾尔-帕西诺(Al Pacino)接拍了布赖恩-德-帕尔马(Brian De Palma)执导的犯罪片《情枭的黎明》(“Carlito"s Way”),在剧中饰演帕西诺的昔日恩人律师大卫,再度出山的佩恩在演技方面显得更加游刃有余,成熟老道。1995年,他又在名导蒂姆-罗宾斯(Tim Robbins) 的监狱片《死囚漫步》(“Dead Man Walking”)中,精彩细腻地诠释了一个强奸杀人犯马修-庞塞尔特(Matthew Poncelet),使这部严肃题材的影片透射出令人感动的悲壮。此片为他赢得了1996年第46届柏林电影节最佳男演员奖,并获第68届奥斯卡奖最佳男主角提名。  1997年,佩恩主演了由金牌导演奥利佛-斯通(Oliver Stone)执导的公路惊栗片《U形转弯》(“U-Turn”),饰演倒霉的男主角博比-库珀(Bobby Cooper)。他叛逆的表演不仅受到了舆论的好评,也得到了众多女性影迷的青睐,被奥利佛-斯通戏称为“全美最叛逆的小子”。随后他与妻子----曾出演过“阿甘女友”的罗宾-赖特(Robin Wright)共同主演了尼克-卡萨维蒂(Nick Cassavetes)执导的爱情喜剧片《她是如此可爱》(“She"s So Lovely”),这部影片为他捧回了第50届戛纳电影节最佳男演员的桂冠。同年,他还在名导戴维-芬奇(David Fincher)的心理惊栗片《游戏》(“The Game”)中与奥斯卡影帝迈克尔-道格拉斯(Michael Douglas)演对手戏,饰演了道格拉斯的弟弟奥顿(Orton)。戏虽不多,但演得精彩,令人难忘。1998年,佩恩又推出了两部成功之作:特伦斯-马利克(Terrence Malick)的战争巨片《细细的红线》(“Thin Red Line”)和安东尼-德拉赞(Anthony Drazan)的剧情片《喧嚣》(“Hurlyburly”)。尤其是《细细的红线》获得了1999年第71届奥斯卡奖最佳影片等7项提名。  1999年,西恩-潘在名导伍迪-艾伦(Woody Allen)的怀旧喜剧片《甜蜜与卑微》(“Sweet and Lowdown”)中,饰演了一个疯狂而古怪的天才吉它手埃米特-雷(Emmet Ray)。他把这个天才演奏家的优雅风格和可悲的个性表现得活灵活现,使片中的其他角色相形失色,并再次获得了第72届奥斯卡奖最佳男主角提名。  进入新千年,西恩-潘没有让影迷们失望,再度推出了三部力作。2000年与哈维尔-巴丹(Javier Bardem)合作推出了朱利安-施纳贝尔(Julian Schnabel)执导的《夜晚降临前》(“Before Night Falls”),再现了古巴著名同性恋作家雷纳尔多-阿里纳斯(Reinaldo Arenas)从童年到逝世这段曲折坎坷的人生历程。该片先后在威尼斯影展、欧洲电影节、哥伦比亚电影节和美国国家影评协会上多次获奖。2001年,西恩-潘编剧执导了杰克-尼克尔森和罗宾-赖特主演的恐怖剧情片《誓言》(“The Pledge”),这是他的第3部执导作品。《誓言》的情节紧张刺激、曲折动人。作为一部恐怖警匪片,佩恩却将人物的情感作为一条主线,充分显示了他日益增强的自信心和驾驭影片的能力,执导才华得到了淋漓展示。  2002年,佩恩还主演了女导演杰西-尼尔森(Jessie Nelson)的剧情片《我是山姆》(“I Am Sam”)。他在剧中饰演一个弱智患者山姆,为了争夺女儿露西的抚养权,与女律师丽塔(米歇尔-法伊弗饰,Michelle Pfeiffer)诉之法庭的故事。在片中,佩恩深入角色的内心,十分细腻地表达出山姆的内心世界,他出色的表现赢得了影评家的一致赞誉,也因此第3次获得奥斯卡奖最佳男主角的提名。  西恩-潘好象并没有改变他的坏脾气,二度角逐奥斯卡影帝二度落空,使他对这次能否如愿捧得最佳男主角的小金人满不在乎。他曾说:"相信这次结果都是一样。"同时,他还曾在去年出席苏格兰举行的爱丁堡电影节时,公开表示如果今年如果入围奥斯卡奖的话,他一定不会出席颁奖礼,他认为"在奥斯卡上,你要嘛可以有2秒钟时间去感谢上帝,要么就只能是这场糟糕电视节目的临时演员,出席奥斯卡让我十分尴尬。"(责任编辑:老赵)  获奖纪录:  2002年因《我是山姆》获第74届奥斯卡奖最佳男主角提名  2000年因《甜蜜与卑微》获第72届奥斯卡奖最佳男主角提名  1998年因《喧嚣》获第55届威尼斯国际电影节最佳男主角奖  1997年因《她是如此可爱》获第50届戛纳电影节最佳男演员  1996年因《死囚漫步》获第68届奥斯卡奖最佳男主角提名  1996年因《死囚漫步》获第46届柏林电影节最佳男演员  1983年因《坏小子》获第9届洛杉矶影评人协会新世纪奖  主要影视作品:  2002年《我是山姆》(“I Am Sam”)  2001年《誓言》(“The Pledge”)  2000年《魔鬼游戏》(“The Weight of Water”)  2000年《夜晚降临前》(“Before Night Falls”)  2000年《一个女人和四个男人》(“Up At The Villa”)  1999年《甜蜜与卑微》(“Sweet and Lowdown”)  1998年《喧嚣》(“Hurlyburly”)  1998年《细细的红线》(“Thin Red Line”)  1997年《游戏》(“The Game”)  1997年《旧爱》(“Loved”)  1997年《雨果池事件》(“Hugo Pool”)  1997年《她是如此可爱》(“She"s So Lovely”)  1997年《U形转弯》(“U Turn")  1995年《死囚漫步》(“Dead Man Walking”)  1995年《72小时生死线》(“The Crossing Guard”)  1993年《情枭的黎明》(“Carlito"s Way”)  1993年《最后的晚会》(“The Last Party”)  1991年《印第安信使》(“The Indian Runner”)  1990年《斯文之邦》(“State of Grace”)  1989年《孽战》(“Casualties of War”)  1989年《我们不是天使》(“We"re No Angels”)  1988年《颜色》(“Colors”)  1988年《蓝色销魂夜》(“Cool Blue”)  1988年《柏林审判》(“Judgement in Berlin”)  1986年《义不容情》(“At Close Range”)  1986年《上海惊奇》(“Shanghai Surprise”)  1984年《苏联间谍》(“The Falcon and the Snowman”)  1984年《精神错乱》(“Crackers”)  1984年《与月亮赛跑》(“Racing with the Moon”)  1983年《坏小子》(“Bad Boys”)  1983年《夏日咒语》(“Summerspell”)  1982年《开放的美国学府》(“Fast Times at Ridgemont High”)  1981年《熄灯号》(“Taps”)  1981年《兰迪-韦伯斯特的谋杀》(“The Killing of Randy Webster”)  1981年《赫林格的法律》(“Hellinger"s Law”)

求音乐:ordiary day melanie penn 中文歌词

dihghsafdhnbibaidbgibibgfibihbfigbifbihbffihdbihgfbhiabhbibeibawiogbiofbgioaboibgiofbdhiosbohbgiobioarhgffdh

机房专用空调(艾默生、海洛斯等),在室外机处均有一个压力开关(penn丹佛斯),现有高压报警,室外机风

故障情况说明不明晰,可致电安赛尔机房精密空调售后服务部咨询,咨询电话:053188389626

melanie penn的ordinary day 歌词

I fall asleep to,your serenade.I wake up to,your saving grace.I see the sun beam the perfect ray,I wanna send out a gazillion bouquet.I hear the chords that resonate,It"s just another,oh oh, oh ordinary day.aoooh, aooohI look from your eyes,down to your lips.I feel it from my toes down to my fingertips.I see the clouds shake,A sweet arayIt"s just another,oh oh, oh ordinary day.aoooh, aoooh, aoooh, aooohOn sunday afternoon we wake up,to find that snow has fallen down downWe should put our winter clothes on,and go walking "round.And we can sit there,beside the hills.Maybe we"ll notice that the world is standing still.Some things may go and,some stay the same.in just anotheroh oh, oh ordinary day.]aooohoh, oh, oh ordinary dayaooohoh, oh, oh ordinary dayaooohoh, oh, oh ordinary dayaooohoh, oh, oh ordinary day

Penn World Tables什么意思

问题补充:翻译成汉语是 "佩恩表"是联合国的ICP(国际比较计划), 委托宾州大学的一个研究所建立的数据库, 目前版本是6.2.Penn World Table 是由 University of Pennsylvania 生产/收入/价格国际比较研究中心编制的188个国家的购买力平价GDP比较数据,最新版包含从1950到2004年,共55年数据,以2000年为基础。包含以下数据:Population Exchange Rate Purchasing Power Parity over GDP Real Gross Domestic Product per Capita Consumption Share of CGPD Government Share of CGDP Investment Share of CGDP Price Level of Gross Domestic Product Price Level of Consumption Price Level of Government Price Level of Investment Openness in Current Prices Ratio of GNP to GDP CGDP Relative to the United States Real GDP per capita (Constant Prices: Laspeyres) Real GDP per capita (Constant Prices: Chain series) Real GDP Chain per equivalent adult Real GDP Chain per worker Real Gross Domestic Income (RGDPL adjusted for Terms of Trade changes) Openness in Constant Prices Consumption Share of RGDPL Government Share of RGDPL Investment Share of RGDPL growth rate of Real GDP per capita (Constant Prices: Chain series)

最近听了一首歌Michael Penn的《Walter Reed》,求歌词翻译与歌曲介绍?

http://www.mtime.com/person/1006326/details

penn gse什么意思

意思佩恩GSE

penn engineering是宾夕法尼亚大学么

宾夕法尼亚大学(University of Pennsylvania ),这是其中的专业或者是学院望采纳

penn engineering是哪个大学

宾夕法尼亚大学。宾夕法尼亚大学,简称宾大,位于宾夕法尼亚州最大城市费城,是一私立研究型大学,八所常春藤盟校之一,美国大学协会14所创始成员之一。

人物介绍西恩贾斯汀潘sean justin penn

Sean Justin Penn,1960年8月17日-),美国电影演员,出生于加利福尼亚州的圣塔莫尼卡。他是导演 Leo Penn 和女演员Eileen Ryan的儿子。他有两个兄弟:演员克里斯·潘和音乐家麦克·潘。他的父亲是犹太人,而母亲则是有罗马天主教背景的意大利和爱尔兰的混血儿。西恩·潘最为人所乐道的是他和麦当娜的感情以及最近几年在政治方面的活跃表现。 西恩的电影生涯从《开放的美国学府(Fast Times at Ridgemont High)》开始,他在剧中扮演Jeff Spicoli的角色。之后陆续主演了40多部电影,并依靠在神秘河流里的精湛演出获得奥斯卡金像奖。他三次凭《他不笨,他是我爸爸(I Am Sam)》《甜蜜与卑微(Sweet and Lowdown)》和《越过死亡线(Dead Man Walking)》获奥斯卡题名。 1991年,西恩执导了他的第一部电影《The Indian Runner/统治印第安人的人》,根据布鲁斯·斯布林斯顿的专集《內布拉斯加》(Nebraska)中歌曲Highway Patrolman而拍摄的电影。之后他又执导了两部电影,1995年的The Crossing Guard和2001年的The Pledge。两部电影都是由杰克·尼克逊主演。 西恩曾与在1985年和流行天后麦当娜结婚。 他拿下奧斯卡影帝后,是现今世上唯一一位「金满贯」(坎城、威尼斯、柏林、奧斯卡)影帝。

从纽约penn station坐bus去费城,哪个机场比较方便去penn station,以及怎么从机场到penn station?

newark下飞机直接坐火车去费城更快

纽约penn station 有寄放行李的地方吗

专门存行李的是肯定没有,因为那边根本就没有站,就只有车停在那儿,乘客排队上车。但你可以查查贾维茨会议中心是不是有提供存包的,车站就在会议中心对面。实在不行存在Penn Station也行吧,距离就3、4个街区,而且你要去别的地方逛的话回来可以坐地铁到34 St Penn Station下车正好拿上行李去上车地点~

如何通过运行界面找到printslooper

按win键,在最下面有个搜索栏,输入print spooler上面就会显示出来了。1、开始菜单(或按win键),在最下面有个搜索栏,输入print spooler上面就会显示出来了。如果是要查看print spooler服务是否开启,那么需要单击计算机,管理。服务和应用程序,双击服务。在列表里找到print spooler查看该服务的相关信息。(快捷查找列表可以按下p。列表直接跳到p开头的服务)。服务名称: Spooler显示名称: Print Spooler。服务描述: 管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,本地计算机上的打印将不可用。如果此服务被禁用,任何依赖于它的服务将无法启用。拓展资料:Spooler(打印后台处理服务)的进程名是spoolsv.exe,WinXP Home/PRO默认安装的启动类型是自动,依赖于Remote Procedure Call。Spooler是为了提高文件打印效率,将多个请求打印的文档统一进行保存和管理,先将要打印的文件拷贝到内存,待打印机空闲后,再将数据送往打印机处理。这样处理速度更快些。建议将其设置为手动,有打印任务时再打开。如果没有打印机自然是禁用了。它和office2007的PowerPoint有关,如果把它关掉,那么PowerPoint无法在快速访问工具栏中添加快捷按钮,在打开“PowerPoint选项”的时候也会提示“无法找到打印机”这类的问题。

介绍一下ufc选手BJ Penn 和GSP

比这盆和公输盘忽悠胜负

washington penn 是什么材料

washington penn 华盛顿宾夕法尼亚penn宾夕法尼亚大学(Pennsylvania); (Penn)人名;佩恩;宾

penn是什么大学

  宾夕法尼亚大学    宾夕法尼亚大学(University of Pennsylvania),简称宾大(UPenn),位于宾夕法尼亚州最大城市费城,是一私立研究型大学,八所常春藤盟校之一,美国大学协会14所创始成员之一。”  八所常春藤盟校:哈佛大学、耶鲁大学、普林斯顿大学、哥伦比亚大学、宾夕法尼亚大学、达特茅斯学院、布朗大学及康奈尔大学。  哈佛大学:建立于1636年,是美国本土历史最悠久的高等学府。  耶鲁大学:创立于1701年,全美第三古老的高等学府  普林斯顿大学:创立于1746年,是全美第五历史悠久的高等学府  哥伦比亚大学:创立于1754年  宾夕法尼亚大学:建于1740年,是美国第四古老的高等教育机构,也是美国第一所从事科学技术和人文教育的现代高等学校  达特茅斯学院:成立于1769年,是美国历史最悠久的世界著名学院之一  布朗大学:是美国第一所可以接受任何宗教背景的学生入学的高校  康奈尔大学:康奈尔大学是常春藤盟校中第一所实行性别平等的男女合校大学,不计贵族身份,不分信仰和种族,皆可入学

bboxlooper软件如何保存已编辑的内容?

在软件中编辑好标签内容之后,点击文件-保存,弹出保存对话框,给标签起个名字,就可以根据自己的需求保存到合适的位置,如图所示:

penn是美国哪个大学?加州大学河滨分校好吗?

宾夕法尼亚州立大学;加州大学河滨分校还是比较不错的,教学质量比较高,而且教学氛围也比较轻快。

PENN是什么牌子?

美国著名高尔夫品牌

Penn是什么大学的简称

Penn是宾夕法尼亚州立大学的简称。该校创建于1855年,主校区位于美国宾夕法尼亚州斯泰特科利奇。宾夕法尼亚州立大学是一所多校区的综合性研究型公立大学。学校以教育、科研和社会服务为宗旨。学校通过放宽对学生及教员的年龄、宗教、文化背景、种族背景方面的要求,增强了学校课程的公众性和广泛性。 扩展资料   学校的教学、研究、各项活动以促进经济发展、人类进步、世界各文化互相理解为目的,在科学、人文、艺术等方面深度发展。   宾夕法尼亚州立大学的院系专业:   1、农学院:农业管理、农业教育、农学、农村系统管理、土壤生态学、动物学、环境聚落发展、环境资源管理、食物学、森林科学、园艺学、传染病学、景观学、毒理学、草本研究、生物医药学、渔业研究、木材研究。   2、艺术与建筑学院:建筑学、艺术、艺术教育、艺术史、图形设计、综合艺术、数字图像艺术、景观艺术、音乐文学士、音乐表演、音乐艺术、戏剧音乐、影视编导。   3、传媒学院:广告学、大众传媒、电影学、新闻学、媒体研究、电子传媒。   4、地球与矿产科学学院:地球科学、能源发展政策研究、能源工程、环境工程、生物地理学、人文地理学、自然地理学、地学总论、地理信息系统、矿物工程、气象学、地质学、石油天然气工程、开矿工程、能源商务、天然材料科学、材料工程、地球化学、地球物理、地震学、地磁学。   5、工程学院:空气动力学、航天工程、土木工程、生物工程、生命工程、化学工程、建筑工程、计算机工程、计算机科学、电子工程、电子机械科技、工程科学、大众工程学、工业工程、机械工程、核物理工程。

lol喜欢玩上单和辅助,比较喜欢looper和madlife,我想换个id,有啥好的id吗?

Penta Kill

Looper.myLooper;什么意思

环形使者 时凶猎杀 回路杀手

Android Handle中Looper.loop()的死循环为什么在主线程中不会产生卡死现象

1. 主线程,负责一些UI更新操作,归类为一个线程,线程在Android中是有生命周期的,任务最终是会结束的。 2. Looper.loop()的死循环正是维护了主线程的超长生命周期,loop方法一直循环处理任务,没有任务的时候会休眠,有任务的时候会唤醒然后进行处理,所以也不会占用太多系统资源。 3. 卡死,可能有误解,循环的过程中本生不会出现ANR,在循环的过程中,如果执行了耗时且在规定时间内没有完成消息派发,才会出现ANR。

android主线程中是不是只有一个Looper,一个MessageQueue

Android中的Runnable并不一定是新开的线程,比如下面调用的方法就是运行在UI主线程中Hanlder handler = new Handler();handler.post(new Runnable(){ public void run(){}});官方文档对此的解释是:The runnable will be run on the user interface thread. ”boolean android.view.View .post(Runnable action)Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.Parameters: action The Runnable that will be executed. Returns: Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.我们可以通过handler的对象的post方法,把Runnable对象(一般是Runnable的子类)传过去,handler会在Looper中调用Runnable的run方法执行,Runnable是一个接口,不是一个线程,一般线程会实现Runnable接口这里我们看代码handler.post(new Runnable(){好像是new了一个interface,其实是new一个实现Runnable的匿名内部类(Inner Anoymous Class)}) 这是一个简练的方法Runnalbe是一个接口,不是一个线程,一般线程会实现Runnalbe接口,所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应的线程的。具体来说这个函数的工作原理如下:View.post(Runnalbe)方法,在post(Runanble action)方法中,View获得当前主线程(即UI线程)的handler,然后将action对象post到handler里面去,在Handler里,它将传递过来的action对象封装成一个Message(Message 的callback为action),然后将其投入到UI线程的消息循环中,在handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法,而此时,已经路由到UI线程里,因此我们可以毫无顾虑来更新UI。如下图,前面看到的代码,我们这里的Message的callback为一个Runnalbe的匿名内部类,这种情况下,由于不是在新的线程中使用,所以千万别做复杂的计算逻辑。

Android中为什么主线程不会因为Looper.loop方法造成阻塞

因为Android 的是由事件驱动的,Looper.loop() 不断地接收事件、处理事件,每一个点击触摸或者说Activity的生命周期都是运行在 Looper.loop() 的控制之下。所以不存在主线程会被Looper.loop方法阻塞。如果 Looper.loop()被干掉了,应用也就挂掉了。

请问VLP8效果器单块LOOPER如何使用?

LOOP仅仅就是一个线路选择器~它没有任何效果,没有任何干扰性,对于串联进他的单块本身也没有任何控制力,他只是在控制你TS9所在的那一线路罢了,如你所言把TS9踩灭了,A和B里的音色里就没有TS9的声音了,你打开里面就有TS9了,你放个OD1进去A和B里就是OD1的动静。也就是说LOOP只能控制经不经过这一路,至于这一路里是TS9还是SD1跟LOOP没有关系,至于你的单块是过载音色还是失真音色也跟他没有关系~他只控制线路,唯一的用处就是图方便。VLP8挺好玩一个玩意 如果单块多而复杂的话,用它归置归置还不错,比马丁便宜,比很多网友手工的看起来精细,如果你就几个单块穿着用,实在没必要~VLP8的使用方法:(1):将单块效果器连接入L1-L8接口,SEND接单块效果器的INPUT端,RETRUN接单块效果器的OUTPUT端。(2):将吉他连接到Input插口(3):将Output连接到音箱的Input端(4):接通电源,将接入的全部单块开启。(5):接上电源后为全部BYPASS状态,这时可以看到组状态指示灯在闪动,通过调整BANK+/-及AB(CD)选择你要使用一组音色。(6):踩下A或BCD任意一键进行库内的音色切换,连续踩下A B C D中任意一只开关,可切换BYPASS或开启(7):踩下BANK+或BANK-进行库切换,总工有1-8 8个可选库。编组:(1):按下EDIT键,可以看见显示屏幕显示“E.”字样,表明PXL已经进入编辑模式(2):在按下EDIT键后,即可通过操作A B C D开关来打开或关闭单块,对于VLP8来说,需要配合库减(BANK-)按键进行操作,按动BANK-按键,屏幕会显示“H”或“L”字样,当显示为H时,A B C D操作L5-L8接口中接入的单块;当显示为L时,A B C D操作L1-L4接口中对应的单块,按下一次A或B C D任意一个,将打开或关闭对应单块一次(3):在设置完需要打开或关闭的单块后,按一下STORE(存储)按键,设定即可被保存下来。

循环中Looper.loop;之后,代码不能运行,是怎么回事

import fund123.com.db.DownDatasTask;import fund123.com.db.OnDownDatasListener;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Looper;import android.os.Message;import android.provider.Settings.Secure;import android.util.Log;public class MessageService extends Service { private static final String ITEM_MESSAGE = "message"; private static final String ITEM_TITLE = "title"; private static final String ITEM_TIME = "addtime";//获取消息线程 private Thread mThread = null; //点击查看 //private Intent msgIntent = null; private PendingIntent msgPendingIntent = null; //通知栏消息 private int msgNotificationid = 1000; private Notification msgNotification = null; private NotificationManager msgNotificatiomanager = null; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onStart(Intent intent, int startId) { //初始化 msgNotification = new Notification(); msgNotification.icon = R.drawable.icon1; msgNotification.tickerText = "新消息"; msgNotification.defaults = Notification.DEFAULT_SOUND; msgNotification.flags = Notification.FLAG_AUTO_CANCEL; msgNotificatiomanager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); //开启线程 MsgThread thread=new MsgThread(); mThread=new Thread(thread); mThread.start(); } // @Override// public void onDestroy() {//// System.exit(0);// super.onDestroy();// }class MsgThread implements Runnable{ public boolean isrunning = true; public void run() { while(isrunning){ try { //休息1分钟 Thread.sleep(60000); //获取服务器消息 Looper.prepare(); Log.v("测试1", "测试1"); loadPushMessage(); Looper.loop(); Log.v("测试2", "测试2"); } catch (InterruptedException e) { e.printStackTrace(); } } } }private void loadPushMessage(){ String mobileid = Secure.getString(getBaseContext().getContentResolver(), Secure.ANDROID_ID); String string_url = Client3Application.url_getData + getResources().getString(R.string.url_push_msg, mobileid); final DownDatasTask down_datas_task_ = new DownDatasTask(); down_datas_task_.execute(string_url); down_datas_task_.setOnDownDatasListener(new OnDownDatasListener() { @Override public void onDownData() { int count = down_datas_task_.getDataCount(); if (count > 0) { Message msg=new Message(); msg.what=1; String string_msg = down_datas_task_.getData(0, ITEM_MESSAGE).toString(); String string_title = down_datas_task_.getData(0, ITEM_TITLE).toString(); String string_time = down_datas_task_.getData(0, ITEM_TIME).toString(); Bundle data = new Bundle(); data.putString("message", string_msg); data.putString("time", string_time); data.putString("title", string_title); msg.setData(data); mHandler.sendMessage(msg); Log.v("测试3", "测试3"); } down_datas_task_.cancel(true); down_datas_task_.clearData(); } }); } private Handler mHandler=new Handler(){ public void handleMessage(Message msg) { int i = msg.what; if(i > 0){ Bundle data = msg.getData(); String string_msg = data.getString("message"); String string_time = data.getString("time"); String string_title = data.getString("title"); Bundle bundle = new Bundle(); Intent msgIntent = new Intent(); bundle.putString("message", string_msg); bundle.putString("time", string_time); bundle.putString("title", string_title); msgIntent.putExtras(bundle); msgIntent.setClass(MessageService.this, MessageActivity.class); msgPendingIntent = PendingIntent.getActivity(MessageService.this,0,msgIntent,0); //更新通知栏 msgNotification.setLatestEventInfo(MessageService.this,"新消息",string_title,msgPendingIntent); msgNotificatiomanager.notify(msgNotificationid, msgNotification); //每次通知完,通知id递增一下,避免消息覆盖掉 msgNotificationid++; } } };}

looper为什么离开rng

因为bug

什么时候使用Looper.prepare

Handler类怎么会算线程呢,它是用来发送和处理消息用的,而Looper类是用来存储消息队列以及处理消息循环的一个封装类。UI线程本身已经实现了消息队列,所有可以直接创建Handler类而自己创建的线程要实现消息处理,必须调用Looper.prepare()来创建消息队列以及其他一些步骤的初始化,再创建Handler,最后调用Looper.loop()实现消息循环

怎么获得当前线程的looper

  Looper.prepare()方法在当前线程里面调用,目的是创建一个新的Looper,且一个线程只能创建一个Looper.  public static void prepare() {  if (sThreadLocal.get() != null) {  throw new RuntimeException("Only one Looper may be created per thread");  }  sThreadLocal.set(new Looper());  }  public void set(T value) {  Thread currentThread = Thread.currentThread();  Values values = values(currentThread);  if (values == null) {  values = initializeValues(currentThread);  }  values.put(this, value);  }  可以看出set的时候绑定了currentThread。

looper鼓击什么牌子好?

JOYO卓乐效果不错音质清晰,表面平滑完整是不错的选择。JOYO卓乐科技,成立于2006年,起初为开发生产电子调音器,现为中国最大的单块效果器开发、设计、生产于一体的科技公司。自成立以来一直处于快速发展状态,吸引了大批手工单块工程师的加入,产品深受国内外乐手们的喜爱。卓乐旗下独立运作的高端品牌,它是能够让你做出属于你自己音色的单块效果器,音乐发烧友的最爱。深圳市卓乐科技有限公司是一家专注和精于开发、生产,销售音乐教育电子数字产品的科技公司。公司拥有一批敬业和经验丰富的优秀开发、生产、销售人员。拥有先进的管理理念,理性化的制度,采用优越的电脑管理软件

ThreadLocal如何保证一个线程只能有一个Looper?

我们都知道在调用Looper.prepare的时候会创建一个Looper,那么是如何保证一个线程只有一个Looper的? 首先要知道Looper中有一个sThreadLocal变量,ThreadLocal用于存储上下文信息 并且用final static 修饰,所以它是唯一的内容不可变的 了解sThreadLocal是干啥用的后,再来看看prepare 先调用sThreadLocal.get()方法 而ThreadLocalMap 是一个HashMap,那么取到一个HashMap后判断是否为null 如果不存在key为sThreadLocal的节点,得到value = null,并把这个value作为sThreadLocal的值即<sThreadLocal,null>;如果map为null,则创建一个HashMap并把<sThreadLocal,null>节点加入 这样get方法就要么取到一个Looper,要么就是null,如果为Looper则抛异常,如果为null,则调用sThreadLocal.set() 其实都是把Looper作为sThreadLocal的value值 回到开头说的,怎么保证一个线程只有一个Looper? 因为sThreadLocal是线程的上下文,并且唯一,而线程中存有<sThreadLocal,Looper>key-value键值对,所以一个sThreadLocal对应一个Looper,并且再次修改Looper是,会抛异常,因为Looper已经存在。 所以一个线程只有一个Looper。 如果对HashMap还不了解的同学,这篇文章可能对你有一定帮助 HashMap原理

android中looper的实现原理,为什么调用looper.prepare就在当前线程关联了一个lo

实际上:消息发送和计划任务提交之后,它们都会进入某线程的消息队列中,我们可以把这个线程称之为目标线程。不论是主线程还是子线程都可以成为目标线程。上例中之所以在主线程中处理消息,是因为我们要更新UI,按照android中的规定我们必须由主线程更新UI。所以我们让主线程成为了目标线程。那么如何控制让某个线程成为目标线程呢?这就引出了Looper的概念。Android系统中实现了消息循环机制,Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环。Android系统中的通过Looper帮助线程维护着一个消息队列和消息循环。通过Looper.myLooper()得到当前线程的Looper对象,通过Looper.getMainLooper()得到当前进程的主线程的Looper对象。前面提到每个线程都可以有自己的消息队列和消息循环,然而我们自己创建的线程默认是没有消息队列和消息循环的(及Looper),要想让一个线程具有消息处理机制我们应该在线程中先调用Looper.prepare()来创建一个Looper对象,然后调用Looper.loop()进入消息循环。如上面的源码所示。当我们用Handler的构造方法创建Handler对象时,指定handler对象与哪个具有消息处理机制的线程(具有Looper的线程)相关联,这个线程就成了目标线程,可以接受消息和计划任务了。Handler中的构造方法如下:[java] view plaincopyprint?public Handler() { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can"t create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback = null; } public Handler(Looper looper) { mLooper = looper; mQueue = looper.mQueue; mCallback = null; } public Handler() { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can"t create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback = null; } public Handler(Looper looper) { mLooper = looper; mQueue = looper.mQueue; mCallback = null; }在上述的计时器的例子中,之所以可以在主线程中处理消息而我们自己并没有调用Looper.prepare()等方法,是因为Android系统在Activity启动时为其创建一个消息队列和消息循环,当我们用无参的Handler构造方法创建对象时又用了当前线程的Looper对象,及将handler与主线程中的Looper对象进行了关联。android中是使用Looper机制来完成消息循环的,但每次创建线程时都先初始化Looper比较麻烦,因此Android为我们提供了一个HandlerThread类,他封装了Looper对象,是我们不用关心Looper的开启和释放问题。不管是主线程还是其他线程只要有Looper的线程,别的线程就可以向这个线程的消息队列中发送消息和任务。我们使用HandlerThread类代替上一篇文章中的子线程,并用HandlerThread类中的Looper对象构造Handler,则接受消息的目标线程就不是主线程了,而是HandlerThread线程。代码如下:[java] view plaincopyprint?public class clockActivity extends Activity { /** Called when the activity is first created. */ private String TAG="clockActivity"; private Button endButton; private TextView textView; private int timer=0; private boolean isRunning=true; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); endButton=(Button)findViewById(R.id.endBtn); textView=(TextView)findViewById(R.id.textview); endButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub isRunning=false; } }); HandlerThread thread=new HandlerThread("myThread"); handler=new Handler(thread.getLooper());//与HandlerThread中的Looper对象关联 thread.start(); Runnable r=new Runnable(){ @Override public void run() { // TODO Auto-generated method stub if(isRunning){ textView.setText("走了"+timer+"秒"); timer++; handler.postDelayed(this, 1000);//提交任务r,延时1秒执行 } } }; handler.postDelayed(r, 1000); } }   public class clockActivity extends Activity { /** Called when the activity is first created. */ private String TAG="clockActivity"; private Button endButton; private TextView textView; private int timer=0; private boolean isRunning=true; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); endButton=(Button)findViewById(R.id.endBtn); textView=(TextView)findViewById(R.id.textview); endButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub isRunning=false; } }); HandlerThread thread=new HandlerThread("myThread"); handler=new Handler(thread.getLooper());//与HandlerThread中的Looper对象关联 thread.start(); Runnable r=new Runnable(){ @Override public void run() { // TODO Auto-generated method stub if(isRunning){ textView.setText("走了"+timer+"秒"); timer++; handler.postDelayed(this, 1000);//提交任务r,延时1秒执行 } } }; handler.postDelayed(r, 1000); }}  此时处理任务会在handlerThread线程中完成。当然这个例子会出线异常:依然是因为在非主线程中更新了UI。这样做只是为了大家能够理解这种机制。  深入理解Android消息处理机制对于应用程序开发非常重要,也可以让我们对线程同步有更加深刻的认识,希望这篇文章可以对朋友们有所帮助。

缝纫机零件looper是什么?

是“环套”的意思。

Android-Looper

Looper.loop是一个死循环,拿不到需要处理的Message就会阻塞,那在UI线程中为什么不会导致ANR? 首先我们来看造成ANR的原因: 1.当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了) 2.当前的事件正在处理,但没有及时完成 我们再来看一下APP的入口ActivityThread的main方法: 显而易见的,如果main方法中没有looper进行死循环,那么主线程一运行完毕就会退出,会导致直接崩溃,还玩什么! 现在我们知道了消息循环的必要性,那为什么这个死循环不会造成ANR异常呢? 我们知道Android 的是由事件驱动的,looper.loop() 不断地接收事件、处理事件,每一个点击触摸或者说Activity的生命周期都是运行在 Looper的控制之下,如果它停止了,应用也就停止了。只能是某一个消息或者说对消息的处理阻塞了 Looper.loop(),而不是 Looper.loop() 阻塞它,这也就是我们为什么不能在UI线程中处理耗时操作的原因。 主线程Looper从消息队列读取消息,当读完所有消息时,主线程阻塞。子线程往消息队列发送消息,唤醒主线程,主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠。因此loop的循环并不会对CPU性能有过多的消耗。 初始化当前线程和Looper,这样可以在实际开始启动循环(loop())之前创建一个Handler并且关联一个looper。确保在先调用这个方法,然后调用loop()方法,并且通过调用quit()结束。 这里面的入参boolean表示Looper是否允许退出,true就表示允许退出,对于false则表示Looper不允许退出。 初始化当前当前线程的looper。并且标记为一个程序的主Looper。由Android环境来创建应用程序的主Looper。因此这个方法不能由咱们来调用。另请参阅prepare() 这里的sThreadLocal.get()是和prepare(boolean)方法里面的sThreadLocal.set(new Looper(quitAllowed));一一对应的。而在prepareMainLooper()方法里面。 退出循环 将终止(loop()方法)而不处理消息队列中的任何更多消息。在调用quit()后,任何尝试去发送消息都是失败的。例如Handler.sendMessage(Message)方法将返回false。因为循环终止之后一些message可能会被无法传递,所以这个方法是不安全的。可以考虑使用quitSafely()方法来确保所有的工作有序地完成。 安全退出循环 调用quitSafely()方法会使循环结束,只要消息队列中已经被传递的所有消息都将被处理。然而,在循环结束之前,将来不会提交处理延迟消息。 调用退出后,所有尝试去发送消息都将失败。就像调用Handler.sendMessage(Message)将返回false。

Android之Looper使用

Looper是Android中用于实现消息循环的一个类,它和Handler、MessageQueue、Message等一起组成了异步消息处理机制。通过它,我们可以在后台线程中实现UI更新等操作。使用Looper,一般需要以下步骤:1. 在子线程中创建Looper对象,并开启消息循环:```javaLooper.prepare();Looper.loop();```2. 在子线程中创建Handler对象,并通过Handler对象发送消息到消息队列中:```javaHandler handler = new Handler() { @Override public void handleMessage(Message msg) { // 在这里处理消息 }};handler.sendEmptyMessage(0);```3. 在主线程中创建Handler对象,并通过Handler对象发送消息到子线程中的消息队列中:```javanew Thread(new Runnable() { @Override public void run() { Looper.prepare(); Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 在这里处理消息 } }; Looper.loop(); }}).start();Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 在这里发送消息到子线程 handler.sendEmptyMessage(0); }};```需要注意的是,子线程中的消息循环要在消息发送之前开启,在消息处理完成之后才能结束,否则程序会崩溃。同时,在子线程退出前,需要调用Looper.quit()方法来结束消息循环。另外,在使用Looper时还需要注意避免内存泄露问题,避免使用匿名内部类等操作。

looper上单崩过吗

Looper上单崩过吗?上单这个位置不同的选手风格差异很大,不同的版本上单霸主就会不同,但唯独Looper,他可以做到跨版本C,在上单坦克的版本,他是能掏出坦克来carry,基本上没有能难倒他的英雄,在他的帮助下,MLXG一度成为顶级肉食性打野。  Looper选手个人资料  ID:Looper  姓名:蒋(张)亨硕  年龄:28  擅长英雄:炼金、蒙多、大树、兰博、奎因、艾克  探龙点评:纵观整个英雄联盟职业赛上,有一个算一个,到现在为止也没有一个像Looper这样的选手,绝活海,拿出来就能C,你都不知道他什么时候练得,从肉到刺客,从法师到战士,都是他的拿手好戏,最可怕的是,Looper就像一颗石头,很难把他当做突破口。  Looper职业生涯  SSW在2014年夺得S4全球总决赛冠军之后,五个选手便开始了他们的魔幻人生,有的成为教练指点江山背起黑锅,有的后院着火净身出户,而大多数人却成为韩援,来到LPL,用剩下的职业生涯换来一张白纸黑字的合同,而Looper也是如此,无论是在M3还是RNG,Looper都是既当爹又当妈,拿着坦克要抗压,打团还要补输出,不到两年,便对职业和英雄联盟没了兴趣,退役后决定重返校园,而不是当主播养老,咱也不知道LPL有何等魔力,把他折磨成这样,只能说生不逢时,但凡他在年轻几年,赶上新一代LPL选手,还是有希望再LPL取得成绩的,好巧不巧,来的这两年恰逢第一代高手要么变捞,要么退役,而天才少年都在青训等着18出山。
 首页 上一页  29 30 31 32 33 34 35 36 37 38 39  下一页  尾页