opengl編程基礎
Ⅰ 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的資料
強力推薦《OpenGL游戲程序設計》作者:K.霍金 D.阿斯特第1篇 OpenGL和DirectX的介紹.
第1章 而今邁步從頭越--OpenGL和Directx
1.1 開發游戲需要理由嗎
1.2 3D游戲世界
1.3 游戲的元素
1.4 開發工具
1.5 什麼是openGL
1.5.1 OpenGL的歷史
1.5.2 OpenGL的體系結構
1.5.3 OpenGL實用庫
1.5.4 什麼是GLUT
1.5.5 輕松一瞥
1.6 什麼是DirectX
1.6.1 DirectX的歷史
1.6.2 DirectX體系結構
1.7 0penGL與DirectX
本章小結
第2章 Windows操作系統平台上的OpenGL編程
2.1 Windows編程介紹
2.1.1 Windows應用程序基礎
.2.1.2從WinMain()開始
2.1.3 Windows Procere
2.1.4 窗口類
2.1.5 窗口類的注冊
2.1.6 窗口的創建
2.1.7 消息循環
2.1.8 一個完整的Windows應用程序
2.2 WGL介紹
2.2.1 繪制環境
2.2.2 WGL的使用
2.3 像素格式
2.3.1 nSize
2.3.2 dwFlag
2.3.3 iPixel lype
2.3.4 cColorBits
2.4 0penGL windOWS應用程序
2.5 全屏OpenGL
本章小結
第3章 3D圖形學理論概覽
3.1 標量、點和矢量
3.1.1 矢量的大小
3.1.2 矢量的歸一化
3.1.3 矢量加法運算
3.1.4 矢量與標量的乘法運算
3.1.5 點積運算
3.1.6 叉積運算
3.2 矩陣
3.2.1 單位矩陣
3.2.2 零矩陣
3.2.3 矩陣加法和減法運算
3.2.4 矩陣乘法運算
3.2.5 矩陣的總體實現
3.3 變換
3.3.1 平移變換
3.3.2 旋轉變換
3.3.3 縮放變換
3.4 投影
3.4.1 平行投影
3.4.2 透視投影
3.5 3D剪裁
3.6 光照
3.6.1 環境光
3.6.2 散射光
3.6.3 鏡面反射光
3.7 紋理映射
本章小結
第2篇 使用OpenGL
第4章 OpenGL狀態和圖元
4.1 狀態函數
4.2 圖元的處理
4.2.1 3D空間中點的繪制
4.2.2 3D空間中線的繪制
4.2.3 3D空間中的多邊形的繪制
4.2.4 圖元的使用
本章小結
第5章 坐標變換和OpenGL矩陣
5.1 理解坐標變換
5.1.1 視點和眼坐標
5.1.2 視圖變換
5.1.3 模型變換
5.1.4 投影變換
5.1.5 視區變換
5.2 OpenGL和矩陣
5.2.1 模型視圖矩陣
5.2.2 平移變換
5.2.3 旋轉變換
5.2.4 縮放變換
5.2.5 矩陣堆棧
5.2.6 機器人常式
5.3 投影變換
5.3.1 正交投影變換
5.3.2 透視投影變換
5.3.3 視區的設置
5.3.4 投影變換實例
5.4 白定義矩陣的使用
5.4.1 自定義矩陣的載入
5.4.2 矩陣的乘法運算
5.4.3 自定義矩陣的實例
本章小結
第6章 添加顏色、混合與光照
6.1 顏色是如何工作的
6.2 在OpenGL中使用顏色
6.2.1 顏色深度
6.2.2 顏色立方體模型
6.2.3 OpenGL中的RGBA模式
6.2.4 OpenGL中的顏色索引模式
6.3 明暗處理
6.4 OpenGL中的光照
6.4.1 OpenGL光照和現實世界
6.4.2 材質
6.4.3 法線
6.4.4 OpenGL光照的使用
6.5 顏色混合
透明度
本章小結
第7章 點陣圖、圖像與OpenG L..
7.1 0penGL點陣圖
7.1.1 點陣圖的定位
7.1.2 點陣圖的繪制
7.1.3 一個OpenGL點陣圖常式
7.2 圖像的使用
7.2.1 圖像數據的繪制
7.2.2 屏幕的讀取
7.2.3 屏幕數據的復制
7.2.4 放大、縮小和翻轉
7.3 像素存儲的管理
7.4 WindOWS點陣圖
7.4.1 BMP文件格式
7.4.2 BMP文件的載入
7.4.3 BMP文件的輸
7.5 Targa圖像文件
7.5.1 Targa文件格式
7.5.2 Targa文件的載入
7.5.3 Targa文件的輸出
本章小結
第8章 紋理映射
8.1 紋理映射的概覽
8.2 紋理圖的應用
8.2.1 2D紋理
8.2.2 lD紋理
8.2.3 3D紋理
8.3 紋理對象
8.3.1 紋理名字的生成
8.3.2 紋理對象的創建和使用
8.4 紋理的過濾處理
8.5 紋理模式
8.6 紋理坐標
8.6.1 重復和夾持紋理
8.6.2 mipmap和細節層次
8.6.3 mipmap的自動牛成
8.7 常式--飄動的旗幟
8.7.1 常式的解釋說明
8.7.2 常式的實現
8.8 常式--高程紋理地形
8.8.1 常式的解釋說明
8.8.2 常式的實現
本章小結
第9章 高級紋理映射
9.1 多紋理映射
9.1.1 多紋理支持的驗證
9.1.2 擴展函數的訪問
9.1.3 紋理單元的建市
9.1.4 紋理坐標的設置(指定)
9.1.5 綜合應用
9.2 環境映射
9.3 紋理矩陣
9.4 光照映射
9.5 多通道多紋理映射
本章小結
第1O章 顯示列表與頂點數組
lO.1 顯示列表
10.1.1 顯示列表的創建
10.1.2 向顯示列表中填充命令
10.1.3 顯示列表的執行
10.1.4 顯示列表的注意事項
10.1.5 顯示列表的銷毀
10.1.6 顯示列表與紋理
10.1.7 常式:使用顯示列表的機器人演示程序
lO.2 頂點數組
10.2.1 頂點數組的啟用
10.2.2 數組的使用
10.2.3 頂點數組與多紋理映射
10.2.4 數組的鎖定
10.2.5 常式:再建地形演示程序
本章小結
第11章 文本的顯示
11.1 點陣圖字體
l1.2 輪廓字體
ll.3 紋理映射字體
本章小結
第12章 OpenGL緩存
12.1 什麼是OpenGL緩存
12.1.1 像素格式的設置
12.1.2 緩存的清理
12.2 顏色緩存
12.2.1 雙緩存系統
12.2.2 立體緩存
12.3 深度緩存
12.3.1 深度比較程序
12.3.2 深度緩存的使用
l2.4 模板緩存
l2.5 累積緩存
本章小結
第13章 OpenGL二次曲面
13.1 OpenGL二次曲面的基礎
l3.1.1 繪制風格
13.1.2 法線
13.1.3 指向
13.1.4 紋理坐標
13.1.5 清理
13.2 圓盤
l3.3 圓柱
l3.4 球
13.5 常式:飛掠一個二次世界
本章小結
第14章 曲線與曲面
14.1 曲線與曲面的描述
14.1.1 參數方程
14.1.2 控制點與連續性
l4.2 求值程序
14.3 曲面
14.4 NURBS
本章小結
第15章 特殊效果
l5.1 標志板
15.2 粒子系統的使用
15.2.1 粒子
l5.2.2 粒子系統
15.2.3 粒子系統管理器
15.2.4 實例
l5.2.5 粒子系統的效果
15.2.6 常式:暴風雪
l5.3 霧
15.3.1 OpenGL的霧
15.3.2 體積霧
l 5.4 鏡像
15.4.1 光照的鏡像
15.4.2 深度緩存的處理
15.4.3 使用模板緩存來處理有限的平面
15.4.4 對於非常規鏡像表而的處理
15.4.5 對任意指向的平面的處理
l5.5 陰影
15.5.1 靜態陰影
15.5.2 投射陰影
15.5.3 模板陰影體
15.5.4 其他的方法
15.5.5 常式:鏡像與陰影
本章小結
第3篇 建立一個游戲
第16章 DirectX的使用:DirectInput
16.1 為什麼要使用DirectInput
16.1.1 Windows消息
16.1.2 Win32
16.1.3 Directlnput
16.2 DirectInput的初始化
16.3 DirectInput的使用
16.3.1 設備的添加
16.3.2 輸入的獲取
l6.3.3 關閉
16.4 動作映射
16.5 輸入子系統的建立
l6.6 輸入系統常式
本章小結
第17章 Directx Audio的使用
l7.1 聲音的基礎
l7.2 什麼是DiteetX Audio
17.2.1 DirecIX Audio的功能部件
l7.2.2 音頻數據流
17.3 使用DirectMusic載入和演奏音頻
17.3.1 初始化COM
17.3.2 創建與初始化演奏對象
17.3.3 創建loader對象
17.3.4 載入一個segment對象
17.3.5 下載波段
17.3.6 演奏segment
17.3.7 停止一個segment的播放
17.3.8 segment是甭止在播放
17.3.9 segment循環的控制
17.3.10 清理
l7.4 一個簡單的常式
l7.5 Audiopath的使用
17.5.1 默認的Audiopath
l7.5.2 標准Audiopath
17.5.3 在Audiopath上播放聲音
17.5.4 從Audiopath獲取對象
17.6 3D聲音
l7.6.1 3D聲音坐標
17.6.2 感知
17.6.3 DirectSound 3D緩存
17.6.4 3D參數的設置
17.6.5 DirectSound 3D聽者
17.6.6 3D音效文本常式
本章小結
第18章 3D模型的處理
18.1 3D模型文件格式
18.2 MD2文件格式
18.2.1 MD2的實現
18.2.2 MD2的載入
18.2.3 MD2的顯示
18.2.4 添加紋理
18.2.5 模型的動畫
18.2.6 開發一個CMD2Model類
18.2.7 模型動畫的控制
18.3 最後的一點小資料
本章小結
第19章 OpenGL物理建模
19.1 物理學的回顧
19.1.1 時間
19.1.2 距離、位移和位置
19.1.3 速度
l9.1.4 加速度
19.1.5 作用力
19.1.6 動量
19.1.7 摩擦力
19.2 真實世界的模擬
19.2.1 任務的分解
19.2.2 定時
19.2.3 矢量
l9.2.4 平面
19.2.5 物體
l9.2.6 物體碰撞的處理
19.2.7 一個常式:空中曲棍球
本章小結
第20章 建立一個游戲引擎
20.1 SimpEngine的設計
20.1.1 利用CNode管理數據
20.1.2 對象的處胖:CObiect
20.2 引擎核
20.2.1 輸入系統
20.2.2 CEngine類
20.2.3 游戲循環
20.2.4 輸入的處理
20.2.5 SimpEngine
20.3 視點
20.4 場景
20.5 模型的添加
20.6 音頻系統
20.7 粒子系統
本章小結
第21章 創建一個游戲:殺戮時刻
2l.1 初始設計
21.2 游戲場景
21.3 敵人
21.4 火箭與爆炸
21.5 用戶的交互
21.6 運行游戲
21.7 建EXE可執行文件
本章小結
第4篇 附錄
附錄A 在線資源
A.1 游戲開發
A.2 OpenGL
A.3 DirectX
A.4 其他的資源
附錄B 隨書所附資料的使用
B.1 用戶界面
B.2 文件結構
B.3 系統要求
B.4 安裝
B.5 其他相關問題與疑難解答信息
B.6 是否仍舊需要幫助 ...
Ⅲ 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
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)等
特殊效果。從而實現了消隱演算法。
Ⅳ C語言windows,OpenGL編程
查找 MSDN 可以得知,MSG 裡面的 pt 坐標是相對於窗口的左上角的;
2. 至於聲音控制和播放,可以使用 Windows 自帶的 MCI API,或者使用 DirectSound 來播放,我推薦你使用 un4seen 的 BASS,簡單實用強大,一兩個函數就可以播放音效了;
3. 你要使用 alpha blend 與桌面進行鏤空運算,就必須首先獲得桌面的窗體句柄,OpenGL 的 alppha 運算我不是很懂,不過 Direct3D 的話就簡單多了;
4. 屏幕常亮,其實就是阻止系統進入休眠狀態,每當系統要進入休眠狀態之前,都會向系統的所有窗口發送一條消息,你攔截這條消息,進行特別的處理就可以防止系統進入休眠了,至於是什麼消息,請查看 MSDN,我也好久沒用過這條消息了;
5.bmp 文件可以保存 alpha 通道,使用 32bit 色深的 bmp 文件就可以了,RGB 分別 8bit,alpha 通道 8bit,不過說到 alpha 通道,tga 或者 png 圖片更加合適,因為他們可以進行無損壓縮;
6.用GetPocAddress導出函數,只能用類型強制轉換,這個是 windows 的原則,我們只能去迎合它了 ...
7. 執行 NULL 指針的話,不同的系統會有不同的反應,XP 是直接程序崩潰,Vista 或者以上的系統,就會提示無響應
8. 如果你建立的工程是 Win32 窗口程序,那麼就不會有 DOS 窗口,如果你建立的是 Win32 控制台程序,那麼就會有 DOS 窗口;如果你使用 OpenGL 實用庫來創建 OpenGL 程序,那個 DOS 窗口是無法消除的,它可以幫助你進行錯誤排查
9. 不要用 Dev C++ 了,用 VS2010 吧,這是行業規范
最後,祝樓主學習愉快
Ⅳ OpenGL編程大概要學多久誰有好的書推薦
看你心情咯,主要都是一些函數的學習,如果有計算機圖形學基礎,應該不是很難。推薦的話,當然是OpenGL紅寶書,《OpenGL編程指南》咯,網上有很多電子書下,包括書上源碼。
Ⅵ opengl編程指南適合初學者嗎
其實我覺得NeHe的OpenGL指南應該是比較容易理解和入門的~
如果常式運行有問題,最好找一下問題根源所在~
我記得我當初學openGL的時候(做虛擬現實相關的破爛玩意兒~),只有一點點的WINDOWS編程基礎(自學的《windows程序設計》這本書),用的也是nehe的教程,感覺用來入門還算不錯的~
不過後來的工作,再也沒有用過openGL。。。都淡忘了
=。=
Ⅶ C++做游戲
你可以學一下顯卡API,比如 OpenGL (推薦,兼容性好) 或 DirectX 。然後看看關於游戲編程的書(上當當網找)。當然最好要有團隊合作,因為一個人通常完不成。
如果要學 OpenGL,推薦一本:《OpenGL編程基礎》。
Ⅷ 介紹常用的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編程指南第八版中文版怎麼樣,適合入門學習么
其實我覺得NeHe的OpenGL指南應該是比較容易理解和入門的~如果常式運行有問題,最好找一下問題根源所在~我記得我當初學openGL的時候(做虛擬現實相關的破爛玩意兒~),只有一點點的WINDOWS編程基礎(自學的《windows程序設計》這本書),用的也是nehe的教程,感覺用來入門還算不錯的~不過後來的工作,再也沒有用過openGL。。。都淡忘了=。=
Ⅹ OPenGL非常非常基礎的一個編程問題
glClear(GL_COLOR_BUFFER_BIT|GLUT_DOUBLE|GLUT_DEPTH);
這句話不對
glClear(GL_COLOR_BUFFER_BIT);
這樣就對了
可是你這個畫出來的不是個線球嗎