opengl和d3d选哪个更好

opengl和d3d选哪个更好,第1张

各有各的优势,做游戏现在D3D的较多,其他图形工业图形处理,虚拟现实用openGL的多点,还有用OSG的

OpenGL的发展历程:

OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽强大但其移植性不好,于是SGI公司在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL是“开放性图形程序接口”。

1992年7月,SGI公司发布了OpenGL的10版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。

1995年OpenGL的11版本面市,该版本较10性能提高许多,并加入了一些新的功能。包括提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。

1997年,Windows 95下3D游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的3D图形接口,而当时微软公司自己的3D图形接口DirectX 30功能却是很糟糕。因而以制作《雷神之锤》等经典3D射击游戏而著名的id公司同其它一些游戏开发公司一同强烈要求微软在Windows 95中加入对OpenGL的支持。微软公司最终在Windows 95的OSR2版和后来的Windows 版本中加入了对OpenGL的支持。这样,不但许多支持OpenGL的电脑3D游戏得到广泛应用,而且许多在3D图形设计软件也可以运用支持OpenGL标准的3D加速卡,大大提高其3D图形的处理速度。

2003年的7月28日,SGI和ARB公布了OpenGL 15。OpenGL 15中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”。OpenGL 15的新功包括:顶点Buffer Object、Shadow功能、隐蔽查询、非乘方纹理等。

2004年8月,OpenGL20版本发布~OpenGL 20标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。opengl20支持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。

OpenGL是做什么用的:

上世纪90年代,OpenGL可谓大名鼎鼎,那时微软的DirectX刚刚出现,功能远不能与OpenGL相比,OpenGL实际上是一种3D程序接口(即我们常说的3D API),这个接口由近二百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。它是3D加速卡硬件和3D图形应用程序之间一座非常重要的沟通桥梁。也可以说,OpenGL是一个功能强大,调用方便的底层3D图形库。

OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。

OpenGL特点及功能:

OpenGL是一个开放的三维图形软件包,它独立于窗口系统和 *** 作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:

1建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。

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在 *** 作系统市场的统治地位,DirectX在3D游戏API上占据了绝对的优势。而曾经红极一时的OpenGL则显得停滞不前。目前我们熟悉的OpenGL游戏可能只剩下了id出品的《Quake》和《Doom》系列可以勉强支撑。OpenGL的未来究竟如何?OpenGL仍然是唯一能够取代微软对3D图形技术的完全控制的API,目前,OpenGL也仍是唯一的跨平台3D解决方案,它仍然具有一定的生命力,游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持。

目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,未来的OpenGL发展前景迷茫。OpenGL与DirectX代表着绘图世界分裂的两大门派,这种情况有时会阻碍发展,有时却又有利于与发展。毕竟有竞争才会有发展。如同处理器市场我们不希望AMD倒掉,也不希望INTEL一家独大一样~我们都不希望在3D领域中仅仅剩下一个霸主。希望OpenGL一路走好。。。。。。

另:2007年8月8日,圣迭戈Siggraph BOF展会上 OpenGL Architecture Review Board(OpenGL架构评估委员会)正式宣布了OpenGL 3。以前被称之为OpenGL Longs Peak,OpenGL 3则是官方名称。OpenGL 3规范将在下一次8月底召开的OpenGL ARB会议上最后定案,由Khronos Group进行为期30天的评估后在9月底正式公开。最新的OpenGL Shading Language也伴随OpenGL 3公开展示。

d3d

要讲Direct3D不能不讲DirectX, DirectX是微软开发并发布的多媒体开发软件包,其中有一部分叫做DirectDraw是图形绘演API,提供对图形的强大的访问处理能力,而在DirectDraw中集成了一些三维图形相关的功能,叫做Direct3D。

D3D和OPENGL本质虽然一样,Direct3D (D3D)是微软为提高3D 游戏在Win 95/98中的显示性能而开发的显示程序,目前已经升级到90版本,而且支持XP等微软最新的 *** 作系统,它提供了丰富的3D功能库,是游戏广泛采用的标准。

