open

阅读 / 问答 / 标签

js使window.open打开的弹窗不可移动,双击标题栏无效,最小化无效

window.open ("page.html", "newwindow", "height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no") height=100 窗口高度; width=400 窗口宽度; top=0 窗口距离屏幕上方的象素值; left=0 窗口距离屏幕左侧的象素值; toolbar=no 是否显示工具栏,yes为显示; menubar,scrollbars 表示菜单栏和滚动栏。 Resizable=no 是否允许改变窗口大小,yes为允许; location=no 是否显示地址栏,yes为允许; status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;

window.open的窗口特性

feature参数是一个用逗号分隔的功能列表。如果该参数为空或者没有指定该参数,新的窗口将拥有所有的功能。另一方面,如果feature参数只指定了某一项或某几项功能,那么其他没有被指定的功能将不会出现在新的窗口中。该字符串不能包含任何空格或其它空字符串。列表中的每个元素的格式:功能[=值]对于绝大多数的功能来说,它们的值一般都是yes或no。对这些功能,等号和值都可以省略不写。对于 width和height特性, 必须给它们指定一个以像素为单位的值。以下是一些普遍支持的功能和它们的含义:alwaysLoweredInternet Explorer:不支持Navigator:版本 4+指定窗口总是保留在堆栈的最下面。换言之,不管新窗口是否激活,总是其他窗口下。window.open(alwayslowered.html,_blank,alwaysLowered);alwaysRaised  Internet Explorer:不支持Navigator:版本 4+指定窗口总是保留在堆栈的最上面。换言之,不管新窗口是否激活,总是其他窗口上。window.open(alwaysraised.html,_blank,alwaysRaised);channelmodeInternet Explorer:版本 4+Navigator:不支持指定是否按照剧场模式显示窗口,以及是否显示频道区。window.open(channelmode.html,_blank,channelmode);dependentInternet Explorer:不支持Navigator:版本 4+定义是否窗口成为当前打开窗口的依赖子窗口。依赖窗口就是当它的父窗口关闭时,它也随即关闭。在windows平台上,一个依赖窗口不会在任务栏上显示。window.open(dependent.html,_blank,dependent);directoriesInternet Explorer:所有版本Navigator:所有版本指定是否显示目录按钮(比如众所周知的What"s Cool and What"s New 按钮)。Internet Explorer将这些目录按钮引用为链接工具栏,Navigator(版本4和以上)称之为个人工具栏。window.open(directories.html,_blank,directories);fullscreenInternet Explorer:版本 4+Navigator:不支持定义是否按照全屏方式打开浏览器。请小心使用全屏模式,因为在这种模式下,浏览器的标题栏和菜单都被隐藏,所有你应该提供一个按钮或者其他可视的线索来帮助用户关闭这个窗口。当然,使用热键ALT+F4也能关闭窗口。window.open(fullscreen.html,_blank,fullscreen);heightInternet Explorer:所有版本Navigator:所有版本以象素pixel为单位定义窗口文档显示区域的高度,最小数值是100。如果仅仅定义高度,Internet Explorer使用给定的高度和默认的宽度。对于Navigator,如果不同时指定width或者innerWidth,那么就将忽略这个属性。window.open(height.html,_blank,height=200,width=300);hotkeysInternet Explorer:不支持Navigator:版本 4+如果没有定义(或者为0),那么就屏蔽了没有菜单条的新窗口的大部分热键。但是安全以及退出热键仍然保留。window.open(hotkeys.html,_blank,hotkeys=0,menubar=0);innerHeightInternet Explorer:不支持Navigator:版本 4+以象素pixel为单位定义窗口文档显示区域的高度,最小数值是100。在Navigator版本4中,这个特征替换height,为得是保持向后兼容。对于Navigator,如果不同时指定width或者innerWidth,那么就将忽略这个属性。window.open(innerheight.html,_blank,innerHeight=200,innerWidth=300);innerWidthInternet Explorer:不支持Navigator:版本 4+以象素pixel为单位定义窗口文档显示区域的宽度,最小数值是100。在Navigator版本4中,这个特征替换width,为得是保持向后兼容。对于Navigator,如果不同时指定height或者innerHeight,那么就将忽略这个属性。window.open(innerwidth.html,_blank,innerHeight=200,innerWidth=300);leftInternet Explorer:版本 4+Navigator:不支持以象素为单位定义窗口的X左标。window.open(left.html,_blank,left=20);locationInternet Explorer:所有版本Navigator:所有版本定义是否显示浏览器中供地址URL输入的文本域。window.open(location.html,_blank,location);menubarInternet Explorer:所有版本Navigator:所有版本定义是否显示菜单条(菜单条位于窗口顶部,包括“文件”和“编辑”等)。window.open(menubar.html,_blank,menubar);outerHeightInternet Explorer:不支持Navigator:版本 4+以象素为单位定义窗口(它的外部边界)的总高度,最小数值比100多一些,因为窗口内容区域的高度必须至少是100。如果没有同时定义outerWidth,Navigator将忽视这个特征。window.open(outerheight.html,_blank,outerHeight=200,outerWidth=300);outerWidthInternet Explorer:不支持Navigator:版本 4+以象素为单位定义窗口(它的外部边界)的总宽度,最小数值比100多一些,因为窗口内容区域的宽度必须至少是100。如果没有同时定义outerHeight,Navigator将忽视这个特征。window.open(outerwidth.html,_blank,outerHeight=200,outerWidth=300);resizableInternet Explorer:所有版本Navigator:所有版本定义是否窗口可以通过它的边界进行大小缩放控制。依赖于平台不同,用户也许还有其他改变窗口大小的方法。window.open(resizable.html,_blank,resizable);screenXInternet Explorer:不支持Navigator:版本 4+以象素为单位定义窗口的X坐标。window.open(screenx.html,_blank,screenX=20);screenYInternet Explorer:不支持Navigator:版本 4+以象素为单位定义窗口的Y坐标。window.open(screeny.html,_blank,screenY=20);scrollbarsInternet Explorer:所有版本Navigator:所有版本定义是否激活水平和垂直滚动条。window.open(scrollbars.html,_blank,scrollbars);statusInternet Explorer:所有版本Navigator:所有版本定义是否在窗口的下部添加状态栏。window.open(status.html,_blank,status);titlebarInternet Explorer:Version 5+Navigator:版本 4+定义是否显示窗口的标题栏。在Internet Explorer中,除非调用者是一个HTML应用程序或者一个可信任的对话框,那么这个特征是被屏蔽的。window.open(titlebar.html,_blank,titlebar=0);toolbarInternet Explorer:所有版本Navigator:所有版本定义是否显示浏览器的工具栏(位于窗口的上部,包括“后退”和“向前”)。window.open(toolbar.html,_blank,toolbar);topInternet Explorer:版本 4+Navigator:不支持以象素为单位定义窗口的纵坐标。window.open(top.html,_blank,top=20);widthInternet Explorer:所有版本Navigator:所有版本以象素pixel为单位定义窗口文档显示区域的宽度,最小数值是100。如果仅仅定义宽度,Internet Explorer使用给定的宽度和默认的高度。对于Navigator,如果不同时指定height或者innerHeight,那么就将忽略这个属性。window.open(width.html,_blank,height=200,width=300);z-lockInternet Explorer:不支持Navigator:版本 4+定义窗口激活时不在堆栈中浮起,就是说,新窗口当被激活时并不能位于其他窗口之上。window.open(zlock.html,_blank,z-lock);

用js window.open在新窗口中打开链接,关于设置URL地址设置为变量的问题

