2014-11-22 60 views
0

我是OpenGL ES世界的新手,並在Android OpenGL ES上學習一些關於3D圖形的基礎知識。我想知道如何創建一個發光的圖像平面?這很容易在3D模型軟件(如Blender)中使用(使用Cycles Render),請參閱下面的圖片以瞭解我正在尋找的效果。通過一些研究,我瞭解到它們可能與使用着色器的Blur或Bloom效果有關。但我不太確定,而且我不知道如何實施它們。OpenGL ES - 如何創建飛機發光

enter image description here

+0

您在該圖像中看到的是全局照明,具有紋理矩形光源。 *基本* 3D圖形或多或少的相反,特別是在像Android OpenGL ES這樣有限的環境中。 – 2014-11-23 09:12:27

回答

1

按照保羅 - 揚的評論,你想要的是遠在OpenGL基礎。

OpenGL的默認方法是向前渲染。即每次指定一個幾何圖形時,計算將從三角形向像素前進,應用函數來確定每個像素的顏色,並將它們轉發到幀緩衝區。所以開始的立場是每個像素都沒有周圍世界的概念。每個都是孤立存在的。

在你的場景中,箱子下方的地板不知道它應該是藍色的,因爲它不知道它上面有一個方框。

像Blender這樣的程序使用不同的方法,在這種情況下可以準確地稱爲向後渲染。它從每個像素開始,並詢問它背後的幾何圖形。這樣做明確地瞭解場景中的所有幾何體。所以當它發現地板在某個位置後面時,它可以繼續並詢問「地板看到哪些光源?」建立照明。

對於實時渲染,默認的OpenGL方法已經建立。如果你看看舊的視頻遊戲,你會發現它遍佈整個地方的證據:物體通常不會互相投影(或者這種陰影是非常粗略的近似),只有一個光源是無限遠的(即就幾何而言它處於固定位置;不需要真正瞭解場景)。

因此解決方案是投資幾何知識的整個場景。通常的做法是從光源的角度對場景進行內部渲染。這會生成深度緩衝區。通過將光照位置和深度緩衝區交給場景中的每個幾何圖形,他們可以計算出它們是否對光源可見。如果是這樣,那麼他們就會被照亮。如果不是,那麼他們不是。

另一種選擇是延遲渲染;您可以對場景進行標準傳遞,在每個像素處填充深度,表面顏色和表面法線等。因此,您可以從相機的角度將全部場景信息分解爲逐像素存儲。然後你假裝照相機可以看到的所有東西都是存在的。所以你只需要傳遞像素的緩衝區,大概可以解決哪些光源可以看不到。您也可以讓屏幕的不同部分僅考慮通過廣泛的2d距離檢查足夠接近的燈,這可以節省時間。

在這兩種情況下,我們實際上都在談論相對高級的OpenGL東西。