學習OpenGL

openGL官網https://www.opengl.org/

如何檢測顯卡類型和OpenGL版本?

[OpenGL入門學習](http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html)

OpenGL在線書籍:Learn OpenGL

OpenGL庫深度剖析 & gl,glu,glut的區別

OpenGL開發庫的組成

開發基於OpenGL的應用程序,必須先了解OpenGL的庫函數。它採用C語言風格,提供大量的函數來進行圖形的處理和顯示。OpenGL庫函數的命名方式非常有規律。所有OpenGL函數採用了以下格式
<庫前綴><根命令><可選的參數個數><可選的參數類型>
庫前綴有gl、glu、aux、glut、wgl、glx、agl等等,分別表示該函數屬於OpenGL那個開發庫等,從函數名後面中還可以看出需要多少個參數以及參數的類型。I代表int型,f代表float型,d代表double型,u代表無符號整型。例如glVertex3fv()表示了該函數屬於gl庫,參數是三個float型參數指針。我們用glVertex*()來表示這一類函數。
這裏寫圖片描述
圖1
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多個。核心庫中的函數主要可以分爲以下幾類函數。
繪製基本幾何圖元的函數。如繪製圖元的函數glBegain()、glEnd()、glNormal*()、glVertex*()。
矩陣操作、幾何變換和投影變換的函數。如矩陣入棧函數glPushMatrix()、矩陣出棧 函數glPopMatrix()、裝載矩陣函數glLoadMatrix()、矩陣相乘函數glMultMatrix(),當前矩陣函數glMatrixMode()和矩陣標準化函數glLoadIdentity(),幾何變換函數glTranslate*()、glRotate*()和glScale*(),投影變換函數glOrtho()、glFrustum()和視口變換函數glViewport()等等。
顏色、光照和材質的函數。如設置顏色模式函數glColor*()、glIndex*(),設置光照效果的函數glLight*() 、glLightModel*()和設置材質效果函數glMaterial()等等。
顯示列表函數、主要有創建、結束、生成、刪除和調用顯示列表的函數glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()。
紋理映射函數,主要有一維紋理函數glTexImage1D()、二維紋理函數glTexImage2D()、 設置紋理參數、紋理環境和紋理座標的函數glTexParameter*()、glTexEnv*()和glTetCoord*()等。
特殊效果函數。融合函數glBlendFunc()、反走樣函數glHint()和霧化效果glFog*()。
光柵化、象素操作函數。如象素位置glRasterPos*()、線型寬度glLineWidth()、多邊形繪製模式glPolygonMode(),讀取象素glReadPixel()、複製象素glCopyPixel()等。
選擇與反饋函數。主要有渲染模式glRenderMode()、選擇緩衝區glSelectBuffer()和反饋緩衝區glFeedbackBuffer()等。
曲線與曲面的繪製函數。生成曲線或曲面的函數glMap*()、glMapGrid*(),求值器的函數glEvalCoord*() glEvalMesh*()。
狀態設置與查詢函數。主要有glGet*()、glEnable()、glGetError()等。

2. OpenGL實用庫The OpenGL Utility Library (GLU)

包含有43個函數,函數名的前綴爲glu。
OpenGL提供了強大的但是爲數不多的繪圖命令,所有較複雜的繪圖都必須從點。線、面開始。Glu 爲了減輕繁重的編程工作,封裝了OpenGL函數,Glu函數通過調用核心庫的函數,爲開發者提供相對簡單的用法,實現一些較爲複雜的操作。此函數由glu.dll來負責解釋執行。OpenGL中的核心庫和實用庫可以在所有的OpenGL平臺上運行。主要包括了以下幾種。
輔助紋理貼圖函數,有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。
座標轉換和投影變換函數,定義投影方式函數gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影視景體函數gluPickMatrix(),投影矩陣計算gluProject()和 gluUnProject()等等。
多邊形鑲嵌工具,有gluNewTess()、 gluDeleteTess()、gluTessCallback()、gluBeginPolygon() gluTessVertex()、gluNextContour()、gluEndPolygon()等等。
二次曲面繪製工具,主要有繪製球面、錐面、柱面、圓環面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。
非均勻有理B樣條繪製工具,主要用來定義和繪製Nurbs曲線和曲面,包括gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty()等函數。
錯誤反饋工具,獲取出錯信息的字符串gluErrorString().

3. OpenGL輔助庫

包含有31個函數,函數名前綴爲aux。
這部分函數提供窗口管理、輸入輸出處理以及繪製一些簡單三維物體。此函數由glaux.dll來負責解釋執行。創建aux庫是爲了學習和編寫OpenGL程序,它更像是一個用於測試創意的預備基礎接管。Aux庫在windows實現有很多錯誤,因此很容易導致頻繁的崩潰。在跨平臺的編程實例和演示中,aux很大程度上已經被glut庫取代。OpenGL中的輔助庫不能在所有的OpenGL平臺上運行。
輔助庫函數主要包括以下幾類。
窗口初始化和退出函數,auxInitDisplayMode()和auxInitPosition()。
窗口處理和時間輸入函數,auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。
顏色索引裝入函數,auxSetOneColor()。
三維物體繪製函數。包括了兩種形式網狀體和實心體,如繪製立方體auxWireCube()和 auxSolidCube()。這裏以網狀體爲例,長方體auxWireBox()、環形圓紋面auxWireTorus()、圓柱auxWireCylinder()、二十面體auxWireIcosahedron()、八面體auxWireOctahedron()、四面體auxWireTetrahedron()、十二面體auxWireDodecahedron()、圓錐體auxWireCone()和茶壺auxWireTeapot()。
背景過程管理函數auxIdleFunc()。
程序運行函數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圖形代碼,然後再集成爲完整的應用程序。
這部分函數主要包括
窗口操作函數,窗口初始化、窗口大小、窗口位置等函數glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等。
回調函數。響應刷新消息、鍵盤消息、鼠標消息、定時器函數等,GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()。
創建複雜的三維物體。這些和aux庫的函數功能相同。創建網狀體和實心體。如glutSolidSphere()、glutWireSphere()等。在此不再敘述。
菜單函數。創建添加菜單的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
程序運行函數,glutMainLoop()。