你明明已经把href传到openwin方法中了,但是你没有接收,把openwin改下function openwin(url) {alert(url); //获取不到href属性window.open (url,"newwindow","height=600,width=800") ;}

如何在父窗口中得知window.open()出的子窗口关闭事件_javascript技巧

代码如下: var timer var winOpen function IfWindowClosed() { if (winOpen.closed == true) { document.fm_Info.txtValue.value="child closed" window.clearInterval(timer) } } document.fm_Info.txtValue.value="" winOpen=window.open("child.htm","","toolbar=no, location=no, directories=no, status=no, menubar=no" ) timer=window.setInterval("IfWindowClosed()",500);

window.open 怎么去掉最大化和最小化按钮?(js)

在窗体的属性中,将FormBorderStyle改为FixedToolWindow即可

如何关闭用window.open打开的窗口?

利用以下代码<img src="B窗口的图片" onclick="this.close();" />

window.open 打开新窗口带有原来地址怎么处理

地址加上 http:// 试试

关于opencv mat类型和countNonZero函数

这个代码是偏matlab风格的,意思就是以矩阵为基础来进行的计算或者比较,你这个时候应该把UCHAR_MAX看成是大小与oROI一样,每个元素都为UCHAR_MAX的矩阵,然后把每个UCHAR_MAX中和oROI中的对应位置上的元素相比较,得到的结果仍然还是一个大小与oROI一样的矩阵,这个时候它的元素就应该是0或者1了,那么countNonZero就是计算这个矩阵中1的个数。所以能用int a = (oROI<UCHAR_MAX)&(oROI>0)类型是不匹配的

求助 linux c 编写openssl socket套接字通信 运行时报错 网络编程 不知道该怎么办啊

1.TCP流式套接字的编程步骤在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);客户端代码如下:#include <Winsock2.h>#include <stdio.h>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );加载套接字库if ( err != 0 ) {return;}if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) {WSACleanup()( );return; }SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);创建套接字(socket)。SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。char recvBuf[100];和服务器端进行通信(send/recv)。recv(sockClient,recvBuf,100,0);printf("%s ",recvBuf);send(sockClient,"This is lisi",strlen("This is lisi")+1,0);closesocket(sockClient);关闭套接字。WSACleanup()();//必须调用这个函数清除参数}

Ajax下同步异步执行下,用window.open()打开窗口的原理是什么?为什么会不一样?

我觉得原因是:

VB Open 提示 文件己打开

在保存之前加个判断。。

open and squash什么意思

open and squash开放和南瓜

什么是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,一般在安装谷歌地球时,启动模式有这二种区分)

如何查看自己电脑支持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函数glGetFloatv(GL_MODELVIEW_MATRIX, m)效率问题

额,好像没有,我目前也是这样用的

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模式确实更好,尤其是鼠标不会那么飘。

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且硬件不支持时模拟,你要用大量代码分析硬件能力和采取不同策略

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

英语中,终止性动词open转延续性动词为什么是be open,而不是be opened?

open (动词)~be open (形容词)

theopenwindow课件vera讲了几个故事

一个故事。《敞开的窗户》:主要讲述了15岁少女薇拉面对一位陌生客人的来访,以姨妈家“开着的窗户”为题即兴编造了一个鬼故事。

theopenwindow的vera讲了几个故事

theopenwindow的vera讲了两个故事。《TheOpenWindow》讲的是一个小女孩如何利用故事中不同人物在时空上的错位,发挥自己强大的想象力和故事叙述能力,将自己不拘于传统规定的叛逆精神,用眼神、语气与肢体的形式传达表现出来的故事。

ogc标准的wms服务和opengis的wms服务一样吗

是一样的,因为OGC标准是统一的,他下面的服务必须是一样的,不然这个行业就没有办法使用了。ArcGIS server发布的WMS服务,用openjs都可以调用的!

怎么使用opencv的stitch进行cuda加速?

做过相关实验,其实opencv对于cuda的优化并不是特别好,也可能是我用的显卡性能不行。实验结果是并没有比cpu快多少。opencv的cuda编程的程序,主要处理时间都浪费在从内存向显存中拷贝数据以及从显存向内存拷贝数据了。要想写出高效的cuda程序,需要注意的东西很多。

rgb空间转换为luv颜色空间opencv

cvtColor(img,img,CV_BGR2Luv)

是一个口词填空题 It comes from the open land.答案给的是up,请问该怎么翻译呀

Workers are busy on the open land greening, fresh turf dissemination of fragrance in the air. 工人们正忙着对裸露的土地进行绿化,新鲜的草皮在空气中传播着芬芳。 the open land可译成旷野come up 走近;发生;开始;上升;发芽;被提出 It comes up from the open land它就在旷野发芽了.

ONOS与OpenDayLight有什么本质区别

ONOS和ODL分别由运营商和厂商主导,所代表的利益不同,也就分别选择了两种不同的SDN演进方式。前者更贴近于SDN诞生之初时狭义的SDN概念,即通过OpenFlow将控制平面和转发平面完全分离,网络设备只是进行转发的黑盒子,通过Controller完成一切计算。ONOS所选择的理念与运营商自己的利益息息相关,只有将控制能力拿到自己手里,才能在整条产业链上逐步摆脱设备厂商的控制。通过使用更为廉价的转发设备替代原有的厂商设备,一方面在眼下增加自己与设备厂商的议价砝码,另一方面长远看能大大降低网络的建设和维护成本。相比较而言,ODL则采取了更为平缓的SDN演进方式,从理念上更为贴近广义的SDN,即不局限于OpenFlow协议,不局限于完全将控制平面从转发设备上剥离,通过已有的网络协议将部分的控制逻辑放到Controller上。这样的理念使广义的SDN技术的落地更容易成为现实,一方面通过保护运营商、企业等设备厂商客户的既有投资,使客户可以真正感受到SDN技术的实际效果。另一方面,通过在现有设备上扩展已有的网络协议,厂商能够使自己的设备在不用伤筋动骨就能保有竞争力,避免自己在SDN的革命中被迅速甩下。从技术上讲,SDN Controller实际上解决的是南向与设备的通信问题和北向向APP提供的资源问题,网络运营者根据自己网络的业务特点提出的控制逻辑则需要开发APP来实现。从南向接口上看,ONOS目前成熟的南向接口只有OpenFlow,而ODL Helium版则支持OpenFlow、OVS-DB、MP-BGP、PCEP、NETCONF/YANG等极为丰富的南向接口以连接不同类型的设备。从北向接口上看,ODL采用的MD-SAL使得设备资源可以通过YANG model直接转换为RESTConf API,而ONOS还在某种程度上停留在ODL最初版本使用的AD-SAL架构,API需要在plugin设计时单独考量。当然除此之外,Controller的性能与Scale out也是必须面对的问题。对此,ONOS确实抓住了ODL尚未解决的问题,从一开始就从这两方面抢占先机,拨人眼球。不过从二者实现上都采用了JAVA的Karaf框架来看,性能与Scale out问题在根本上也不会存在先天的差别,面对海量计算采用Cluster会是最终的解决方法,而实际上两个控制器都提供了相应的Cluster部署方案。唯一的问题可能是ODL还需要应对多种南向接口带来的额外消耗,但ODL提供的是南向接口的可选能力,实际部署上也很少会出现多种协议共存的情况。但值得一提的是,尽管ONOS主推OpenFlow,但在其Wiki上也列出了合作厂商正在ONOS上开发PCEP、TL1等南向接口,所以也许不久之后我们就会看到ONOS也开始支持各种各样的南向接口了

ONOS与OpenDayLight有什么本质区别

ONOS与OpenDayLight的本质区别如下:1、 Opendaylight成立时间比ONOS早, 开发者也多过ONOS, 所以成熟度上ODL要超过ONOS的。ODL主要是由各个厂商组成的一个开源平台, 南向支持包括Openflow在内的多种协议, 6月底发布的锂版本中ODL又增加了6种南向协议。 目前使用ODL的运行商也很多, AT&T Domain 2.0里面主要使用的就是ODL的SDN控制器, 另外comcast, cablelabs, telephonica还有Orange等大小运行商都在使用ODL, 目前在ODL上面开发的公司已经有20多家,预计明年会达到40-50家。2、ONOS起源是斯坦福主导的ON.Lab, 去年底开始公开一些代码, 他们主要是从运行商的用例开始, 然后在分布,集群和高可靠等方面做了一些加强。因为他们目前的code base不大, 所以,比较容易做一些优化。 在功能,支持南向协议等方面, 还比不上ODL。另外, ONOS目前不是模型驱动的, ODL中的MD-SAL,和对YANG模型的支持是ONOS中没有的。3、ONOS目前还在起步阶段, 在数据中心中现在几乎没有支持, 在运行商领域ODL与ONOS各有千秋。 其实两者目前看互补程度甚至超过冲突部分。