Direct 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectX SDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。自1996年发布以来,Direct3D以其良好的硬件兼容性和友好的编程方式很快得到了广泛的认可,现在几乎所有的具有3D图形加速的主流显示卡都对Direct3D提供良好的支持。但它也有缺陷,由于是以COM接口形式提供的,所以较为复杂,稳定性差,所以D3D是一个十分繁琐的工具,尽管Microsoft已经尽可能地简化了,但是为了实现一个效果,你还是不得不做许多的工作,其中就包括对各种复杂的结构的赋值;这些赋值很重要,它直接关系到程序的最终效果。另外,目前只在Windows平台上可用。

支持31的 你需要到 >

OPENGL(开放式图形界面) 由Silicon Graphics公司(即大名鼎鼎的SG1)开发,能够在Windows 95-WindowsNTMacosBeosOs/2以及Unix上应用的API。程序员可用这个接口程序来直接访问图形处理的硬件设备,产生高品质的3D效果。它除了提供许多图形运算功能外,也提供了不少图形处理功能。由于OpenGL起步较早,一直用于高档图表工作站,其它3D图形功能很强,超过Direct X许多,可最大限度地发挥3D芯片的巨大潜力。

语法也有错误:glVertex3fv(&vdata [&tindices[i][0][0]]);

glVertex3fv(&vdata [tindices[i][1][0]]);

glVertex3fv(&vdata [tindices[i][2][0]]);

改为:

glVertex3fv(vdata [tindices[i][0]]);

   

glVertex3fv(vdata [tindices[i][1]]);

     

glVertex3fv(vdata [tindices[i][2]]);

我的运行环境是在QT IDE上运行的。470版。

如果你是在VC上运行应该也要加入opengl32,glut,glut32库(32位WIN上的),

另外,这个程序你是看不到一个球体的,因为你没有使用光照,只能看到一个轮廓。

我的Qt上我加入的库是:opengl32,glut,glee5(glee5是glee是自己编译的替换glut32库)

头加入了:windownh,gl/gleeh(gleeh就是glee的头文件在网上可以下载,比glh要高级,因为WIN上的glh只支持到opengl32的11版)

源文件:

#include <windowsh>///////////////////////////////

#include <GL/gleeh>

////////////////////////////////

#include <GL\gluth>

#include <mathh>

#define x 52573

#define z 85965

void mydisplay(void)

{

 

static GLfloat vdata[12][3]={{-x,00,z},

{x,00,z},

                              {-x,00,-z},

                              {x,00,-z},

{00,z,x},

{00,z,-x},

                              {00,-z,x},

                              {00,-z,-x},

                              {z,x,00},

{-z,x,00},

                              {z,-x,00},

{-z,-x,00}};

 static GLuint tindices[20][3]={{1,4,0},

{4,9,0},

                                {4,5,9},

                                {8,5,4},

                                {1,8,4},

{1,10,8},

{10,3,8},

                                {8,3,5},

{3,2,5},

{3,7,2},

{3,10,7},

                                {10,6,7},

                                {6,11,7},

{6,0,11},

{6,1,0},

{10,1,6},

                                {11,0,9},

                                {2,11,9},

                                {5,2,9},

                                {11,2,7}};

 int i;

glBegin(GL_TRIANGLES);

 for(i=0;i<20;i++)

{

     

glVertex3fv(vdata [tindices[i][0]]);//////////////////////////////////////////////

     glVertex3fv(vdata [tindices[i][1]]);/////////////////////////////////////////////

     glVertex3fv(vdata [tindices[i][2]]);////////////////////////////////////////////

 }

glEnd();

}

int main(int argc, char argv[])

{

 glutInit(&argc, argv);

 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

 glutInitWindowPosition(100, 100);

 glutInitWindowSize(400, 400);

 glutCreateWindow("第一个OpenGL程序");

 glutDisplayFunc(&mydisplay);

 glutMainLoop();

 return 0;

}

后面加了///////////////////////////////////是我修改了的。

我用的连接库是:

LIBS=-lopengl32 -lfreeglut -lglee5

概述