5. Windows專用庫

針對windows平臺的擴展。包含有16個函數,函數名前綴爲wgl。
這部分函數主要用於連接OpenGL和Windows ,以彌補OpenGL在文本方面的不足。 Windows專用庫只能用於Windows環境中。
這類函數主要包括以下幾類
繪圖上下文相關函數wglCreateContext(), wglDeleteContext()wglGetCurrentContent() wglGetCurrentDC() wglDeleteContent()等
文字和文本處理函數 wglUseFontBitmaps()、wglUseFontOutlines()。
覆蓋層、地層和主平面層處理函數 wglCopyContext()、wglCreateLayerPlane()、 wglDescribeLayerPlane()、wglReakizeLayerPlatte()等
其他函數,wglShareLists()、wglGetProcAddress()等。

6. Win32 API函數庫

包含有6個函數,函數名無專用前綴。
是win32擴展函數。這部分函數主要用於處理像素存儲格式和雙幀緩存。這6個函數將替換Windows GDI中原有的同樣的函數。Win32API函數庫只能用於Windows 95/98/NT環境中。

7 X窗口專用庫

是針對Unix和Linux的擴展函數。
包括渲染上下文、繪製圖元、顯示列表、紋理貼圖、等等
初始化 glXQueryExtension()
渲染上下文函數, glXCreateContext() glXDestroyContext() glXCopyContext() glXMakeCurrent() glXCreateGLXPixmap()
執行 glXWaitGL()、glXWaitX()
緩衝區和字體 glXSwapBuffers()、glXUseXFont()

8 其他擴展庫

這些函數可能是新的OpenGL函數,並沒有在標準OpenGL庫中實現,或者它們是用來擴展已存在的OpenGL函數的功能。和glu、glx和wgl一樣,這些OpenGL擴展是由硬件廠商和廠商組織開發的。OpenGL擴展(OpenGL Extention)包含了大量的擴展API函數。
隨着硬件的更新,硬件廠商首先向SGI申請登記新的擴展,編寫規格說明書(specification)。然後按照說明書進行開發擴展程序。不同的OpenGL實現(OpenGL Implementation)支持的擴展可能不一樣,只有隨着某一擴展的推廣與應用以及硬件技術的提高該擴展纔會在所有的OpenGL實現中被給予支持,從而最終成爲OpenGL標準庫的一部分。擴展由SGI維護,在SGI網站上列出了目前公開的已註冊的擴展及其官方說明書。
擴展源由擴展函數的後綴來指明(或使用擴展常量後綴)。例如,後綴WIN表明一個符合Windows規範的擴展,EXT或ARB後綴表明該擴展由多個賣主定義。
下面給出OpenGL官方規定的命名規則:
ARB – OpenGL Architecture Review Board 正式覈準的擴展,往往由廠商開發的擴展發展而來,如果同時存在廠商開發的擴展和ARB擴展,應該優先使用ARB擴展
EXT – 多家OpenGL廠商同意支持的擴展
HP – Hewlett-Packard 惠普
IBM – International Business Machines
KTX – Kinetix, maker of 3D Studio Max
INTEL – Intel 公司
NV – NVIDIA 公司
MESA – Brian Paul’s freeware portable OpenGL implementation
SGI – Silicon Graphics公司開發的擴展
SGIX – Silicon Graphics (experimental) 公司開發的實驗性擴展
SUN – Sun Microsystems
WIN – Microsoft
由於OpenGL擴展在針對不同平臺和不同驅動,OpenGL不可能把所有的接口程序全部放到gl.h、glx.h、wgl.h中,而是將這些函數頭放在了glext.h、glxext.h和wglext.h中。這些擴展被看作時OpenGL核心庫規範的增加和修改。
OpenGL擴展也不是沒有缺點,正因爲各個硬件廠商都可以開發自己的擴展,所以擴展的數目比較大,而且有點混亂,有些擴展實現的相同的功能,可因爲是不同廠商開發的,接口卻不一樣,所以程序中爲了實現這個功能,往往要爲不同的顯卡寫不同的程序。這個問題在OpenGL 2.0出來後可能會得到解決,OpenGL 2.0的一個目標就是統一擴展,減少擴展數目。

OpenGL開發庫遠不止以上提到這些庫,還有GLFW
GLFW入門學習
GLFW初體驗

遇到的問題

glut出現 _glutInit_ATEXIT_HACK連接錯誤

來源:http://www.cppblog.com/wc250en007/archive/2010/06/19/glutFrame.html

出現無法解析符號:

1.1>GEARS.obj : error LNK2019: 無法解析的外部符號 ___glutInitWithExit@12,該符號在函數 _glutInit_ATEXIT_HACK@8 中被引用
2.1>GEARS.obj : error LNK2019: 無法解析的外部符號 ___glutCreateWindowWithExit@8,該符號在函數 _glutCreateWindow_ATEXIT_HACK@4 中被引

  glut.h的文件內容於是,
  Note that the __glut*WithExit routines should NEVER be called directly. 
  To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. 
  在#include <GL/glut.h>前面加上了一句:  
  #define GLUT_DISABLE_ATEXIT_HACK   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章