OpenDaylight详细介绍

OpenDaylight(ODL)是Linux基金会负责管理的开源项目,是一款使用JAVA开发的控制器,提供一套基于SDN开发的模块化、可扩展、可升级、支持多协议的控制器框架,目的是推动SDN技术的创新实施和透明化。 SDN(Software Defined Network)即软件定义网络,是一种网络设计理念,或者一种推倒重来的设计思想。DN的理念是将原来封闭在通用网络硬件的控制平面抽取、独立出来并软件化为SDN控制器,这个控制器如同网络的“大脑”控制网络中的所有设备,而原来的通用网络硬件只需要听从SDN控制器的命令进行“傻瓜式”转发就可以了。其简单模型如图所示:SDN网络的三大技术特征: ODL控制器项目架构大致如下:ODL在设计的时候遵循了六个基本的架构原则(以下来自opendaylight官方文档): 1、运行时模块化和扩展化(Runtime Modularity and Extensibility):支持在控制器运行时进行服务的安装、删除和更新。 2、多协议的南向支持(Multiprotocol Southbound):南向支持多种协议。 3、服务抽象层(Service Abstraction Layer):南向多种协议对上提供统一的北向服务接口。Hydrogen中全线采用AD-SAL,Helium版本AD-SAL和MD-SAL共存,Lithium和Beryllium中已基本使用MD-SAL架构。 4、开放的可扩展北向API(Open Extensible Northbound API):提供可扩展的应用API,通过REST或者函数调用方式。两者提供的功能要一致。 5、支持多租户、切片(Support for Multitenancy/Slicing):允许网络在逻辑上(或物理上)划分成不同的切片或租户。控制器的部分功能和模块可以管理指定切片。控制器根据所管理的分片来呈现不同的控制观测面。 6、一致性聚合(Consistent Clustering):提供细粒度复制的聚合和确保网络一致性的横向扩展(scale-out)。 1、OSGi框架 OSGi(Open Service Gateway Initiative,直译为“开放服务网关”),是一个以Java为技术平台的动态模块化规范。OSGi中规定如何定义一个模块以及模块之间如何交互,Java模块被称为Bundle,OSGi就是为了使Bundle能更好的被复用。基于OSGi的应用是由一个个Bundle组成的,这些Bundle通过OSGi组织在一起,形成了一个系统。OSGI框架分层: 2、Bundle OSGi如果说是Java的模块开发体系,Bundle就是模块。OSGi中每个Bundle都有自己的类加载器,支持包级别的类导入和类导出,Bundle通过配置MANIFEST.MF,可以控制从Bundle导出的包,而没有导出的包则在Bundle外部是无法访问的。这样就完成了内部包和外部包的隔离。 3、KARAF是Apache旗下的开源项目,同时也是一个基于OSGI的运行环境,可以用于部署各种组件和应用程序。 4、Maven是现在Java社区中最强大的项目管理和项目构建工具。 5、Netty:java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。OpenDaylight南向使用Netty来管理底层的并发IO。 6、Jersey:开源的RESTful框架,实现了JAX-RS (JSR 311 & JSR 339) 规范。OpenDaylight北向使用Jersey提供REST接口。 还有其他很多用到的技术就不一一介绍了,有兴趣的朋友可以去网上搜索一下。

CY open 和 CY closing 分别是指什么意思

CY OPEN: 开港日,即重柜可以还回船公司码头的时间,如果提前还柜会产生仓租和柜租费用--------------只有仓租不会再有柜租CY CLOSING:截关时间,重柜还码头的截止时间,过了这个时间则无法赶上船期,不过可以向船公司申请LATECOME纠正下ALTIA-YU@HOTMAIL.COM

open shelving是什么意思

开放式货架双语对照例句:1.The three levels of open shelving above the pass contain plates, pastry casesand scores of small jugs and copper pans for the sauces. 在传菜区的上方,开放架上的三层用来放置盘子、糕点盒和一些盛放调料的小壶和铜制器皿。开放式货架双语对照例句:1.The three levels of open shelving above the pass contain plates, pastry casesand scores of small jugs and copper pans for the sauces. 在传菜区的上方,开放架上的三层用来放置盘子、糕点盒和一些盛放调料的小壶和铜制器皿。开放式货架双语对照例句:1.The three levels of open shelving above the pass contain plates, pastry casesand scores of small jugs and copper pans for the sauces. 在传菜区的上方,开放架上的三层用来放置盘子、糕点盒和一些盛放调料的小壶和铜制器皿。

对open access熟知的同胞能否告知有哪些好处啊,看到美国科研出版社是OA期刊,想投稿。。

上面同学 提到的美国科研出版社的《临床医学》IJCM这篇文章,因为是OPEN ACCESS的,也就是所有的文章都可以免费阅读和下载。我也在该期刊出版社网站下载看过,这文章点击下载量之所以多,是因为文章写的确实很好,同时也说明作为平台的该期刊质量水平较高层次,通过这本期刊网站的Indexing看到其已经被CrossRef、Google Scholar、CAS、CSP、Gale、SHERPA/RoMEO、ProQuest、DOAJ等数据库收录,影响因子当然不小咯。

whip the door open,为什么要用whip这个词

您好, whip这个词除了您说到的鞭打的意思外,还有个意思迅速挪动,移动,作出什么什么的意思,那在这句话里就该是迅速开门的意思了

opencv的cv::resize和qt的QImage::scaled哪个更快?

效率不清楚,用cvLoadimage()吧。scaled缩小图片后失真太严重了。

opencart,zencart还有magento和ueeshop哪个好

magento的操作比较复杂些,浪费时间,UEESHOP的挺好的

prestashop、zencart、opencart、magento哪一个好?

哪一个好?要看从哪一个角度去衡量了。论功能和插件丰富程度,magento好像首屈一指吧,其次是zencart和opencart.从未来的发展角度看,opencart凭借其优秀的MVC-L架构会有很好的前景。

True Type字体和open type字体有什么区别?

TrueType是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。它用数学函数描述字体轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,其特点是:TrueType既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对PostScript字体来说,其质量要差一些。特别是在文字太小时,就表现得不是很清楚。TrueType字体,中文名称全真字体。它具有如下优势:①真正的所见即所得字体。由于True-Type字体支持几乎所有输出设备,因而无论在屏幕、激光打印机、激光照排机上,还是在彩色喷墨打印机上,均能以设备的分辨率输出,因而输出很光滑。②支持字体嵌入技术。存盘时可将文件中使用的所有TrueType字体采用嵌入方式一并存入文件之中,使整个文件中所有字体可方便地传递到其它计算机中使用。嵌入技术可保证未安装相应字体的计算机能以原格式使用原字体打印。③操作系统的兼容性。MAC和PC机均支持TrueType字体,都可以在同名软件中直接打开应用文件而不需要替换字体。OpenType,是一种可缩放字型(scalable font)电脑字体类型,采用PostScript格式,是美国微软公司与Adobe公司联合开发,用来替代TrueType字型的新字型。这类字体的文件扩展名为.otf,类型代码是OTTO,现行标准为OpenType 1.4。OpenType最初发表于1996年,并在2000年之后出现大量字体。它源于微软公司的TrueType Open字型,TrueType Open字型又源于TrueType字型。OpenType font包括了Adobe CID-Keyed font技术。Adobe公司已经在2002年末将其字体库全部改用OpenType格式。到2005年大概有一万多种OpenType字体,Adobe产品占了三分之一。

OpenType字体与TrueType字体的区别

TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,其特点是:TrueType既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对PostScript字体来说,其质量要差一些。特别是在文字太小时,就表现得不是很清楚。 OpenType也叫Type 2字体,是由Microsoft和Adobe公司开发的另外一种字体格式。它也是一种轮廓字体,比TrueType更为强大,最明显的一个好处就是可以在把PostScript字体嵌入到TrueType的软件中。并且还支持多个平台,支持很大的字符集,还有版权保护。可以说它是Type 1和TrueType的超集。OpenType的主要优点:1)增强的跨平台功能 2)更好的支持Unicode标准定义的国际字符集 3)支持高级印刷控制能力 4)生成的文件尺寸更小 5)支持在字符集中加入数字签名,保证文件的集成功能。OpenType标准还定义了OpenType文件名称的后缀名。包含TureType字体的OpenType文件后缀名为.ttf,包含PostScript字体的文件后缀名为.OTF。如果是包含一系列TrueType字体的字体包文件,那么后缀名为.TTC。

opentype字体,truetype字体,分别怎么安装

truetype采用几何学中二次b样条曲线及直线来描述字体的外形轮廓,其特点是:truetype既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对postscript字体来说,其质量要差一些。特别是在文字太小时,就表现得不是很清楚。opentype也叫type2字体,是由microsoft和adobe公司开发的另外一种字体格式。它也是一种轮廓字体,比truetype更为强大,最明显的一个好处就是可以在把postscript字体嵌入到truetype的软件中。并且还支持多个平台,支持很大的字符集,还有版权保护。可以说它是type1和truetype的超集。opentype的主要优点:1)增强的跨平台功能2)更好的支持unicode标准定义的国际字符集3)支持高级印刷控制能力4)生成的文件尺寸更小5)支持在字符集中加入数字签名,保证文件的集成功能。opentype标准还定义了opentype文件名称的后缀名。包含turetype字体的opentype文件后缀名为.ttf,包含postscript字体的文件后缀名为.otf。如果是包含一系列truetype字体的字体包文件,那么后缀名为.ttc。

OpenType字体与TrueType字体的区别

TrueType是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。它用数学函数描述字体轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,其特点是:TrueType既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。但相对PostScript字体来说,其质量要差一些。特别是在文字太小时,就表现得不是很清楚。TrueType字体,中文名称全真字体。它具有如下优势:①真正的所见即所得字体。由于True-Type字体支持几乎所有输出设备,因而无论在屏幕、激光打印机、激光照排机上,还是在彩色喷墨打印机上,均能以设备的分辨率输出,因而输出很光滑。②支持字体嵌入技术。存盘时可将文件中使用的所有TrueType字体采用嵌入方式一并存入文件之中,使整个文件中所有字体可方便地传递到其它计算机中使用。嵌入技术可保证未安装相应字体的计算机能以原格式使用原字体打印。③操作系统的兼容性。MAC和PC机均支持TrueType字体,都可以在同名软件中直接打开应用文件而不需要替换字体。OpenType,是一种可缩放字型(scalable font)电脑字体类型,采用PostScript格式,是美国微软公司与Adobe公司联合开发,用来替代TrueType字型的新字型。这类字体的文件扩展名为.otf,类型代码是OTTO,现行标准为OpenType 1.4。OpenType最初发表于1996年,并在2000年之后出现大量字体。它源于微软公司的TrueType Open字型,TrueType Open字型又源于TrueType字型。OpenType font包括了Adobe CID-Keyed font技术。Adobe公司已经在2002年末将其字体库全部改用OpenType格式。到2005年大概有一万多种OpenType字体,Adobe产品占了三分之一。

True Type 同 Open Type有分别吗?

当然有 参考以下文章 基本上 OpenType 是源自于 MS 的 TrueType Open 字型,而 TrueType Open 字型是源自于 TrueType 字型,所以这些字型可以说是系出同门,基本的 container 格式是相同的。 TrueType Open font 和 TrueType font 最大的不同是: 增加了 GSUB(Glyph Substition) GPOS(Glyph Position) BASE(baseline) JSFF(Justification) GDEF(Glyph Definition) 等五个 table 来控制字的置放、取用机制。 OpenType font 和 TrueType Open font 最大的不同是: 引进 CFF table 来存放 ps outline 资料,这相当于 TTF 的 glyf table,这些都是主要的字型实体资料。 所以,在 OpenType font 会有两种不同字型实体资料的字型出现: TrueType format with TrueType outline(*.ttf *.ttc) TrueType format with PS outline(CFF)(*.otf) 或称为 CFF OpenType font。 因此,并不是说 *.ttf 就不是 OpenType font。主要还是要看里头的 table。会以 *.otf 做延伸档名的,通常就是 CFF OpenType,不同的地方是字型实体资料是 CFF(Compact Font Format) table,而不是原来 TTF 的 glyf table。 其他补充: OpenType font 包括了 Adobe CID-Keyed font 的技术,像目前 AR6/7 所附上的 OpenType font,其实是 CID-Keyed font 但穿上了 TrueType 的衣服(因为 CFF 本来就可以含 CID-Keyed font)。 只要判断出字型含有 DSIG(Digital Signature) table,大致上就可以判定他是 OpenType font。然后再来判断是含有 CFF table 或是 glyf table 就可以判断是 CFF outlines 或是 TrueType outlines。 参考: blog.bs2.to/post/EdwardLee/2341 en. *** /wiki/TrueType TrueType is an outline font standard originally developed by Apple Computer in the late 1980s as a petitor to Adobe"s Type 1 fonts used in PostScript. The primary strength of TrueType was originally that it offered font developers a high degree of control over precisely how their fonts are displayed right down to particular pixels at various font heights. (With widely varying rendering technologies in use today pixel-level control is no longer certain.) en. *** /wiki/OpenType OpenType is a scalable puter font format initially developed by Microsoft later joined by Adobe Systems. OpenType was first announced in 1996 with a significant number of OpenType fonts starting to ship in 2000–2001. Adobe pleted conversion of its entire font library to OpenType around the end of 2002. As of early 2005 there were around 10 000 fonts available in OpenType format with Adobe"s library making up under a third of the total. As of 2006 every major font foundry and many minor ones were developing fonts in OpenType format. 2007-05-07 15:36:48 补充: TrueType- AppleOpenType- Microsoft

snd_pcm_open需要包含什么头文件

