opengl伺服器源碼
1. openGL 是什麼軟體
OpenGL三維圖形標準是由AT&T公司UNIX軟體實驗室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL圖形庫標準的基礎
上聯合推出的開放式圖形庫,它使在微機上實現三維真實
感圖形的生成與顯示成為可能。由於OpenGL是開放的圖形標
准,用戶原先在UNIX下開發的OpenGL圖形軟體很容易移植到微
機上的WindowsNT/95上。筆者在VisualC++4.1(以下簡稱VC)集
成環境下,開發了基於OpenGL的三維真實感圖形應用程序,現
介紹如下。
微機上的OpenGL開發環境
基於OpenGL標准開發的應用程序必須運行於32位Windows
平台下,如WindowsNT或Windows95環境;而且運行時還需有動態
鏈接庫OpenGL32.DLL、Glu32.DLL,這兩個文件在安裝WindowsNT時已
自動裝載到C:\WINNT\SYSTEM32目錄下(這里假定用戶將WindowsNT
安裝在C盤上);而對於使用Windows95平台的用戶,則需手工將
兩個動態庫復制到Windows95目錄的SYSTEM子目錄中。安裝了
WindowsNT/95和VC4.1後,用戶就具備了基於OpenGL開發三維圖
形軟體的基本條件。
OpenGL程序設計的基本步驟
1.OpenGL在WindowsNT下的運行機制
OpenGL工作在客戶機/伺服器模式下,當客戶方(即基
於OpenGL標准開發的應用程序)向伺服器(OpenGL核心機制)發出
命令時,由伺服器負責解釋這些命令。通常情況下,客戶方
和伺服器是運行在同一台微機上的。由於OpenGL的運行機制
是客戶機/伺服器模式,這使得用戶能夠十分方便地在網
絡環境下使用OpenGL,OpenGL在WindowsNT上的這種實現方式通常
稱為網路透明性。
OpenGL的圖形庫函數封裝在動態鏈接庫OpenGL32.DLL中,
客戶機中的所有OpenGL函數調用,都被傳送到伺服器上,由
WinSrv.DLL實現功能,再將經過處理的指令發送到Win32設備驅
動介面(DDI),從而實現在計算機屏幕上產生圖像。
若使用OpenGL圖形加速卡,則上述機制中將添加兩個
驅動器:OpenGL可裝載客戶模塊(OpenGLICD)將安裝在客戶端;硬
件指定DDI將安裝在伺服器端,與WinDDI同一級別。
2.OpenGL的庫函數
開發基於OpenGL的應用程序,必須先了解OpenGL的庫函
數。OpenGL函數命令方式十分有規律,每個庫函數均有前綴gl
、glu、aux,分別表示該函數屬於OpenGL基本庫、實用庫或輔助
庫。WindowsNT下的OpenGL包含了100多個核心函數,均以gl作為前
綴,同時還支持另外四類函數:
OpenGL實用庫函數:43個,以glu作為前綴;
OpenGL輔助庫函數:31個,以aux作為前綴;
Windows專用庫函數(WGL):6個,以wgl作為前綴;
Win32API函數(WGL):5個,無前綴。
OpenGL的115個核心函數提供了最基本的功能,可以實
現三維建模、建立光照模型、反走樣、紋理映射等;OpenGL實
用庫函數在核心函數的上一層,這類函數提供了簡單的調
用方法,其實質是調用核心函數,目的是減輕開發者的編程
工作量;OpenGL輔助庫函數是一些特殊的函數,可以供初學者
熟悉OpenGL的編程機制,然而使用輔助庫函數的應用程序只
能在Win32環境中使用,可移植性較差,所以開發者應盡量避
免使用輔助庫函數;Windows專用庫函數(WGL)主要針對WindowsNT
/95環境的OpenGL函數調用;Win32API函數用於處理像素存儲格
式、雙緩存等函數調用。
3.VC環境下基於OpenGL的編程步驟
下面介紹在VC環境中建立基於Opeetting菜單選項,在Link欄的Lib輸入域中
添加openg132.lib、glu32.lib,若需使用OpenGL的輔助庫函數,則還
需添加glaux.lib。
(3)選擇View/ClassWizard菜單選項,打開MFC對話框,在
ClassName欄中選擇CMyTestView類,進行以下操作:
選擇WM_CREATE消息,滑鼠單擊EditCode,將OpenGL初始化代碼
添加到OnCreate()函數中:
/*定義像素存儲格式*/
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0,
}
CCLientdc(this);
intpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dc.m_hDC);
選擇WM_DESTORY消息,在OnDestory()中添加以下代碼:
wglDeleteContext(m_hRC);
在MyTestView.cpp中,將以下代碼添加到PreCreateWindows()函數中:
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只對WS_CLIPCHILDREN|WS_CLIPSIBLINGS類型窗口有效;
在MyTestView.cpp中,將以下代碼添加到OnDraw()函數中:
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用戶自定義函數,用於繪制三維場景;
wglMakeCurrent(pDC->m_hDC,NULL);
在MyTestView.cpp中,添加成員函數DrawScene():
voidCMyTestView::DrawScene()
{/*繪制三維場景*/}
(4)在MyTestView.h中包含以下頭文件並添加類成員說明:
#include
#include
#include
在CTestView類中的protected:段中添加成員變數聲明:
HGLRCm_hRC;
同時添加成員函數聲明:
DrawScene();
這樣,一個基於OpenGL標準的程序框架已經構造好,用
戶只需在DrawScene()函數中添加程序代碼即可。
建立三維實體模型
三維實體建模是整個圖形學的基礎,要生成高逼真
度的圖像,首先要生成高質量的三維實體模型。
OpenGL中提供了十幾個生成三維實體模型的輔助庫函
數,這些函數均以aux作為函數名的前綴。簡單的模型,如球
體、立方體、圓柱等可以使用這些輔助函數來實現,如
auxWireSphere(GLdoubleradius)(繪制一半徑為radius的網狀球體)。
但是這些函數難以滿足建立復雜三維實體的需要,所以用
戶可以通過其它建模工具(如3DS等)來輔助建立三維實體模
型資料庫。筆者在三維實體的建模過程中採用3DS提供的2D
Shape、3DLofter和3DEditor進行模型的編輯,最後通過將模型數
據以DXF文件格式輸出存儲供應用程序使用。
真實感圖形的繪制
1.定義光照模型和材質
(1)光源。OpenGL提供了一系列建立光照模型的庫函
數,使用戶可以十分方便地在三維場景中建立所需的光照
模型。OpenGL中的光照模型由環境光(AmbientLight)、漫射光
(DiffuseLight)、鏡面反射光(SpecularLight)等組成,同時還可設
置光線衰減因子來模擬真實的光源效果。
例如,定義一個黃色光源如下:
GlfloatLight_position[]={1.0,1.0,1.0,0.0,};
GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,};
glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定義光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定義光源漫射光
光源必須經過啟動後才會影響三維場景中的實體,可以通過以下指令使光源有效:<
glEnable(LIGHTING);//啟動光照模型;
glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效;
OpenGL中一共可以定義GL_LIGHT0~GL_LIGHT7八個光源。
(2)材質。OpenGL中的材質是指構成三維實體的材料在
光照模型中對於紅、綠、藍三原色的反射率。與光源的定義
類似,材質的定義分為環境、漫射、鏡面反射成分,另外還
有鏡面高光指數、輻射成分等。通過對三維實體的材質定義
可以大大提高應用程序所繪制的三維場景的逼真程度。例
如:
/*設置材質的反射成分*/
GLfloatmat_ambient[]={0.8,0.8,0.8,1.0};
GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/
GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*鏡面高光亮紫色*/
GLfloatmat_shiness[]={100.0};/*高光指數*/
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定義環境光反射率*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定義漫射光反射率*/
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定義鏡面光反射率*/
glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定義高光指數*/
(3)材質RGB值與光源RGB值的關系。OpenGL中材質的顏色
與光照模型中光源的顏色含義略有不同。對於光源,R、G、B
值表示三原色在光源中所佔有的比率;而對於材質定義,R、
G、B的值表示具有這種材質屬性的物體對於三原色的反射
比率,場景中物體所呈現的顏色與光照模型、材質定義都相
關。例如,若定義的光源顏色是(Lr,Lg,Lb)=(1.0,1.0,1.0)(白光),
物體的材質顏色定義為(Mr,Mg,Mb)=(0.0,0.0,0.8),則最終到達人
眼的物體顏色應當是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(藍色)。
2.讀取三維模型數據
為了繪制三維實體,我們首先必須將預先生成的三
維實體模型從三維實體模型庫中讀出。下圖描述了讀取三
維實體模型的流程。
3.三維實體繪制
由於3DS的DXF文件中對於三維實體的描述是採用三角
形面片逼近的方法,而在OpenGL函數庫中,提供了繪制三角形
面片的方法,所以為三維實體的繪制提供了方便。以下提供
了繪制三角形面片的方法:
glBegin(TRANGLES);//定義三角形繪制開始
glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一個頂點
glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二個頂點
glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三個頂點
glEnd();//繪制結束
為了提高三維實時動畫的顯示速度,我們利用了
OpenGL庫中的顯示列表(DisplayList)的功能,將三維場景中的實
體分別定義為單獨的顯示列表,預先生成三維實體。在圖形
顯示時,只需調用所需的顯示列表即可顯示相應的三維實
體,而不需要重新計算實體在場景中的坐標,避免了大量的
浮點運算。在調用顯示列表前所作的旋轉、平移、光照、材
質的設定都將影響顯示列表中的三維實體的顯示效果。具
體實現演算法如下:
for(ObjectNo=0;ObjectNo<實體個數;ObjectNo++)
{
glNewList(ObjectNo,GL_COMPILE);//創建第ObjectNo個實體的顯示列表
for(Fac
2. 雲伺服器不支持opengl
雲伺服器不支持opengl是顯卡不支持模擬器。電腦顯卡的驅動不存在或者太舊會出現不支持opengl。
1、下載驅動精靈檢測安裝顯卡驅動。
2、運行驅動精靈,點擊一鍵體檢安裝,更新顯卡驅動。
2、裝的萬能驅動,顯卡驅動更新下,重啟電腦再安裝。
3、更新顯卡驅動後,出現電腦屏幕綠屏、花屏等顯示不正常,回滾顯卡驅動。
3. 無頭伺服器no root 無屏幕渲染
在headless server(無頭伺服器)上安裝實現pyrender.offscreen render(無屏幕渲染)通常會遇到一些挑戰,特別是當伺服器僅配備加速計算卡(如tesla V100 32G)且沒有圖形渲染支持的GPU驅動時。在嘗試運行包含使用GPU的openGL介面的py腳本時,程序可能會因為缺少圖形顯示許可權或GPU驅動的渲染部分而長時間卡住。然而,是否可以在伺服器上僅使用CPU實現離屏渲染呢?答案是肯定的。通過使用Osmesa/mesa作為對OpenGL介面的模擬,我們能夠藉助CPU實現off-screen渲染。
安裝Osmesa/mesa的難度在於,它需要特殊的許可權和環境配置,這通常涉及到root許可權。盡管如此,為了解決這個問題,Pyrender的作者提供了源碼安裝方式,這為沒有root許可權的用戶提供了一條可行的途徑。首先,確保伺服器具備安裝Osmesa/mesa所需的一些依賴包,如llvm-6.0,一個用於編譯優化的工具集。在沒有sudo許可權的情況下,通過源碼安裝llvm-6.0是一種可行且高效的方法,無需依賴於apt-get工具。
完成llvm-6.0的安裝後,下一步是下載mesa的源代碼。通常,下載後需要在本地創建一個目錄,並將源碼包放入其中。接著,通過構建、編譯和安裝mesa庫來完成Osmesa/mesa的安裝過程。在安裝過程中,可能會遇到配置問題,尤其是設置PREFIX路徑時,確保正確設置以避免安裝失敗。如果遇到安裝失敗,請檢查路徑設置和依賴包是否正確安裝。
安裝mesa後,接下來需要從指定源下載並安裝pyrender的Osmesa/mesa支持。在進行make命令前,可能需要對mesa的配置進行一些調整,以確保與當前環境的兼容性。在遇到編譯錯誤時,檢查路徑設置和編譯選項,確保沒有遺漏或錯誤。如果遇到特定錯誤,例如找不到llvm或其版本過低的問題,需要檢查並更新相關組件。
在成功安裝Osmesa/mesa後,pyrender.offscreen render(無屏幕渲染)的功能便可以在無頭伺服器上實現,無需額外的GPU硬體或root許可權。這一過程雖然較為復雜且耗時,但通過遵循詳細的步驟和調試,可以克服安裝過程中的挑戰,最終在無頭伺服器環境中實現高效的離屏渲染功能。
4. OpenCL,OpenGL和DirectX三者的區別
什麼是OpenCL?
OpenCL全稱Open Computing Language,是第一個面向異構系統通用目的並行編程的開放式、免費標准,也是一個統一的編程環境,便於軟體開發人員為高性能計算伺服器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他並行處理器,在游戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景。
OpenCL 1.0主要由一個並行計算API和一種針對此類計算的編程語言組成,此外還特別定義了:
1、C99編程語言並行擴展子集;
2、適用於各種類型異構處理器的坐標數據和基於任務並行計算API;
3、基於IEEE 754標準的數字條件;
4、與OpenGL、OpenGL ES和其他圖形類API高效互通。
什麼是OpenGL?
OpenGL™ 是行業領域中最為廣泛接納的 2D/3D 圖形 API, 其自誕生至今已催生了各種計算機平台及設備上的數千優秀應用程序。OpenGL™ 是獨立於視窗操作系統或其它操作系統的,亦是網路透明的。在包含CAD、內容創作、能源、娛樂、游戲開發、製造業、制葯業及虛擬現實等行業領域中,OpenGL™ 幫助程序員實現在 PC、工作站、超級計算機等硬體設備上的高性能、極具沖擊力的高視覺表現力圖形處理軟體的開發。
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平台的編程介面的規格,它用於三維圖象(二維的亦可)。OpenGL是個專業的圖形程序介面,是一個功能強大,調用方便的底層圖形庫。OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS GL是一個工業標準的3D圖形軟體介面,功能雖然強大但是移植性不好,於是SGI公司便在IRIS GL的基礎上開發了OpenGL。OpenGL的英文全稱是「Open Graphics Library」,顧名思義,OpenGL便是「開放的圖形程序介面」。雖然DirectX在家用市場全面領先,但在專業高端繪圖領域,OpenGL是不能被取代的主角。
Open GL仍然是唯一能夠取代微軟對3D圖形技術的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已經不再以任何讓微軟不悅的方式推廣Open GL,因而它存在較高的風險。游戲開發人員是一個有著獨立思想的群體,很多重要的開發人員目前仍然在使用Open GL。因此,硬體開發商正在設法加強對它的支持。Direct3D目前還不能支持高端的圖形設備和專業應用; Open GL在這些領域占據著統治地位。最後,開放源碼社區(尤其是Mesa項目)一直致力於為任何類型的計算機(無論它們是否使用微軟的操作系統)提供Open GL支持。
今年08年正式公布OpenGL3.0版本。並且得到了,nv的支持,其官方網站上提供針對N卡的sdk下載。
什麼是DirectX?
DirectX是一種應用程序介面(API),它可讓以windows為平台的游戲或多媒體程序獲得更高的執行效率,加強3d圖形和聲音效果,並提供設計人員一個共同的硬體驅動標准,讓游戲開發者不必為每一品牌的硬體來寫不同的驅動程序,也降低用戶安裝及設置硬體的復雜度。這樣說是不是有點不太明白,其實從字面意義上說,Direct就是直接的意思,而後邊的X則代表了很多的意思,從這一點上我們就可以看出DirectX的出現就是為了為眾多軟體提供直接服務的。
DirectX是由很多API組成的,按照性質分類,可以分為四大部分,顯示部分、聲音部分、輸入部分和網路部分。
顯示部分擔任圖形處理的關鍵,分為DirectDraw(DDraw)和 Direct3D(D3D),前者主要負責2D圖像加速。它包括很多方面:我們播放mpg、DVD電影、看圖、玩小游戲等等都是用的DDraw,你可以把它理解成所有劃線的部分都是用的DDraw。後者則主要負責3D效果的顯示,比如CS中的場景和人物、FIFA中的人物等等,都是使用了DirectX的 Direct3D。
OpenCL、OpenGL和DirectX之間不得不說的故事
業界對Apple的OpenCL的支持將成為它發展的重要因素,早在90年代中期,微軟就曾經努力阻止OpenGL成為行業的標准,以推行自己的DirectX顯卡軟體和游戲工具。微軟的Direct X起初的戰略是為了推動DOS游戲開發者轉向Windows,從此之後它就被綁定在Windows下為PC游戲服務,所以它僅支持Windows。
斷發布新版的DirectX也推動了開發者轉向最新版的Windows,比如最新版的DirectX 10就帶來了不少Vista專屬游戲,從而推動了Vista的銷量,然而它並未達到預期的效果,因為Vista的速度阻礙了DirectX10游戲的市場,開發者只能將目標再次轉向XP。
OpenGL和Apple
OpenGL的前身是高端圖形工作站廠商SGI在80年代所開發的IRIS G,它在90年代初期成為了開源的標准。當時微軟在它的Windows 95中發布了Direct3D,將它作為OpenGL的競爭對手。而在90年代末,微軟曾經和SGI進行了Fahrenheit項目的開發,試圖將兩者結合起來,但是沒有成功。之後微軟繼續開發DirectX並與GPU廠商合作,留下OpenGL任其發展。
OpenGL之後幾乎逐漸消失,直到90年代末Apple放棄了自己的QuickDraw 3D,將OpenGL作為Mac OS X的官方3D庫。Apple的系統給OpenGL程序帶來了不少擁護者。之後OpenGL正式被Linux採用,現在主流的游戲平台,包括PSP,PS3 和Wii都支持該技術。
但是微軟的Xbox360例外,它採用了自己的DirectX 圖形庫,而將OpenGL排除在外。如今OpenGL對DirectX來說比以前更有競爭力了。而微軟計劃在Windows 7中的DirectX 11增加類似於OpenCL的技術,以實現GPGPU運算。但是Apple的OpenCL能更緊密地與OpenGL代碼協同工作,能帶來更廣泛的支持。 Apple還將OpenCL作為一個免費的,開源的標准,讓任何人都能參與到該平台中來。
OpenGL和OpenCL設計的相似性,使開發者更易於開發。比如在OpenCL下進行數據虛擬化計算,可以把相同的對象在OpenGL上進行圖形渲染。同時OpenGL下的圖形渲染可以在OpenCL下進行處理和轉換。
OpenCL得到了GPU廠商NVIDIA和AMD的支持,同時支持Apple,SONY,任天堂的平台,還支持Linux和Windows,而且任何公司的開發者都可以參與到該技術的發展中來。
5. OpenGl是什麼
OpenGL是一種高性能的三維圖形標准,由多家知名計算機公司聯合推出,如SGI、Microsoft、IBM等。它是一個開放的、通用的三維圖形庫,使得在微機上實現高質量的三維圖形生成與顯示成為可能。由於其開放性,開發的OpenGL軟體可在Windows NT、95等平台之間輕松移植。在Visual C++集成開發環境中,可以利用OpenGL創建三維真實感圖形應用。
為了進行OpenGL開發,首先需要在32位Windows環境中,如Windows NT或95,安裝動態鏈接庫OpenGL32.DLL和Glu32.DLL。這些庫在Windows安裝時會被自動載入或手動復制到指定目錄。具備這些環境後,開發流程涉及以下幾個關鍵步驟:
- OpenGL採用客戶機/伺服器模式,客戶機應用發送命令給伺服器解釋,提供網路透明性。在Windows NT中,所有OpenGL函數調用通過動態鏈接庫傳遞。
- OpenGL的庫函數分為核心函數(100多個)、實用庫(43個)、輔助庫(31個)和專用庫。核心函數是基礎,實用庫簡化調用,輔助庫供初學者學習,專用庫針對特定環境。
- 在VC環境下,通過菜單選項添加OpenGL庫,如opengl32.lib、glu32.lib,並在MFC對話框中設置像素格式和OpenGL上下文。還需編寫OnCreate()和OnDestroy()函數以初始化和清理OpenGL環境。
- 在DrawScene()函數中,開發者可以創建三維模型,如使用aux庫函數生成球體、立方體等,然後定義光照模型和材質,包括環境光、漫反射、鏡面反射等。
- OpenGL支持讀取三維模型數據和繪制,利用三角形面片逼近方法。為了提高性能,可以使用顯示列表功能預先生成和存儲實體,簡化顯示過程。
OpenGL提供了豐富的功能,如建模、變換、顏色模式、光照材質、紋理映射、點陣圖顯示增強、雙緩存動畫等,使得模擬和圖形顯示更加真實和高效。總之,OpenGL是微機三維圖形開發的強大工具,為各種應用提供了豐富的可能性和良好的移植性。