計算機圖形學,GPU,OpenGL,Unity3D什麼關係?

最近在學計算機圖形學,主要主要是參考Scratchapixel和《Fundamentals of Computer Graphics》這本書。當然,也沒學幾天。知道圖形學大概就是一門研究怎麼樣把自然場景逼真(符合自然規律)地呈現出來。

1.

以ray-tracing來說,圖形學演算法的輸入就是一個數學形式的自然場景,這個自然場景基於某個坐標系統,而自然場景中主要包括光源,一些物體(比如球,正方體等),當然還有觀察角度。自然場景中包含的這些東西主要是基於前面提到的坐標系統以坐標的形式(頂點,圓心,半徑)提供給演算法,然後演算法就把這個自然場景呈現到圖片上(渲染)。所以演算法的輸出就是一張圖片。

2.

GPU應該就是用圖形學的演算法把畫面繪製到電腦屏幕上的。感覺GPU應該是根據一些頂點之類的信息,渲染出圖片,然後把這些像素信息放在某個位置,然後顯示器再根據這些像素信息顯示圖片。但是我不太懂圖形學演算法的輸入,也就是各種頂點,距離之類的GPU是怎麼得到的?GPU應該只負責圖形學演算法的執行(渲染)吧?總還得有個東西把需要畫出來的場景用數學形式給GPU。到底是什麼玩意把這些場景給GPU的,以及這些頂點信息是存在顯存中的?然後渲染好的像素信息是放到哪裡的?按照百度百科:

顯存的作用是用來存儲顯卡晶元處理過或者即將提取的渲染數據。

是不是渲染前後的數據都是放在顯存中的?如果是這樣的話,顯存中的數據存儲布局是什麼樣的?

3.

OpenGL是一個API介面的標準。按我的理解,應該是操作系統上的應用程序員可以通過OpenGL標準的庫函數來寫顯存,也就是改變圖形學演算法的輸入,這樣就可以控制屏幕繪製不同的圖像。但是OpenGL標準的庫基本都是用C/C++寫的,也就是說他們是運行在CPU上的。CPU和GPU之間是怎麼交互的啊?傳說中的顯卡驅動,是操作系統和GPU連接的橋樑嗎?

4.

Unity3D這個是在OpenGL標準的庫上的一個封裝?使他更適合遊戲圖形繪製?

初涉圖形學領域,覺得這個領域太有意思了。但是很多問題沒搞懂,上網好像也找不到比較清楚的回答。還請大佬們多多指教,或者推薦一些書什麼的。謝謝各位~


分別是中國傳媒大學、電視機、攝像機和攝製組的關係。


計算機圖形學:學科。

gpu:硬體,一個工具,根據輸入給你輸出。

OpenGL:API。應用程序介面算是一種比較抽象的東西,然而它也是在軟體層面上的。

所以你關心的怎麼操作gpu,那是驅動的事情,驅動負責軟硬體銜接。

Unity3D:一個軟體(可以理解為開發平台,但終究是軟體)。使用了OpenGL的介面(不一定)。

從頂層到底層可以理解為:

「Unity」通過「OpenGL」告知「驅動」要做什麼操作,「驅動」指揮「gpu」做計算並輸出內容。

至於你的問題中零散的問題:

操作系統也是「軟體」,也得靠驅動去和硬體溝通。

顯存里放的東西的內存布局由驅動、硬體決定,可以理解為黑盒不用關心。

gpu只負責計算,但不一定只是「渲染」。你所說的距離什麼的,可以在gpu里算也可以在cpu里算。

C/C++不意味著只能跑在cpu上,他們只是語言。不用Java之類高層語言的原因很多。

Unity不是對介面的封裝,它有一系列完備的工具/部件,使得你只需要寫少量的代碼,方便而已。


以打架為例。

圖形學是各種搏擊理論,團戰意識。

Gpu是啤酒瓶,鋼管,辣椒水。。。

Opengl可以看成具體某一招一式,直刺格擋翻滾之類的。

最後unity3d可以看成請來的打手,你要告訴他打誰,什麼時候打,甚至怎麼打


計算機圖形學的領域比較廣,比如怎麼將二維圖像,三維圖形表示出來,怎麼識別圖像,怎麼渲染之類的。

GPU是為了解放CPU一部分功能而設計的處理器,注重處理圖像圖形,注重優化圖像演算法性能,存儲相應圖像信息(加入了很多支持專攻圖像運算的微硬體),是基於圖形學一部分研究設計和製作出來的,最近還有些企業有將GPU取代CPU的想法。

- 至於你說的怎麼將坐標什麼的具體信息傳給GPU的過程...除了需要了解渲染管線,你還需要一位硬體工程師來回答...

- CPU和GPU如何通信又是另外一個領域了:

CPU與GPU之間是如何通信的?http://www.zhihu.com/question/22233341(分享自知乎網)

OpenGL是圖形學的研究人員和程序員以圖形學的一些理論為基礎實現了相應的演算法封裝的底層圖形庫。