alsa-lib主要是给抽象出来的一套ALSA应用程序的用户空间库,供具体的应用程序调用。alsa-utils 主要是相关的操作APP,可以充当官方demo,供开发人员参考。前文已经给出ALSA音频架构。本文主要详细分析snd_pcm_open。snd_pcm_open顺序图代码详细分析 (以播放为例)问题引入alsa_utils aplay.c 中的播放接口采用函数指针实现,具体定义如下static snd_pcm_sframes_t (*writei_func)(snd_pcm_t *handle, const void *buffer, snd_pcm_uframes_t size);登录后复制赋值如下 writei_func = snd_pcm_writei; readi_func = snd_pcm_readi; writen_func = snd_pcm_writen; readn_func = snd_pcm_readn;登录后复制snd_pcm_writei通过调用_snd_pcm_writei写入PCM数据流,_snd_pcm_writei函数原型如下static inline snd_pcm_sframes_t _snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size){ /* lock handled in the callback */ if (!pcm->fast_ops->writei) return -ENOSYS; return pcm->fast_ops->writei(pcm->fast_op_arg, buffer, size); // 播放函数指针}登录后复制_snd_pcm_writei会调用pcm->fast_ops->writei进行实际操作。查看aplay.c源码始终没有发现PCM设备中的结构体const snd_pcm_fast_ops_t *fast_ops在哪里初始化,极大可能在snd_pcm_open中进行了相应的操作。snd_pcm_open 具体分析alsa_utils aplay.c 中调用 snd_pcm_open 如下 ... char *pcm_name = "default"; ... err = snd_pcm_open(&handle, pcm_name, stream, open_mode); if (err < 0) { error(_("audio open error: %s"), snd_strerror(err)); return 1; }登录后复制snd_pcm_open 函数原型如下int snd_pcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode){ snd_config_t *top; int err; assert(pcmp && name); if (_snd_is_ucm_device(name)) { name = uc_mgr_alibcfg_by_device(&top, name); if (name == NULL) return -ENODEV; } else { err = snd_config_update_ref(&top); if (err < 0) return err; } err = snd_pcm_open_noupdate(pcmp, top, name, stream, mode, 0); snd_config_unref(top); return err;}登录后复制pcmp,即打开的PCM设备句柄; name,要打开的PCM设备名称,默认defaultstream,对应的PCM流类型,播放PCM流(SND_PCM_STREAM_PLAYBACK)和录音PCM流(SND_PCM_STREAM_CAPTURE)mode,打开方式,阻塞、非阻塞及异步等snd_pcm_open通过调用snd_config_update_ref来获取als.conf中的配置信息,参数保存至snd_config_t 。通过snd_pcm_open_noupdate 解析 snd_config_t 配置,snd_pcm_open_noupdate 函数原型如下static int snd_pcm_open_noupdate(snd_pcm_t **pcmp, snd_config_t *root, const char *name, snd_pcm_stream_t stream, int mode, int hop){ int err; snd_config_t *pcm_conf; const char *str; err = snd_config_search_definition(root, "pcm", name, &pcm_conf); if (err < 0) { SNDERR("Unknown PCM %s", name); return err; } if (snd_config_get_string(pcm_conf, &str) >= 0) // 循环递归解析 err = snd_pcm_open_noupdate(pcmp, root, str, stream, mode, hop + 1); else { snd_config_set_hop(pcm_conf, hop); err = snd_pcm_open_conf(pcmp, name, root, pcm_conf, stream, mode); } snd_config_delete(pcm_conf); return err;}登录后复制snd_pcm_open_conf 提取 snd_config_t 参数static const char *const build_in_pcms[] = { "adpcm", "alaw", "copy", "dmix", "file", "hooks", "hw", "ladspa", "lfloat", "linear", "meter", "mulaw", "multi", "null", "empty", "plug", "rate", "route", "share", "shm", "dsnoop", "dshare", "asym", "iec958", "softvol", "mmap_emul", NULL};static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name, snd_config_t *pcm_root, snd_config_t *pcm_conf, snd_pcm_stream_t stream, int mode){...sprintf(buf, "_snd_pcm_%s_open", str); //open_name即“_snd_pcm_hw_open”...const char *const *build_in = build_in_pcms;sprintf(buf1, "libasound_module_pcm_%s.so", str);...// 通过open_name在lib中获取对应的动态库函数open_func = snd_dlobj_cache_get(lib, open_name, SND_DLSYM_VERSION(SND_PCM_DLSYM_VERSION), 1);if (open_func) { err = open_func(pcmp, name, pcm_root, pcm_conf, stream, mode);...登录后复制snd_pcm_open_conf 调用snd_dlobj_cache_get在动态库中libasound_module_pcm_hw.so获取函数指针_snd_pcm_hw_open_snd_pcm_hw_open通过调用snd_pcm_hw_open来创建hw_pcm设备。snd_pcm_hw_open函数原型如下int snd_pcm_hw_open(snd_pcm_t **pcmp, const char *name, int card, int device, int subdevice, snd_pcm_stream_t stream, int mode, int mmap_emulation ATTRIBUTE_UNUSED, int sync_ptr_ioctl){ ... if ((ret = snd_ctl_hw_open(&ctl, NULL, card, 0)) < 0) return ret; ... fd = snd_open_device(filename, fmode); ... return snd_pcm_hw_open_fd(pcmp, name, fd, sync_ptr_ioctl); _err: if (fd >= 0) close(fd); snd_ctl_close(ctl); return ret;}登录后复制snd_pcm_hw_open主要完成如下工作:调用snd_ctl_hw_open创建了一个hw control设备,并设置回调const snd_ctl_ops_t *ops,回调参数为snd_ctl_hw_ops,具体操作接口如下:static const snd_ctl_ops_t snd_ctl_hw_ops = { .close = snd_ctl_hw_close, .nonblock = snd_ctl_hw_nonblock, .async = snd_ctl_hw_async, .subscribe_events = snd_ctl_hw_subscribe_events, .card_info = snd_ctl_hw_card_info, .element_list = snd_ctl_hw_elem_list, .element_info = snd_ctl_hw_elem_info, .element_add = snd_ctl_hw_elem_add, .element_replace = snd_ctl_hw_elem_replace, .element_remove = snd_ctl_hw_elem_remove, .element_read = snd_ctl_hw_elem_read, .element_write = snd_ctl_hw_elem_write, .element_lock = snd_ctl_hw_elem_lock, .element_unlock = snd_ctl_hw_elem_unlock, .element_tlv = snd_ctl_hw_elem_tlv, .hwdep_next_device = snd_ctl_hw_hwdep_next_device, .hwdep_info = snd_ctl_hw_hwdep_info, .pcm_next_device = snd_ctl_hw_pcm_next_device, .pcm_info = snd_ctl_hw_pcm_info, .pcm_prefer_subdevice = snd_ctl_hw_pcm_prefer_subdevice, .rawmidi_next_device = snd_ctl_hw_rawmidi_next_device, .rawmidi_info = snd_ctl_hw_rawmidi_info, .rawmidi_prefer_subdevice = snd_ctl_hw_rawmidi_prefer_subdevice, .set_power_state = snd_ctl_hw_set_power_state, .get_power_state = snd_ctl_hw_get_power_state, .read = snd_ctl_hw_read,};登录后复制调用snd_pcm_hw_open_fd创建hw PCM设备并配置对应的回调,snd_pcm_hw_open_fd函数原型如下int snd_pcm_hw_open_fd(snd_pcm_t **pcmp, const char *name, int fd, int sync_ptr_ioctl) ret = snd_pcm_new(&pcm, SND_PCM_TYPE_HW, name, info.stream, mode); ... // 配置回调接口 pcm->ops = &snd_pcm_hw_ops; pcm->fast_ops = &snd_pcm_hw_fast_ops; pcm->private_data = hw; pcm->poll_fd = fd; pcm->poll_events = info.stream == SND_PCM_STREAM_PLAYBACK ? POLLOUT : POLLIN; pcm->tstamp_type = tstamp_type; ...}登录后复制回调接口如下static const snd_pcm_ops_t snd_pcm_hw_ops = { .close = snd_pcm_hw_close, .info = snd_pcm_hw_info, .hw_refine = snd_pcm_hw_hw_refine, .hw_params = snd_pcm_hw_hw_params, .hw_free = snd_pcm_hw_hw_free, .sw_params = snd_pcm_hw_sw_params, .channel_info = snd_pcm_hw_channel_info, .dump = snd_pcm_hw_dump, .nonblock = snd_pcm_hw_nonblock, .async = snd_pcm_hw_async, .mmap = snd_pcm_hw_mmap, .munmap = snd_pcm_hw_munmap, .query_chmaps = snd_pcm_hw_query_chmaps, .get_chmap = snd_pcm_hw_get_chmap, .set_chmap = snd_pcm_hw_set_chmap,};static const snd_pcm_fast_ops_t snd_pcm_hw_fast_ops = { .status = snd_pcm_hw_status, .state = snd_pcm_hw_state, .hwsync = snd_pcm_hw_hwsync, .delay = snd_pcm_hw_delay, .prepare = snd_pcm_hw_prepare, .reset = snd_pcm_hw_reset, .start = snd_pcm_hw_start, .drop = snd_pcm_hw_drop, .drain = snd_pcm_hw_drain, .pause = snd_pcm_hw_pause, .rewindable = snd_pcm_hw_rewindable, .rewind = snd_pcm_hw_rewind, .forwardable = snd_pcm_hw_forwardable, .forward = snd_pcm_hw_forward, .resume = snd_pcm_hw_resume, .link = snd_pcm_hw_link, .link_slaves = snd_pcm_hw_link_slaves, .unlink = snd_pcm_hw_unlink, .writei = snd_pcm_hw_writei, //播放数据流回调 .writen = snd_pcm_hw_writen, .readi = snd_pcm_hw_readi, .readn = snd_pcm_hw_readn, .avail_update = snd_pcm_hw_avail_update, .mmap_commit = snd_pcm_hw_mmap_commit, .htimestamp = snd_pcm_hw_htimestamp, .poll_descriptors = NULL, .poll_descriptors_count = NULL, .poll_revents = NULL,};登录后复制上文中的pcm->fast_ops->writei即snd_pcm_hw_writei。至此alsa-lib中的snd_pcm_open解析流程结束。音视频点赞文章给优秀博主打call~细跟高跟凉鞋精选推荐广告

啄木鸟的切断器显示open是什么故障?

电路关闭。断路器是指能够关合、承载和开断正常回路条件下的电流并能在规定的时间内关合、承载和开断异常回路条件下的电流的开关装置。断路器按其使用范围分为高压断路器与低压断路器,高低压界线划分比较模糊,一般将3kV以上的称为高压电器。

zigbee协议栈中haluartopen函数怎么使用

本实验只对coordinator.c文件进行改动就可以实现串口的收发。修改coordinator.c文件byte GenericApp_TransID; // This is the unique message ID (counter)afAddrType_t GenericApp_DstAddr;unsigned char uartbuf[128];/********************************************************************** LOCAL FUNCTIONS*/static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );static void GenericApp_HandleKeys( byte shift, byte keys );static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );static void GenericApp_SendTheMessage( void );static void rxCB(uint8 port,uint8 event);

英语don’t open overhead bins怎么翻译?

不要打开前面的垃圾袋

Modern OpenGL - 顶点数组、属性与绑定点(OpenGL 4.5+)

上一节 我们讲了如何在Modern OpenGL下渲染矩形体,但其中用到的主要是OpenGL 3.x中内容。OpenGL 4.x增添了很多新内容,并且一部分3.x的内容得到改进。本节中会详细讲解新版和与旧版的区别与联系,并给出应用最新技术的例子。 OpenGL 4.5中给了我们DSA,可以在调用方法时直接传入要操作的OpenGL对象,而不再需要绑定操作,更加高效。与之对应的,所有 glGen* 方法均不再使用,因为这些方法只生成了一个对象(实质上是分配了一个ID),并没有定义这个对象的类型。在4.5以前,一个对象的定义发生在首次绑定时。例如: 从OpenGL 4.5起,由于不再需要绑定操作,所有 创建 OpenGL对象的操作都被 glCreate* 所替代,例如: 如果依然使用 glGen* 而不进行首次绑定,则该OpenGL对象是无效对象,操作时会报出GL_INVALID_OPERATION错误。 Modern OpenGL渲染中必须使用VAO,它无处不在。VAO本身不存储任何顶点数据,它会保存我们要渲染时所需要的顶点的 定义、规格与配置 。一旦我们配置好了一个VAO,只要绑定它,就可以直接调用渲染函数,而不需要调用任何定义/配置类的函数。 顶点属性是顶点着色器(Vertex Shader)的输入。在Modern OpenGL中,我们必须自己定义我们需要哪些顶点属性。每定义的一个属性,都可以叫做通用顶点属性。与之对应的,在传统固定管线中,顶点着色器存在内置顶点属性,但它们都已经废弃。所以我们说的顶点属性都是指通用顶点属性,它们的名字、类型都是完全自定义的。例如,我们的顶点着色器: 顶点属性用 in 表示, location = 0 显式指定了属性索引(attribute index)是0,location不一定连续。属性名在这种情况下仅在shader内使用。 顶点缓冲绑定点是在一个VAO内共享的,我们可以将一种配置绑定到一个绑定点上,再将一个或多个顶点属性与之绑定,这样就可以随时切换顶点属性而不需要重新配置缓冲。也就是说,我们定义一个绑定点,和它如何从VBO中读取数据,这个定义信息会被存入VAO,关系图如下: 比如:我们定义0号绑定点对应12个字节大小,然后我们的VBO创建为vbo_first,它的数据是每12个字节一组顶点属性,那么offset是0,stride为12。如果它第8到20字节,28到40字节以此类推,是我们需要的数据的话,那么offset是8(第一组数据是8开始),stride是20(8到28是20, 20到40是20)。剩下的一个个8字节(0到8,20到28...)也许是其他地方需要的数据。因为一个VBO可以存任何东西,VBO用一个还是多个,数据怎么存放,可自由设置。 重点来了,虽然我们在shader中定义了顶点属性,但OpenGL不知道我们是如何定义的,也就不知道怎么把数据传给shader的attribute,所以我们必须指定它们。 第一个参数传入我们的VAO。attribindex传入属性索引,也就是顶点着色器中(location = 几)的几。 注意:上面的函数最终会把数据转成浮点型。如果使用 glVertexArrayAttribIFormat (多了一个I, Integer),则会转成整数类型,并且 type 只能 GL_BYTE , GL_UNSIGNED_BYTE , GL_SHORT , GL_UNSIGNED_SHORT , GL_INT 和 GL_UNSIGNED_INT 。这个方法不含 normalized 参数。 此外还有一个relativeoffset参数,相对偏移量,也就是在绑定点中的偏移量,而不是VBO中的偏移量。我们刚刚定义了绑定点0占据12个字节,这样的话我们可以把之前的 vec2 a_Pos 和 vec4 a_Color 都绑定到这个绑定点上,如果我们的VBO是前8个字节是坐标,后4个字节是颜色,那么就分别调用: 在VBO中存储后4个字节为RGBA颜色值,标准化到浮点型,因为unsigned int是0~255,所以转换时会除255得到shader中使用的颜色值。8是因为坐标2两个浮点值8字节,一个绑定点是12字节。 别忘了, glVertexArrayAttribFormat 只定义了属性格式,要绑定到绑定点上,还需要调用 glVertexArrayAttribBinding : 第一个参数是VAO,第二个是属性索引,第三个是绑定点的索引。这里我们就需要把0和1号属性全都绑定到0号绑定点: 假设我们顶点着色器中还有2号和3号属性,也是vec2和vec4。那么只需最开始调用glVertexArrayAttribFormat,然后在需要切换的时候调用glVertexArrayAttribBinding切换绑定即可。你会发现,我们并没有重新配置绑定点,也就是怎么从VBO中读取。而且,我们从来没绑定过VBO,它只是作为参数传入。 如果需要索引绘制(indexed drawing),我们还要将所使用的EBO配置进VAO: 这样一来,所有的配置都存进了VAO,由多个VBO存放顶点数据,只要绑定VAO即可渲染,渲染循环如下: 要更新顶点数据,只需在下一帧渲染开始前使用 glNamedBufferSubData 更新VBO即可。

opengl如何绘制一个三维平面

你好,下面是opengl绘制三维图像的代码。#include "stdafx.h"#include<GL/freeglut.h>#include<GLFW/glfw3.h>// 绘图棱锥void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 三维图形由三维空间中的三角形拼接而成 glBegin(GL_TRIANGLES); // 指定棱锥的四个顶点 GLfloat vertex[4][3] = { {0, 0, 0.5}, {0.2, 0.2, 0}, {-0.3, 0, 0}, {0, -0.3, 0} }; // 绘制三角形 glColor3f(0.5, 0.5, 0.9); for (int i = 0; i < 2; i++) { for (int j = i + 1; j < 3; j++) { for (int k = j + 1; k < 4; k++) { glVertex3fv(vertex[i]); glVertex3fv(vertex[j]); glVertex3fv(vertex[k]); } } } glEnd(); // 绘制顶点连线 glBegin(GL_LINES); glColor3f(1, 0, 0); for (int i = 0; i < 3; i++) { for (int j = i + 1; j < 4; j++) { glVertex3fv(vertex[i]); glVertex3fv(vertex[j]); } } glEnd(); glFlush();}int main(){ glfwInit(); GLFWwindow* window = glfwCreateWindow(400, 400, "hello, glfw", NULL, NULL); glfwMakeContextCurrent(window); glfwSwapInterval(10); while (glfwWindowShouldClose(window) == GL_FALSE) { // 绘制棱锥 display(); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0;}

iOS15 canOpenURL: failed for URL: XXXX, Scheme失效问题

此现象针对于 ios15 之前没问题, 升级到 ios15 之后遇到的。 下面例子我这边都拿 支付宝 alipay 举例, 其他同理 ios15 之前正常调用的话 Info.plist 里面白名单 LSApplicationQueriesSchemes 肯定加过 alipay 。 但是问题就发生在加白名单这里。 ios15 及以后 Info.plist 中 LSApplicationQueriesSchemes 下配置的 scheme 数量超过 50 , canOpenURL 直接判断为 NO 。苹果官方不太希望我们过多的打开其他App。 我支付宝位置53, 打不开 我将支付宝位置换成48, 正常打开 苹果建议之后App LSApplicationQueriesSchemes 下配置的 scheme 数量不要超过50个, 所以建议将其控制在50以内, 该问题即可解决。

a mooc(massive open online)翻译

a mooc(massive open online)翻译为:大规模在线公开课

open the lunchbox变否定句

原句打开午餐盒: 合上午餐盒close the lunch box donot open the lunchbox 不要打开午餐盒.

the open window主旨是什么? 没有读懂啊.Saki的

敞开的窗户

the open window by Saki什么意思?

the open window by Saki 即《敞开的窗户》,这篇文章的中心思想是一幅社会讽刺画。在一个典型的社交场合,在场的三个人说着客套话,却各自想着各自的心思。姑姑在焦急地等待丈夫归来,小姑娘在想着如何捉弄无聊的客人,客人在自顾自沉浸在对自己病体的自怨自艾中。作者想要表达再现十九世纪末二十世纪初的欧洲社会生活,反映了上层社会的种种陈腐庸俗与愚蠢浅陋,无情讽刺了现实的政治状况。在《敞开的窗户》这篇小说中,人和人之间的关系带有一定的异化隔膜的成分。姐姐不了解弟弟的真实需要,客人除了姓名和地址对主人的情况一无所知,甚至是在小姑娘和赛普顿太太之间也存在着不理解。维拉和她的姑姑关系是近是远,小说并没有做出朋确的介绍。不过显然赛普顿太太并不了解侄女有如此高妙的编故事的能力。如果她能多了解一些维拉,当弗兰姆顿吓得从屋子里狂奔出去的时候,她就应该能够判断一定是小姑娘在背后捣鬼,用恶作剧把客人吓跑了。扩展资料:敞开着的窗户之解读1、嘲讽之鬼故事小说中的嘲讽首先体现在其对哥特式鬼故事的颠覆性戏仿。在萨基生活的时代,鬼故事是英国文学中非常受普通读者欢迎的类别。作家通过对悬念的铺垫,对恐怖场景的精心刻画,对鬼魂、僵尸、坟墓等元素的引入,制造出了迷离奇幻的效果,深深吸引了读者的注意力,让他们体验到了恐怖、惊奇、诡异的多重心理感受。在小说中,维拉就很好地利用了这些流行鬼故事的基本叙述手法。2、嘲讽之二:繁文缛节小说的嘲讽不仅体现在对鬼故事的调侃,更体现在对当时英国社会繁文缛节的讽刺。作者萨基本身出身英国上层社会,小的时候母亲早亡,父亲在大英帝国的东南亚殖民地任职,他便交由两位姑姑抚养。两位姑母自诩出身高贵,重视礼仪,实则为人虚伪,缺乏爱心和同情心。对她们来说,活着是给别人看的。举止得体,礼貌周到,小孩子懂规矩,这比正直的灵魂、同情心、爱和宽容等更重要。萨基在她们的监护下,渡过了缺乏亲情呵护的枯燥呆板的童年。正因为这样的境遇,使萨基痛恨英国上层社会装腔作势的礼仪。在作品中,萨基不遗余力地批判这些礼仪的空洞性,而这一点在《敞开的窗户》中也得到了很好的展示。参考资料:百度百科-萨基

the opens window by saki是什么意思啊?

the open window by Saki 即《敞开的窗户》,这篇文章的中心思想是一幅社会讽刺画。在一个典型的社交场合,在场的三个人说着客套话,却各自想着各自的心思。姑姑在焦急地等待丈夫归来,小姑娘在想着如何捉弄无聊的客人,客人在自顾自沉浸在对自己病体的自怨自艾中。作者想要表达再现十九世纪末二十世纪初的欧洲社会生活,反映了上层社会的种种陈腐庸俗与愚蠢浅陋,无情讽刺了现实的政治状况。在《敞开的窗户》这篇小说中,人和人之间的关系带有一定的异化隔膜的成分。姐姐不了解弟弟的真实需要,客人除了姓名和地址对主人的情况一无所知,甚至是在小姑娘和赛普顿太太之间也存在着不理解。维拉和她的姑姑关系是近是远,小说并没有做出朋确的介绍。不过显然赛普顿太太并不了解侄女有如此高妙的编故事的能力。如果她能多了解一些维拉,当弗兰姆顿吓得从屋子里狂奔出去的时候,她就应该能够判断一定是小姑娘在背后捣鬼,用恶作剧把客人吓跑了。扩展资料:敞开着的窗户之解读1、嘲讽之鬼故事小说中的嘲讽首先体现在其对哥特式鬼故事的颠覆性戏仿。在萨基生活的时代,鬼故事是英国文学中非常受普通读者欢迎的类别。作家通过对悬念的铺垫,对恐怖场景的精心刻画,对鬼魂、僵尸、坟墓等元素的引入,制造出了迷离奇幻的效果,深深吸引了读者的注意力,让他们体验到了恐怖、惊奇、诡异的多重心理感受。在小说中,维拉就很好地利用了这些流行鬼故事的基本叙述手法。2、嘲讽之二:繁文缛节小说的嘲讽不仅体现在对鬼故事的调侃,更体现在对当时英国社会繁文缛节的讽刺。作者萨基本身出身英国上层社会,小的时候母亲早亡,父亲在大英帝国的东南亚殖民地任职,他便交由两位姑姑抚养。两位姑母自诩出身高贵,重视礼仪,实则为人虚伪,缺乏爱心和同情心。对她们来说,活着是给别人看的。举止得体,礼貌周到,小孩子懂规矩,这比正直的灵魂、同情心、爱和宽容等更重要。萨基在她们的监护下,渡过了缺乏亲情呵护的枯燥呆板的童年。正因为这样的境遇,使萨基痛恨英国上层社会装腔作势的礼仪。在作品中,萨基不遗余力地批判这些礼仪的空洞性,而这一点在《敞开的窗户》中也得到了很好的展示。参考资料:百度百科-萨基

《敞开的落地窗》萨基 The Open Window (Saki) 翻译

“内特尔先生,我婶婶马上下楼来,”说话的是一位十五岁的神情自若的年轻姑娘,她说,“在她下来之前的这段时间,暂且有我来陪您。” 内特尔西先生努力说些好听的话,想在这种场合下既恭维了这位侄女,又不会冷落那位即将出现的婶婶。他患了精神忧郁症,该接受治疗。他怀疑这次礼节性的拜访,对于他神经的毛病,究竟会有多大好处。 “我知道事情会变成什么样子,”当他准备搬到这个偏僻的乡村时,他姐姐曾对他说,“你到了乡下就会迷糊,不跟任何人讲话,然后,由于孤独,会使你的忧郁症更加严重。我会给我在那里认识的所有人都写封信,把你介绍给他们。在我的记忆中,其中有些人是相当友好的。” 内特尔想知道,他拿者信来拜访的这位萨普顿夫人是否属于那种友善的人。 “这附近您认识很多人吗?”那位侄女问,这时她认为,他们之间不做声地坐着的时间已经够久了。 “几乎没有一个认识的,”内特尔说,“大约四年前,我姐姐住在这个区。她叫我拿者她写的信去拜访这里的一些人。” 他说最后一句话时,语调中带着明显的悲伤。 “那么,您对我婶婶的情况一无所知?”这位神情自若的姑娘追问道。 “仅仅知道她的名字和地址。”内特尔承认。他推测着萨普顿夫人是有丈夫还是寡居。这个屋子似乎有男人住过。 “她那场大悲剧刚好发生在三年前,”那个孩子说,“那应该是你姐姐走了之后。” “她的悲剧?”内特尔问道。在某种程度上,悲剧看上去和这个宁静的乡村有些不协调。 “你可能会觉得奇怪,为什么在十月的午后,我们还把那扇窗户大开着。”那位侄女说。她指着一扇巨大的法式落地窗,窗子外面是一个草坪。 “今年这个时候还相当暖和,”内特尔说,“可是,那扇窗户和你婶婶的悲剧之间有什么关系吗?” “到今天正好三年了,就是从那扇窗子,他的丈夫和她的两个年轻的弟弟出去了,他们去打猎。然后就再也没回来。他们穿过沼泽地,去最喜爱的猎场。可是,他们陷到了沼泽中。你知道,那是个可怕的多雨的夏天,往年可以安全走过的地方会突然塌陷下去,事先没有一点征兆。他们的尸体一直没有找到。这也是这件事的可怕之处。”说到这里,这个孩子的声音失去了镇定自若的特点。变得伤感起来:“可怜的婶婶总是想着,有一天他们会回来,他们三个人,还有和他们一起走失的那条棕色小长毛狗,会从那扇窗户走进来,就像他们从前一样。这就是为什么那扇窗户一直开着,直到天完全黑下来。可怜的婶婶,她常对我说,他们是怎样走出去的,她的丈夫胳膊上搭着白色的外套,罗尼,她最小的弟弟,总是唱一首歌来逗她,因为她说这会让她头疼。你知道吗,有时,在这样安静的傍晚时分,我总觉得,他们会从那扇窗子进来———” 她打了个寒颤,止住了话头。这时,那位婶婶匆匆地走进了房间,她连声道歉,说自己来迟了。内特尔觉得一阵轻松。 “我想,薇拉应该让您觉得很有意思吧?”那位婶婶问道。 “她的确非常有趣。”内特尔答道。 “那扇窗户开着,我希望您不会介意,”萨普尔夫人轻快地说,“我的丈夫和兄弟们打猎去了,他们很快就会回来。他们一向从这里进屋。今天他们到沼泽地打鸟去了,回来的时候肯定会把我这可怜的地毯弄得一塌糊涂。男人们总是这样,对吗?”她兴致勃勃地谈论着打猎的话题,说现在鸟儿少了,能否有收获寄希望于今年冬天了。对内特尔来说,这一切太可怕了。他费了好大的劲想把谈话引到比较愉快的话题上去,但没有多大效果;他意识到他的主人只有一小部分注意力放在他身上。他的目光不时的从他身上转向开着的窗户和窗户外的草坪。他在这个悲剧的周年纪念日来拜访,实在是不幸的巧合。 “医生们都一致要求我彻底休息,叫我避免精神上的激动,避免任何带有体育性质的剧烈运动。”内特尔宣称,他有在病人中普遍存在的幻觉。那就是认为,陌生人和朋友都渴望了解他疾病的细节,了解他得病的原因和治疗的过程。他接着说:“可是,在饮食问题上,他们的意见不太一致。” “哦,是吗?”萨普顿夫人说,她的语调就像是要在最后一刻把哈欠压下去。然后,突然什么东西引起了她的注意,使她一下子精神起来——但绝不是对内特尔所说的那些话。 “他们终于回来了!”她喊道,“刚好赶上喝茶,他们看起来全身都是泥,只剩下一双眼睛了!” 内特尔全身微微发抖,他把目光转向那位侄女,用表示着同情和理解的眼神看着那个孩子。只见那个孩子从开着的窗向外凝视着,眼睛里带着茫然的恐惧。内特尔打了个冷颤,他在座位上转过身,也朝着同一个方向看去。在渐进的暮色中,三个人穿过草坪向窗户走来。他们臂下全都夹着枪,其中一个人肩上还搭着一件白色的衣服。一只疲惫的棕色小长毛狗紧跟在他们身后。他们悄无声息地走近了这所房子,然后,一个年轻的声音在暮色中唱起了歌。 内特尔慌乱地抓起手杖和帽子,仓皇冲出了大厅,又冲出了院门,险些和一个骑着自行车的人相撞。 “我们回来了,亲爱的。”那个拿者白色外套的男人说。他从窗户走进来, “相当多的泥,但是差不多全都干了。我们进来的时候冲出去的那个人是谁?” “一个非常怪异的人,一位名叫内特尔的先生,”萨普顿夫人说,“他只会讲他的病。你们回来的时候,他急忙冲出去了,连一句道别或者抱歉的话都没有。人家还以为他是见到鬼了呢。” “我想是因为那只狗,”那侄女平静地说,“他告诉我,他对狗有恐惧症。有一次,在印度的什么地方,他给一群野狗追到一片坟地里,不得不在一个刚挖的墓穴里过了一夜。那群野狗就在他上面吼叫着,龇牙咧嘴,嘴里还吐着白沫。这种事不管是谁碰到,也会吓得掉了魂的。” 脑筋一转,立即编造出故事,是她的拿手好戏。

谁有作家SAKI的资料啊,他(她)写过THE OPEN WINDOW

[作家简介] 萨基﹝Saki,1870-1916),被誉为英国最出色的讽刺短篇小说家,但准确地说,他其实应该算是苏格兰作家,不过却生在缅甸的实兑,父亲是缅甸警察局的总督察。萨基本名赫克多.休.门罗(Hector Hugh Munro),“萨基”是他写作专栏和短篇小说用的笔名。他出名的短篇小说集有:“克洛维斯记事(The Chronicles of Clovis)”,“雷金纳德(Reginald)”,“方蛋(The Square Egg)”,“和平的玩偶(The Toys of Peace)”,“野兽与超级野兽(Beasts and Super-Beast)”,“不可容忍的巴辛顿(The Unbearable Bassington)”等。 萨基以写作政治题材的记者身份开始笔墨生涯,曾在俄罗斯和法兰西工作过。1914-1918年的第一次世界大战期间,他在军队服役,一次战斗中阵亡。 萨基的故事表现出对孩子和青年人的理解,他们玩弄小聪明,恶作剧地耍弄成年人的思想感情。他还特别擅长表现对动物的爱和关注,在他的一些作品中,动物充当着主要角色。

