❶ 請問什麼是「光柵化渲染」而什麼是「光線追蹤渲染」
光柵化渲染就是先計算多邊形或三角形頂點的坐標變換,然後在多邊形或三角形內填充紋理(同樣是經過坐標變換),同時每個填充點也可以經過fragment shader計算來實現各種效果。光線追蹤渲染就是假設屏幕上每一個點是一根一根向前的射線,計算這個射線打到了哪個多邊形、平面或曲面上哪個位置,然後取出該點的紋理像素顏色。如果被打到的面帶有反射或折射屬性,那麼還需要產生多根射線往下遞歸,最終經過blending算得最終像素顏色。如果遇到漫反射面的話一般是需要產生非常多的次級射線往下遞歸才能達到比較好的效果(否則噪點比較明顯),如果需要模擬出光線打到玻璃或鏡面上的效果,還需要計算photon map。而且搜尋一根射線跟一大堆多邊形中哪一個相交也是非常耗時間的計算。所以光線追蹤渲染的計算量非常大。
記得採納啊
❷ 如何理解OpenGL中著色器,渲染管線,光柵化等概念
買一本opengl的理論書籍即可.我這里簡單說下. 著色器(shader)本質上是一堆代碼,用來把資源圖片渲染到畫布上.
渲染管線則比較復雜.從三角形數據流傳入顯卡,到把頂點數據乘以矩陣.然後換算到畫布坐標.最後渲染顏色,一整套操作 非常復雜.
光柵化一般是指填充三角形內容,也就是當你算出三角形的位置後.要用一段程序來吧畫布一行行地描繪出來.這個過程是光柵化
❸ 怎麼用opengl掃描線演算法填充多邊形
掃描線演算法是光柵圖形學的內容,底層硬體實現。opengl是不會關注這種細節的。你寫這樣的代碼
glBegin(GL_POLYGON);
glVertex3f(...);
...
glVertex3f(...);
glEnd();
畫一個多邊形,但底層的光柵化到底是怎麼實現的,是否使用掃描線演算法,你是不可以控制的。
❹ 介紹常用的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中,為什麼一定要在顯示回調函數中修改投影矩陣,在其他函數中修改就不能顯示
dlePoint
本演算法絕對原創,本人發現網上的演算法,一般用了OpenGL幾何域的函數,例如glBegin(xxx), 這種方法本質上都是調用了庫函數完成直線的光柵化的。因此不能最大限度的滿足你老師的要求。本演算法直接在後背像素緩沖區使用光柵演算法,和當年極限使用DirectDraw很相識。本程序用QT + OpenGL設計,可以在windows xp, vista, 7, linux, mac上運行,絕對安全跨平台。
最後哥哥再批判一下你的老師,你調用GLU的庫函數,無非就是把圓分解成為一系列的三角形,然後用直線的光柵化演算法和填充演算法渲染,和整數中點法沒有仍和關系,是一種幾何域的畫法。不信你可以用選擇函數去選擇一下,只有封閉的圖元才能被選擇的,其次,修改二次曲線風格,你也能看見內部的接零線條。用庫函數繪制,本身就不能實現中電演算法的。即使你用樣條曲線函數模擬圓,也是一樣的。
哥哥不求積分,只是最近在聯系導師,積累rp,這個程序就送給你啦,,哈哈。
注意,如果你沒有安QT是無法編譯的。好在哥哥直接給你一個exe文件。
願春哥保佑我們用不掛科!
另外,團IDC網上有許多產品團購,便宜有口碑
❻ 學習OpenGL 用哪個版本好
什麼版本都不用管 先實現一遍底層的光柵化的3D渲染演算法,只用一個畫像素的功能,把插值,zbuffer,alpha,陰影,三角形的光柵化,全自己底層實現一遍,之後進階挑nvidia 的sdk里的例子逐句看,siggraph早期的gpgpu的論文挑自己覺得有趣的去實現,shaderX,gpu gems里頭拿感興趣的實現,我就是這么過來的,後來去了皮克斯做R&D,現在在Weta Digital做R&D
❼ opengl如何限定視點在一個矩形區域的視場
方案1:使用OpenGL3.3,3.3在渲染之前,能反饋幾何體是否被光柵化,如果沒有,證明幾何體全部位於視景體之外全部不可見,你直接取消本次漫遊即可將觀察限制在一定能看到矩形的區域。OpenGL2.1貌似也有類似功能,不過俺記得不太清楚,但3.3一定有。
(P.S 這蛋疼的版本也是OpenGL垃圾的一大原因,難怪被D3D搞得體無完膚)
方案2:如果你的OpenGL只有1.4(P.S這年頭要是你OpenGL版本沒1.4隻有三種情況。1 你忘記安顯卡驅動了,2 你在遠程登錄 3 你在玩虛擬機)。你可以利用OpenGL的選取機制。在繪制場景之前,將渲染模式切換到選擇,在最新的觀察位置繪制你的矩形,然後構造一個和屏幕大小一樣的選擇框傳給OpenGL,然後看選取結果,如果沒有命中任何幾何體,說明本次漫遊飛出去了,需要取消。
方案3:參考工具書,計算機圖形學幾何工具詳解,好像叫這名字俺也記不清了,一個叫周長發的哥們翻譯的,裡面的演算法能解決「四稜台與部分平面判交」的問題(該問題的實質與終極的解決方案,推薦使用),俺就不在這里寫了,因為網頁上不好寫公式畫草圖。
方案4:是俺剛學OpenGL的時候想的「土方法」,其核心思想是「山寨」OpenGL的幾何流水線。以三角形為例來說明。在渲染新的一幀之前,利用相關矩陣將三個頂點變換到觀察坐標系下。首先檢測深度,如過三點都在最遠距離外,馬上知道觀測點非法,然後用投影矩陣將空間3點投影到前平面上,這樣就把問題轉換為三角形與矩形判交的問題。這種方案與圖形流水線的方式是一樣的,只不過OpenGL對你透明了。
❽ OpenGL怎樣近似進行同時到FBO和屏幕的渲染
OpenGL中,GPU屏幕渲染有以下兩種方式:
On-Screen Rendering
意為當前屏幕渲染,指的是GPU的渲染操作是在當前用於顯示的屏幕緩沖區中進行。
Off-Screen Rendering
意為離屏渲染,指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作。
二、離屏渲染的是是非非
相比於當前屏幕渲染,離屏渲染的代價是很高的,主要體現在兩個方面:
創建新緩沖區
要想進行離屏渲染,首先要創建一個新的緩沖區。
上下文切換
離屏渲染的整個過程,需要多次切換上下文環境:先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束以後,將離屏緩沖區的渲染結果顯示到屏幕上有需要將上下文環境從離屏切換到當前屏幕。而上下文環境的切換是要付出很大代價的。
三、離屏渲染觸發方式
設置了以下屬性時,都會觸發離屏繪制:
shouldRasterize(光柵化)
masks(遮罩)
shadows(陰影)
edge antialiasing(抗鋸齒)
group opacity(不透明)
需要注意的是,如果shouldRasterize被設置成YES,在觸發離屏繪制的同時,會將光柵化後的內容緩存起來,如果對應的layer及其sublayers沒有發生改變,在下一幀的時候可以直接復用。這將在很大程度上提升渲染性能。
而其它屬性如果是開啟的,就不會有緩存,離屏繪制會在每一幀都發生。
四、另一種特殊的逗離屏渲染地
按照之前的說法,如果將不在GPU的當前屏幕緩沖區中進行的渲染都稱為離屏渲染,那麼就還有另一種特殊的逗離屏渲染地方式: CPU渲染 。
如果我們重寫了drawRect方法,並且使用任何Core Graphics的技術進行了繪制操作,就涉及到了CPU渲染。整個渲染過程由CPU在App內 同步地 完成,渲染得到的bitmap最後再交由GPU用於顯示。
五、Instruments
Instruments的Core Animation工具中有幾個和離屏渲染相關的檢查選項:
Color Offscreen-Rendered Yellow
開啟後會把那些需要離屏渲染的圖層高亮成黃色,這就意味著黃色圖層可能存在性能問題。
Color Hits Green and Misses Red
如果shouldRasterize被設置成YES,對應的渲染結果會被緩存,如果圖層是綠色,就表示這些緩存被復用;如果是紅色就表示緩存會被重復創建,這就表示該處存在性能問題了。
六、如何抉擇
現在擺在我們面前得有三個選擇:當前屏幕渲染、離屏渲染、CPU渲染,該用哪個呢看這需要根據具體的使用場景來決定。
盡量使用當前屏幕渲染
鑒於離屏渲染、CPU渲染可能帶來的性能問題,一般情況下,我們要盡量使用當前屏幕渲染。
離屏渲染 VS CPU渲染
由於GPU的浮點運算能力比CPU強,CPU渲染的效率可能不如離屏渲染;但如果僅僅是實現一個簡單的效果,直接使用CPU渲染的效率又可能比離屏渲染好,畢竟離屏渲染要涉及到緩沖區創建和上下文切換等耗時操作。
總之,具體的選擇應該由性能測試結果來決定。