㈠ OpenGL是什麼
OpenGL是OpenGraphicsLib的縮寫,是一套三維圖形處理庫,也是該領域的工業標准。
計算機三維圖形是指將用數據描述的三維空間通過計算轉換成二維圖像並顯示或列印出來的技術。
OpenGL就是支持這種轉換的程序庫,它源於SGI公司為其圖形工作站開發的IRIS GL,在跨平台移植過程中發展成為OpenGL。SGI在1992年7月發布1.0版,後成為工業標准,由成立於1992年的獨立財團OpenGL Architecture Review Board (ARB)控制。SGI等ARB成員以投票方式產生標准,並製成規範文檔(Specification)公布,各軟硬體廠商據此開發自己系統上的實現。只有通過了ARB規范全部測試的實現才能稱為OpenGL。1995年12月ARB批准了1.1版本,最新版規范是1999.5通過的1.2.1。
OpenGL被設計成獨立於硬體,獨立於窗口系統的,在運行各種操作系統的各種計算機上都可用,並能在網路環境下以客戶/伺服器模式工作,是專業圖形處理、科學計算等高端應用領域的標准圖形庫。它低端應用上的主要競爭對手是MS-Direct3D,該圖形庫是以COM介面形式提供的,所以極為較復雜,穩定性差,另外微軟公司擁有該庫版權,目前只在Windows平台上可用。D3D的優勢在速度上,但現在低價顯卡都能提供很好的OpenGL硬體加速,所以做3D使用Direct3D已沒有特別的必要,在專業圖形處理特別是高端應用方面目前還沒有出現以Direct3D技術為基礎的例子,而游戲等低端應用也有轉向OpenGL的趨勢。
微軟在Windows NT對OpenGL的支持始於3.51,在Windows9x中的支持始於Win95 OEM Service Release 2。Windows下常用的OpenGL庫有兩種,MS實現的和SGI實現的,MS-OpenGL調用會自動檢測是否存在顯示卡製造商提供的ICD(Installable Client DeviceDriver)驅動程序,有則調用ICD中的常式,否則才用CPU進行計算,所以能利用顯示卡的OpenGL加速能力。對開發者來說使用方法並沒有區別,只是有ICD驅動時更快些。SGI的版本是純軟體實現不能利用硬體加速並且SGI已經在1999年宣布停止支持,但這套庫便於調試程序,仍有不少開發者使用。
近日SGI宣布與Intel聯手針對當前及未來IA體系的Internet流化SIMD擴展優化OpenGL。這顯然意味著OpenGL未來在intel體系及internet應用領域將大放光彩。
SGI曾經宣布研發OpenGL++,該圖形庫最大的特點是面象對象,提供了樹形場景支持,大大 ×聳褂肙penGL處理復雜場景的工作量。後來(1999)SGI宣布與M$合作開發Ferihant,即Windows的下一代圖形處理體系,包括DirectX與OpenGL的低級圖形處理介面和以場景圖支持為特點的高級介面,並且就此停止對其在Windows下的OpenGL實現的支持以示決心。此舉世矚目,大家都以為Windows圖形處理快要過上幸福生活了,然而,不久,SGI宣布中止合作,並撤回派出的科學家,Ferihant基本上夭折。SGI 稱終止合作的原因是M$不肯積極合作,光想把SGI 的技術合並進DirectX,真正內幕不詳。不過以SGI在圖形處理界的老大地位來說,還是有幾分可信度的,因為M$初支持OpenGL就不積極。
雖然早在WinNT3.51 時代M$就已經實現了它的OpenGL 版本,但不肯隨其Windows95 時提供,稱該API 適合高端應用,而Win95面向一般消費者的用不到,並且在其win3.x下開發的wing 圖表庫的基礎上搞出了GameSDK,即後來的DirectX 庫,稱這套庫是專門為高性能游戲開發設計的,在當時的硬體條件下,這無疑是非常有道理的,並且很快成為Windows環境下游戲開發的標准API 。該庫實質上是提供了繞過Windows 直接訪問顯存的途徑,從而很好的解決了GDI 體系性能方面的不足,但由於是以COM介面形式提供的,所以相當復雜,而穩定性也不是很好,所以有人稱Direct3D 是為追求速度而不擇手段的公司才用的。然而也就在這個時期,三維圖形加速卡開始走向商用和家用,也就是在這時期S3公司以其性價比極高的帶三維圖形加速的顯示晶元、板卡向當時Trident 公司的霸主地位發起了挑戰。另外這時實時三維游戲開始流行,以Dos 下的第一人稱射擊游戲——暗殺希特勒(3d worlf) 大獲成功、紅極一時ID Software 的開始鑄輝煌,推出了Doom 、Quake1 ,相信這兩個名字在今天(2000.4) 的游戲圈子裡應該是無人不知無不曉吧?1996.12.ID Software 的高手John Carmack 在開發下一代三維圖形引擎時在其.plan 中寫上了以下字句:
Direct-3D IM is a horribly broken API. It inflicts great pain and suffering on the programmers using it, without returning any significant advantages. I don』t think there is ANY market segment that D3D is apropriate for, OpenGL seems to work just fine for everything from quake to softimage. There is no good technical reason for the existance of D3D.
I』m sure D3D will suck less with each forthcoming version, but this is an oportunity to just bypass dragging the entire development community through the messy evolution of an ill-birthed API.
此後以他為代表的一大批游戲開發人員開始多方呼籲MS積極支持OpenGL。M$終於在Win95的OSR2版本里集成了OpenGL,並為以前版本的Win95免費提供單獨的OpenGL實現。(或許您還不了解這些人的影響力,不知道您聽說過以生產Voodoo系統圖形加速卡而著稱於世的3dfx公司嗎?當年Quake的開發者不肯用Voodoo的glide API對voodoo做優化版本,差點沒把3dfx嚇蒙,於是趕緊搞了一個針對游戲的OpenGL子集:MiniGL,讓ID Software的人只要在製作OpenGL時只使用MiniGL API做過優化就成,這樣Quake總算可以用上voodoo的硬體加速能力了。這樣也造就了一個新名詞:MCD--MiniGL Client Driver,用於Windows的MiniGL驅動程序,而標準的OpenGL則依靠ICD驅動)。
㈡ DirectX和OpenGL到底哪個好
Opengl的穩定性要好於DirectX,但是如果你只是一般應用,不是多麼復雜的程序就不用注意什麼穩定性。
Opengl要好學很多,但是它只有圖形方面的功能,而DirectX主要是為了開發游戲而做,所以DirectX除了圖形方面的功能外,還有網路,聲效,輸入等方面的功能。反正這兩個對於我來說的最主要區別就是一個容易學一個難學。
簡介
OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者「開放式圖形庫」)是用於渲染2D、3D矢量圖形的跨語言、跨平台的應用程序編程介面(API)。這個介面由近350個不同的函數調用組成,用來從簡單的圖形比特繪制復雜的三維景象。
而另一種程序介面系統是僅用於Microsoft Windows上的Direct3D。OpenGL常用於CAD、虛擬實境、科學可視化程序和電子游戲開發。
OpenGL的高效實現(利用了圖形加速硬體)存在於Windows,部分UNIX平台和Mac OS。這些實現一般由顯示設備廠商提供,而且非常依賴於該廠商提供的硬體。開放源代碼庫Mesa是一個純基於軟體的圖形API,它的代碼兼容於OpenGL。但是,由於許可證的原因,它只聲稱是一個「非常相似」的API。
㈢ OpenGL怎麼學就業能做啥呢
OpenGL就業主要能做3D游戲開發,學習需要一個系統的流程,如下:
openGL學習建議按照如下的步驟進行:
1、基本的線性代數知識,不需要很深入,大學時的線性代數拿出來復習一下足夠用了,特別是矩陣變換部分。
2、C++開發語言,一定要非常熟練。
3、《計算機圖形學》這個應該是高校教材了,這個也是所有圖形學的基礎知識。
4、《3D游戲編程大師技巧》等基礎入門教材,這一類圖書基本上是將基礎知識和openGL API如何使用結合起來,使得讀者可以開始上手開發。同樣的還有 https://learnopengl-cn.github.io/ 這一類網站,都是比較好的入門資料。
5、《openGL編程指南》俗稱「紅寶書」,《OpenGL Super Bible 5th》俗稱「藍寶書」,不過這兩本書更加適合作為查詢手冊,用到哪一塊需要深入了解時進行查詢。
6、再深入就是了解詳細的管線處理流程、shader語言開發等。
openGL主要屬於計算機圖形學方面的內容,這一塊屬於比較專業的領域了。
目前主要做3D游戲開發這一塊用得最多,大公司做游戲引擎開發主要以openGL為主,即便現在很多基於U3D開發的手游,至少也需要熟悉基本的openGL管線流程和一些shader知識。
其次,做一些專業領域的模擬會很多,再次在做各種濾鏡、特效方面也需要用到openGL知識,不過這些方面還需要圖像處理方面的一些知識。
PpenGL的設計
OpenGL規范描述了繪制2D和3D圖形的抽象API。盡管這些API可以完全通過軟體實現,但它是為大部分或者全部使用硬體加速而設計的。
OpenGL的API定義了若干可被客戶端程序調用的函數,以及一些具名整型常量(例如,常量GL_TEXTURE_2D對應的十進制整數為3553)。
雖然這些函數的定義表面上類似於C編程語言,但它們是語言獨立的。因此,OpenGL有許多語言綁定,值得一提的包括:javaScript綁定的WebGL(基於OpenGL ES 2.0在Web瀏覽器中的進行3D渲染的API);C綁定的WGL、GLX和CGL;iOS提供的C綁定;Android提供的Java和C綁定。
OpenGL不僅語言無關,而且平台無關。規范隻字未提獲得和管理OpenGL上下文相關的內容,而是將這些作為細節交給底層的窗口系統。出於同樣的原因,OpenGL純粹專注於渲染,而不提供輸入、音頻以及窗口相關的API。
OpenGL是一個不斷進化的API。新版OpenGL規范會定期由Khronos Group發布,新版本通過擴展API來支持各種新功能。每個版本的細節由Khronos Group的成員一致決定,包括顯卡廠商、操作系統設計人員以及類似Mozilla和谷歌的一般性技術公司。
除了核心API要求的功能之外,GPU供應商可以通過擴展的形式提供額外功能。擴展可能會引入新功能和新常量,並且可能放鬆或取消現有的OpenGL函數的限制。
然後一個擴展就分成兩部分發布:包含擴展函數原型的頭文件和作為廠商的設備驅動。供應商使用擴展公開自定義的API而無需獲得其他供應商或Khronos Group的支持,這大大增加了OpenGL的靈活性。OpenGL Registry負責所有擴展的收集和定義。
每個擴展都與一個簡短的標識符關系,該標識符基於開發公司的名稱。例如,英偉達(nVidia)的標識符是NV。如果多個供應商同意使用相同的API來實現相同的功能,那麼就用EXT標志符。
這種情況更進一步,Khronos Group的架構評審委員(Architecture Review Board,ARB)正式批准該擴展,那麼這就被稱為一個「標准擴展」,標識符使用ARB。
第一個ARB擴展是GL_ARB_multitexture。
OpenGL每個新版本中引入的功能,特別是ARB和EXT類型的擴展,通常由數個被廣泛實現的擴展功能組合而成。
㈣ OPENGL是什麼意思
游戲渲染,OpengGL和DirectX都是為了給魔獸世界提供很high的游戲動畫效果,增加游戲運行速度。不同電腦用不同模式帶來的速度有時候是不一樣的,畫面的精美效果也可能不一樣,一般OpenGL的渲染速度要更快。
㈤ solidworks中的opengl有什麼用
solidworks中的OpenGL是用於渲染2D、3D矢量圖形的跨語言、跨平台的應用程序編程介面(API)。這個介面由近350個不同的函數調用組成,用來繪制從簡單的圖形比特到復雜的三維景象。OpenGL提供了繪制2D和3D圖形的抽象API,為大部分或者全部使用硬體加速而設計。
(5)opengl編程軟體擴展閱讀:
OpenGL被設計為只有輸出的,所以它只提供渲染功能。核心API沒有窗口系統、音頻、列印、鍵盤/滑鼠或其他輸入設備的概念。雖然這一開始看起來像是一種限制,但它允許進行渲染的代碼完全獨立於他運行的操作系統,允許跨平台開發。
OpenGL進化自SGI的早期3D介面IRIS GL。IRIS GL的限制是只能訪問底層硬體提供的特性。如果圖形硬體不支持,那麼應用程序就不能使用它。OpenGL通過在軟體上對硬體不支持的特性提供支持的方法克服了這個問題,允許應用程序在相對低配置的系統上使用高級的圖形特性。
參考資料來源:網路——OpenGL
㈥ MAYA和OPENGL都是做三維圖像的,他們的區別和聯系是什麼
MAYA是三維專業軟體,OPENGL 是圖形介面標准,MAYA是依據OPENGL 圖形介面進行設計的,而OPENGL它是一個標准或是一個編程介面軟體,所以好的支持OPENGL 的顯卡,對MAYA 運行效果很明顯,但OPENGL並不是MAYA,它是幾乎所有三維軟體,包括游戲介面的一個標准,當然有些是利用DX 來作介面,比如現在很多大型游戲,就要你安裝這種介面才能玩,比如要你安裝DX9.0c 10.1 DX11等不同版本,這種介面主要是WINDOWS 平台的圖形介面,而OPENGL主要是Linux系系統的介面,所以很多專業軟體,大多數人選擇裝,Linux 系統作為平台,不容易出錯!不過這系統,沒多少人會用而已,總的來說,就是,OPENGL為MAYA 提供了圖形輸入輸出的標准,而MAYA 是專業軟體,OPENGL 是圖形介面的編程軟體,
㈦ gl10用哪個編程軟體
OpenGL
OpenGL本身是開放圖形庫的一種標准,定義了一個跨語言、跨平台的編程規范,主要用於3D圖形編程。
GLSurfaceView主要用於顯示,GLSurfaceView.Render主要用於渲染,GL10類主要用於OpenGLES的具體操作,操作的流程相對繁瑣,需要對OpenGL本身有一定了解,因此建議先查看系列文章 專題分綱目錄 OpenGL教程。再來研究GL10部分代碼,相關文檔梳理如下:
GLSurfaceView 官方文檔:Android GLSurfaceView類 詳細解讀;
GLSurfaceView.Render 官方文檔:Android GLSurfaceView.Render類 詳細解讀;
GLSurfaceView的中用於操作OpenGLES的關鍵類為GL10,在代碼中使用最多,因此也做相關解讀,GLSurfaceView關鍵類GL10官方文檔:Android OpenGLES關鍵類GL10 詳細解讀。
㈧ 如何安裝opengl visual studio
分兩步:
(一)下載glut,並將其放置到適當的位置
(二) 進行vs2005項目屬性配置
*******************************************************************************
第一步,
(轉自參考網站: http://muggleyoung.blog.hexun.com/22800074_d.html)
OpenGL作為當前主流的圖形API之一,它在一些場合具有比DirectX更優越的特性。
1、與C語言緊密結合。
OpenGL命令最初就是用C語言函數來進行描述的,對於學習過C語言的人來講,OpenGL是容易理解和學習的。如果你曾經接觸過TC的graphics.h,你會發現,使用OpenGL作圖甚至比TC更加簡單。
2、強大的可移植性。
微軟的Direct3D雖然也是十分優秀的圖形API,但它只用於Windows系統(現在還要加上一個XBOX游戲機)。而OpenGL不僅用於
Windows,還可以用於Unix/Linux等其它系統,它甚至在大型計算機、各種專業計算機(如:醫療用顯示設備)上都有應用。並且,OpenGL
的基本命令都做到了硬體無關,甚至是平台無關。
3、高性能的圖形渲染。
OpenGL是一個工業標准,它的技術緊跟時代,現今各個顯卡廠家無一不對OpenGL提供強力支持,激烈的競爭中使得OpenGL性能一直領先。
總之,OpenGL是一個很NB的圖形軟體介面。至於究竟有多NB,去看看DOOM3和QUAKE4等專業游戲就知道了。
OpenGL官方網站(英文)
http://www.opengl.org
下面將對Windows下的OpenGL編程進行簡單介紹。
學習OpenGL前的准備工作
(一),選擇一個編譯環境
現在Windows系統的主流編譯環境有Visual Studio,Broland C++ Builder,Dev-C++等,它們都是支持OpenGL的。但這里我們選擇Visual Studio 2005作為學習OpenGL的環境。
(二),安裝GLUT工具包
GLUT不是OpenGL所必須的,但它會給我們的學習帶來一定的方便,推薦安裝。
Windows環境下的GLUT下載地址:(大小約為150k)
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
無法從以上地址下載的話請使用下面的連接:
http://upload.programfan.com/upfile/200607311626279.zip
Windows環境下安裝GLUT的步驟:
1、將下載的壓縮包解開,將得到5個文件
2、在「我的電腦」中搜索「gl.h」,並找到其所在文件夾(如果是VisualStudio2005,則應該是其安裝目錄下面的
「VC\PlatformSDK\include\gl文件夾」)。把解壓得到的glut.h放到這個文件夾。
3、把解壓得到的glut.lib和glut32.lib放到靜態函數庫所在文件夾(如果是VisualStudio2005,則應該是其安裝目錄下面的「VC\lib」文件夾)。
4、把解壓得到的glut.dll和glut32.dll放到操作系統目錄下面的system32文件夾內。(典型的位置為:C:\Windows\System32)
(三),建立一個OpenGL工程
這里以VisualStudio2005為例。
選擇File->New->Project,然後選擇Win32 Console Application,選擇一個名字,然後按OK。
在談出的對話框左邊點Application Settings,找到Empty project並勾上,選擇Finish。
然後向該工程添加一個代碼文件,取名為「OpenGL.c」,注意用.c來作為文件結尾。
搞定了,就跟平時的工程沒什麼兩樣的
*******************************************************************************
第二部分:
轉載自 http://blog.tianya.cn/blogger/post_show.asp?BlogID=78856&PostID=14520900
在 Project Properties->Configuration
Properties->Linker->Input->Additional Dependencies
中添加opengl32.lib glu32.lib glaux.lib
*******************************************************************************
自己曾經出現過的兩大問題:
一):error LNK2019: unresolved external symbol __imp__glFlush@ 這類的錯誤
或
1>PT.obj : error LNK2019: 無法解析的外部符號 _auxSolidSphere@8,該符號在函數 _main 中被引用
1>PT.obj : error LNK2019: 無法解析的外部符號 _auxInitWindowA@4,該符號在函數 _main 中被引用
1>PT.obj : error LNK2019: 無法解析的外部符號 _auxInitPosition@16,該符號在函數 _main 中被引用
1>PT.obj : error LNK2019: 無法解析的外部符號 _auxInitDisplayMode@4,該符號在函數 _main 中被引用
原因是沒有在附加依賴項中添加如上lib 文件
解決:Add 「opengl32.lib glu32.lib glaux.lib」 to Project
Properties->Configuration
Properties->Linker->Input->Additional Dependencies
二):error C2664: 「auxInitWindowW」: 不能將參數 1 從「const char [7]」轉換為「LPCWSTR」
與指向的類型無關;轉換要求 reinterpret_cast、C 樣式轉換或函數樣式轉換
錯誤及解決方案:
not passing in a Unicode string – put an 「L」 before the string
literal: L」XXXXX」 or use the TEXT(」XXXXX」) or _T(」XXXXX」) macros…
㈨ OpenGL是一門新語言嗎
它不是一門新的語言,但是你要想使用它需要學習裡面函數的用法。
它其實是一個庫,提供的是介面。
可以用visual studio 2005編輯,也可以用dev編輯,也就是說它不依賴於編程平台。
使用的時候設置好環境,引入這個庫,然後用它提供的函數(介面)就行~
雖然OpenGL是給C語言寫的,但如果希望使用在其它語言中可以使用綁定,同樣可以用於java等其它語言。
比如在java中就有被大家認可並注意的JOGL,它是Java對於OpenGl的綁定(Java Bindings for OpenGL)。理由是它得到Sun(Java的創建者)和SGI(OpenGL的創建者)的支持。
OpenGL官方網頁中列出了用於Java、Fortran 90、Perl、Pike、Python、Ada和Visual Basic的多個綁定。
㈩ 什麼是OpeenGL
OpenGL目錄
概述
Open GL現狀
高級功能
OpenGL編程入門
OpenGL與DirectX的區別
概述
OpenGL - 高性能圖形演算法行業標准
OpenGL™ 是行業領域中最為廣泛接納的 2D/3D 圖形 API, 其自誕生至今已催生了各種計算機平台及設備上的數千優秀應用程序。OpenGL™ 是獨立於視窗操作系統或其它操作系統的,亦是網路透明的。在包含CAD、內容創作、能源、娛樂、游戲開發、製造業、制葯業及虛擬現實等行業領域中,OpenGL™ 幫助程序員實現在 PC、工作站、超級計算機等硬體設備上的高性能、極具沖擊力的高視覺表現力圖形處理軟體的開發。
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平台的編程介面的規格,它用於三維圖象(二維的亦可)。OpenGL是個專業的圖形程序介面,是一個功能強大,調用方便的底層圖形庫。OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS GL是一個工業標準的3D圖形軟體介面,功能雖然強大但是移植性不好,於是SGI公司便在IRIS GL的基礎上開發了OpenGL。OpenGL的英文全稱是「Open Graphics Library」,顧名思義,OpenGL便是「開放的圖形程序介面」。雖然DirectX在家用市場全面領先,但在專業高端繪圖領域,OpenGL是不能被取代的主角。
OpenGL是個與硬體無關的軟體介面,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。因此,支持OpenGL的軟體具有很好的移植性,可以獲得非常廣泛的應用。由於OpenGL是圖形的底層圖形庫,沒有提供幾何實體圖元,不能直接用以描述場景。但是,通過一些轉換程序,可以很方便地將AutoCAD、3DS/3DSMAX等3D圖形設計軟體製作的DXF和3DS模型文件轉換成OpenGL的頂點數組。
在OpenGL的基礎上還有Open Inventor、Cosmo3D、Optimizer等多種高級圖形庫,適應不同應用。其中,Open Inventor應用最為廣泛。該軟體是基於OpenGL面向對象的工具包,提供創建互動式3D圖形應用程序的對象和方法,提供了預定義的對象和用於交互的事件處理模塊,創建和編輯3D場景的高級應用程序單元,有列印對象和用其它圖形格式交換數據的能力。
OpenGL的發展一直處於一種較為遲緩的態勢,每次版本的提高新增的技術很少,大多隻是對其中部分做出修改和完善。1992年7月,SGI公司發布了OpenGL的1.0版本,隨後又與微軟公司共同開發了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運行的大型3D圖形處理軟體也可以在微機上運用。1995年OpenGL的1.1版本面市,該版本比1.0的性能有許多提高,並加入了一些新的功能。其中包括改進列印機支持,在增強元文件中包含OpenGL的調用,頂點數組的新特性,提高頂點位置、法線、顏色、色彩指數、紋理坐標、多邊形邊緣標識的傳輸速度,引入了新的紋理特性等等。OpenGL 1.5又新增了「OpenGL Shading Language」,該語言是「OpenGL 2.0」的底核,用於著色對象、頂點著色以及片斷著色技術的擴展功能。
OpenGL 2.0標準的主要制訂者並非原來的SGI,而是逐漸在ARB中占據主動地位的3DLabs。2.0版本首先要做的是與舊版本之間的完整兼容性,同時在頂點與像素及內存管理上與DirectX共同合作以維持均勢。OpenGL 2.0將由OpenGL 1.3的現有功能加上與之完全兼容的新功能所組成(如圖一)。藉此可以對在ARB停滯不前時代各家推出的各種糾纏不清的擴展指令集做一次徹底的精簡。此外,硬體可編程能力的實現也提供了一個更好的方法以整合現有的擴展指令。
目前,隨著DirectX的不斷發展和完善,OpenGL的優勢逐漸喪失,至今雖然已有3Dlabs提倡開發的2.0版本面世,在其中加入了很多類似於DirectX中可編程單元的設計,但廠商的用戶的認知程度並不高,未來的OpenGL發展前景迷茫。
[編輯本段]Open GL現狀
Open GL仍然是唯一能夠取代微軟對3D圖形技術的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已經不再以任何讓微軟不悅的方式推廣Open GL,因而它存在較高的風險。游戲開發人員是一個有著獨立思想的群體,很多重要的開發人員目前仍然在使用Open GL。因此,硬體開發商正在設法加強對它的支持。Direct3D目前還不能支持高端的圖形設備和專業應用; Open GL在這些領域占據著統治地位。最後,開放源碼社區(尤其是Mesa項目)一直致力於為任何類型的計算機(無論它們是否使用微軟的操作系統)提供Open GL支持。
今年08年正式公布OpenGL3.0版本。並且得到了,nv的支持,其官方網站上提供針對N卡的sdk下載。
[編輯本段]高級功能
OpenGL被設計為只有輸出的,所以它只提供渲染功能。核心API沒有窗口系統、音頻、列印、鍵盤/滑鼠或其它輸入設備的概念。雖然這一開始看起來像是一種限制,但它允許進行渲染的代碼完全獨立於他運行的操作系統,允許跨平台開發。然而,有些整合於原生窗口系統的東西需要允許和宿主系統交互。這通過下列附加API實現:
* GLX - X11(包括透明的網路)
* WGL - Microsoft Windows
* AGL - Apple MacOS
另外,GLUT庫能夠以可移植的方式提供基本的窗口功能。
[編輯本段]OpenGL編程入門
OpenGL作圖非常方便,故日益流行,但對許多人來說,是在微機上進行的,首先碰到的問題是,如何適應微機環境。這往往是最關鍵的一步,雖然也是最初級的。一般的,我不建議使用glut 包.那樣難以充分發揮 windows 的界面上的功能.
下面介紹如何在 VC++ 上進行 OpenGL 編程。 OpenGL 繪圖的一般過程可以看作這樣的,先用 OpenGL 語句在 OpenGL 的繪圖環境 RenderContext (RC)中畫好圖, 然後再通過一個 Swap buffer 的過程把圖傳給操作系統的繪圖環境 DeviceContext (DC)中,實實在在地畫出到屏幕上.
下面以畫一條 Bezier 曲線為例,詳細介紹VC++ 上 OpenGL編程的方法。文中給出了詳細注釋,以便給初學者明確的指引。一步一步地按所述去做,你將順利地畫出第一個 OpenGL 平台上的圖形來。
一、產生程序框架 Test.dsw
New Project | MFC Application Wizard (EXE) | "Test" | OK
*注* : 加「」者指要手工敲入的字串
二、導入 Bezier 曲線類的文件
用下面方法產生 BezierCurve.h BezierCurve.cpp 兩個文件:
WorkSpace | ClassView | Test Classes| <右擊彈出> New Class | Generic Class(不用MFC類) | "CBezierCurve" | OK
三、編輯好 Bezier 曲線類的定義與實現
寫好下面兩個文件:
BezierCurve.h BezierCurve.cpp
四、設置編譯環境:
1. 在 BezierCurve.h 和 TestView.h 內各加上:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
2. 在集成環境中
Project | Settings | Link | Object/library mole | "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且硬體不支持時模擬,你要用大量代碼分析硬體能力和採取不同策略