- 你在這一部分的提問前提有點問題,並非是編寫OpenGL的程序決定自己運行在CPU上,而是程序內部某些底層代碼申請相應資源,然後操作系統和相關硬體驅動決定這些程序是否被分配CPU或者GPU資源(操作系統做了資源調配工作)。

Unity3D是在OpenGL等相關和類似的演算法庫的基礎上繼續封裝更多演算法和操作,為簡化開發成本而設計的庫,偏重遊戲開發。


GPU-胳膊

OpenGL-驅動胳膊的神經

Unity3D-控制神經的大腦


計算機圖形學: 演算法 - 如何把物品繪製在屏幕上。

GPU: 硬體 - 圖形處理器

OpenGL: API - 用來渲染2d或3d圖形。

Unity3D: 工具 - 跨平台的遊戲開發引擎,也可以用來開發一般的手機應用或桌面應用。


基本概念

GPU 圖形硬體,圖形處理器。和CPU差別在於計算單元是CPU的上百倍,不過計算功能更為有限,可以想像成適合對大量浮點數非同步運算的晶元。

顯存,GPU可以快速讀取的一種內存。

OpenGL,圖形編程的介面,也就是圖形API。DX同理。

Unity3D,遊戲引擎,內部包含渲染模塊可以讓用戶能夠更簡單的與Opengl交互。

1,不管是ray-tracing還是光柵化渲染,場景內容是一樣的,無非就是一堆位置坐標,字元串信息,以及貼圖信息。

2,這些信息需要先用CPU講硬碟里的內容轉移到內存,然後經過CPU的一定處理後(比如角色移動)用Opengl介面轉交給顯存。然後通過GPU來處理顯存內容。

這部分深入理解的話可以參考一下計算機圖形學的歷史。

20-30年以前,顯卡是不具備3D處理功能的。當時的開發者需要完全自己從頭寫彙編來實現3D。當時的顯卡只是將顯存中的內容轉交給顯示器。

後來,出現了Voodoo卡,也就是專門用來計算3D數據的卡,當時需要既有一塊Voodoo也要有一塊顯卡,也就是需要先把數據交給Voodoo卡運算出結果,然後結果再輸給顯卡。

再後來,顯卡廠商開始在顯卡中加入3D運算晶元,也就是GPU了,後來就越來越強大。然而當時的運算方式比現在更有限,都是固定好的計算方式。並且沒家廠商的SDK也都不一樣。

再後來,opengl/DX成為了行業標準,出現了可編程的介面,也就是shader。逐步從Vertex shader進化出pixel shader,geometry shader,也就成了今天這個樣子。

歷史進程證明了把3D運算放到顯卡里是合理的選擇。

說了這些,答案也就顯而易見了。

比方說遊戲程序用C寫,那麼C用到的內存都只是內存,通過opengl分配的才是緩存。shader中用的都是顯存。具體布局查看相關文檔就好了。

3,OpenGL/DX是行業標準,也就是說顯卡廠商倒也可以自己做SDK,但做了又怎樣,也沒人買賬啊。Opengl/DX已經很完善了,顯卡廠商做個驅動,對接上Opengl/DX就好了。自己做定製化其實也不少見,比如Nvidia的CUDA這種。這種呢,就是把個別的技術介面對應轉交給app程序員了。

4,渲染只是遊戲引擎的一部分,不是全部,所以Unity3D是對OpenGL的封裝這點來說,對Opengl封裝只是Unity3D的一小部分。

遊戲圖形繪製主要差別在於實時渲染。實時渲染需要以降低精確度為代價來加速運算。

拿Blender來說比較合適,Blender既有raytracing,也有實時渲染(eevee),如果題主對這方面感興趣的話,個人覺得倒是可以從blender下手試試。畢竟blender功能特別全,還開源。

如果只是想專註看遊戲渲染的部分,可以先參考下開源的ogre。


第一個問題,你可以去看一下渲染流水線大概就知道計算機怎麼把數學形式的頂點轉化為圖片輸出了。第二個問題,你大概需要自己寫一個opengl的實例你就能看到CPU到GPU的數據傳輸過程。unity3D是一個遊戲引擎以及相關製作工具,具體了解你只要打開unity3D的編輯界面大概就懂了。


opengl是規範,是契約,而gpu是opengl這個規範的具體物理實現。它們都可以看成是硬體域的東西。

Unity那是另外一回事了。


推薦閱讀:

為什麼歐美日遊戲公司死心塌地的做 3A 大作?
為什麼射擊遊戲的 Hitbox 多為長方體而不是其他多面體或球體?
開放世界遊戲中的大地圖背後有哪些實現技術?
一個完整的遊戲副本包括哪些要素?
用國外的3d遊戲開源引擎製作遊戲,是否可以說這款遊戲是自己寫的?

TAG:遊戲開發 | 計算機科學 | 計算機圖形學 | 計算機圖形學和可視化 |