[编辑本段]

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的10版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的11版本面市,该版本比10的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 15又新增了“OpenGL Shading Language”,该语言是“OpenGL 20”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。

OpenGL 20标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。20版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 20将由OpenGL 13的现有功能加上与之完全兼容的新功能所组成(如图一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。

目前,随着DirectX的不断发展和完善,OpenGL的优势逐渐丧失,至今虽然已有3Dlabs提倡开发的20版本面世,在其中加入了很多类似于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 平台上的图形来。

一、产生程序框架 Testdsw

New Project | MFC Application Wizard (EXE) | "Test" | OK

注 : 加“”者指要手工敲入的字串

二、导入 Bezier 曲线类的文件

用下面方法产生 BezierCurveh BezierCurvecpp 两个文件:

WorkSpace | ClassView | Test Classes| <右击d出> New Class | Generic Class(不用MFC类) | "CBezierCurve" | OK

三、编辑好 Bezier 曲线类的定义与实现

写好下面两个文件:

BezierCurveh BezierCurvecpp

四、设置编译环境:

1 在 BezierCurveh 和 TestViewh 内各加上:

#include <GL/glh>

#include <GL/gluh>

#include <GL/glauxh>

2 在集成环境中

Project | Settings | Link | Object/library module | "opengl32lib glu32lib glauxlib" | OK

五、设置 OpenGL 工作环境:(下面各个 *** 作,均针对 TestViewcpp )

1 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格

csstyle |= 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(00f,00f,00f,10f);//设置背景颜色为黑色

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glTranslated(00f,00f,-30f);//把物体沿(0,0,-1)方向平移

//以便投影时可见。因为缺省的视点在(0,0,0),只有移开

//物体才能可见。

//本例是为了演示平面 Bezier 曲线的,只要作一个旋转

//变换,可更清楚的看到其 3D 效果。

//下面画一条 Bezier 曲线

bezier_curvemyPolygon();//画Bezier曲线的控制多边形

bezier_curvemyDraw(); //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_curvem_N>MAX-1)

{

MessageBox("顶点个数超过了最大数MAX=50");

return;

}

//以下为坐标变换作准备

GetClientRect(&m_ClientRect);//获取视口区域大小

w=m_ClientRectright-m_ClientRectleft;//视口宽度 w

h=m_ClientRectbottom-m_ClientRecttop;//视口高度 h

//w,h 是CTestView的成员变量

centerx=(m_ClientRectleft+m_ClientRectright)/2;//中心位置,

centery=(m_ClientRecttop+m_ClientRectbottom)/2;//取之作原点

//centerx,centery 是 CTestView 的成员变量

GLdouble tmpx,tmpy;

tmpx=scrx2glx(pointx);//屏幕上点坐标转化为OpenGL画图的规范坐标

tmpy=scry2gly(pointy);

bezier_curvem_Vertex[bezier_curvem_N]x=tmpx;//加一个顶点

bezier_curvem_Vertex[bezier_curvem_N]y=tmpy;

bezier_curvem_N++;//顶点数加一

InvalidateRect(NULL,TRUE);//发送刷新重绘消息

}

double CTestView::scrx2glx(int scrx)

{

return (double)(scrx-centerx)/double(h);

}

double CTestView::scry2gly(int scry)

{

}

附录:

1CBezierCurve 的声明: (BezierCurveh)

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 的实现: (BezierCurvecpp)

CBezierCurve::CBezierCurve()

{

m_N=4;

m_Vertex[0]x=-05f;

m_Vertex[0]y=-05f;

m_Vertex[1]x=-05f;

m_Vertex[1]y=05f;

m_Vertex[2]x=05f;

m_Vertex[2]y=05f;

m_Vertex[3]x=05f;

m_Vertex[3]y=-05f;

}

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(10f,10f,10f);

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 {

Qx=Px;

Qy=Py;

}

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(02f,04f,04f);

for(int i=0;i<m_N;i++)

{

glVertex2d(m_Vertexx,m_Vertexy);

}

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和d3d选哪个更好全部的内容,包括:opengl和d3d选哪个更好、windows平台对于opengl3.1的支持、什么是openGL驱动程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10093286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存