用C++或者OpenGL或者Ogre实现鼠标移动轨迹

这和OpenGL或Ogre有什么关系么。。用一个容器比如标准库的vector不断记录发给窗体的WM_MOUSEMOVE消息的坐标,然后依次绘制直线即可。用GDI的LineTo就搞定了。

ogre 和opengl 这两个对于新手来说学那个比较合适啊 这两者的区别是什么

opengl是底层的API了,跟它同级的还有directx。ogre可以说就是对opengl和directx的封装了,让你更好的去使用。初学还是学opengl吧,图形学的基础,了解了底层才能更好的去运用。ogre的资料肯定是没有opengl的多了。学opengl可以看《nehe的教程》配合《OPENGL编程指南》看。

OGRE与openGL Direct3D是什么关系?在三维可视化中作用是什么?

lz还是用ogre的sdk吧...不需要directx sdkogre是个3d引擎,可以用opengl也可以用directx渲染lz去看一下,写点东西就明白了

opencv能不能将位图转化为pgm

OpenCV中本来就支持pgm文件,可以参考这个网址:http://wiki.opencv.org.cn/index.php/OpenCV_%E7%BC%96%E7%A8%8B%E7%AE%80%E4%BB%8B%EF%BC%88%E7%9F%A9%E9%98%B5/%E5%9B%BE%E5%83%8F/%E8%A7%86%E9%A2%91%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C%EF%BC%89因此如果要将bitmap转化成pgm,只需要读取*.bmp,然后再保存成*.pgm即可

openoffice怎么转成中文版

先到openoffice官网下载对应版本的中文包。最好连同openoffice升级到最新版本。安装好中文包后,中文系统下,openoffice会自动变成中文版。

ubuntu怎么卸载openoffice?

不建议删除openoffice,这样会造成系统不稳定如果你是搞者玩完全删除方法:进入右上角系统->系统管理->新力得软件管理器在快速搜索中输入openoffice在右角选择状态:已安装,将里面所选的东西标记删除再次强调:删除openoffice会造成系统不稳定

关于Jacob、POI、OpenOffice的问题。

JAVA对普通文件操作,是java.io.*Jacob 是WIN32中,调用DLL的POI 是操作Office文件的,如word、excel、等的文件OpenOffice 是开源的Office软件,也支持java调用
 首页 上一页  1 2 3 4 5 6 7  下一页  尾页