2013-11-28 19 views
0

我想在我的圖形(遊戲)引擎基於gpu寶石文章實現大氣散射:link。該文章的一個示例實現使用了skydome。我的場景是不同的 - 我不會渲染整個地球,其氣氛也可以從空間中看到,但一些有限的平面(矩形)區域上有對象,例如賽道。事實上,這是許多遊戲中最常見的情況。現在 我不知道如何使天空在這種情況下:大氣散射和天空幾何

1.什麼樣的形狀,我應該使用:體育館,天空盒或全屏四 - 那麼我必須 舉動幾乎所有的計算,片段着色器,但我不知道它在質量/性能方面是否有意義 ?

2.如何在場景上放置天空幾何? 我的想法: 我有一個半球(skydome)幾何,半徑= 1,中心在vec3(0,0,0) - 物體空間。 這些頂點被髮送到大氣散射頂點着色器:

layout(location=0) in vec3 inPosition; 

接着,在頂點着色器我變換頂點這樣:

v3Pos = inPosition * 0.25f + 10.0f; 

統一v3CameraPos = VEC3(0.0F,10.0f ,0.0F),均勻fInnerRadius = 10.0f,均勻fCameraHeight = 10.0f

然後我有正確的內/外半徑比例(10/10.25),對嗎?我還發送到頂點着色器一個模型矩陣其設定半球的位置 向移動照相機VEC3的現在的位置(myCamera.x,myCamera.y,myCamera.z):

vec4 position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(inPosition, 1.0); 
gl_Position = position.xyww; // always fails depth test. 

的半球攝像機一起移動(全景攝像機半徑= 1包圍只有一些空間,但 也總是失敗的深度測試。)

不幸的是天空的顏色,我得到的是不正確的:screen1

3 。關於「天空曲線「?下面是一張照片,演示了我的意思:image1 我應該如何設置天空曲線?

EDIT1 - 調試:在我分配到「最高」頂點v3Pos位置在半球頂點着色器:

vec3 v3Pos = vec3(0.0f, 10.25f, 0.0f); 

現在整個天空包含了頂點的顏色: screen2

+0

這與您的實際問題無關,但它確實會立即向我顯示。你應該考慮將'inPosition'聲明爲'vec4'。 GLSL將使用(0.0,0.0,0.0,1.0)爲缺失的組件自動擴展***頂點屬性***。所以,如果你聲明它爲'vec4',並且只有在你使用'glVertexAttribPointer(...)'的時候給它足夠的數據來填充'vec3',GLSL會自動給'inPosition.w'賦值** 1.0 **和那麼你不必在頂點着色器中混淆像'vec4(inPosition,1.0)'這樣的東西。 *這隻適用於頂點屬性,順便說一句。* –

+0

@Irbis它是如何與你的問題?你以什麼方式去結果? – Spektre

回答

0

只要(a)它覆蓋了scren和(b)您爲片段着色器提供了v3Direction的合理值,那麼使用什麼幾何就可以了。對於所有的情況都是典型的地面遊戲,就像賽道上的天空一樣,天空將落後於所有其他物體,因此精確的Z並不是什麼大不了的事情。

+0

這個一般規則很明顯,但你必須以某種方式計算適當的採樣點。你甚至可以把幾乎所有的計算都推到片段上,但在質量/性能方面它可能太昂貴了。下面是答案,爲什麼我的實現不起作用:http://www.gamedev.net/topic/650636-大氣散射和天體幾何/大氣散射算法和天空幾何之間有一些關係。 – Irbis

1

這裏我簡單大氣散射

工作無論是在外部和內部的氣氛

  1. 對於現實的散射您需要計算曲線通過積分大氣深度

    所以你需要知道在哪個方向氣氛有多厚。你的地形是「平坦的QUAD +/-一些顛簸」,但你必須知道它在地球上的位置是(x,y,z)和正常的(nx,ny,nz)。對於大氣,你可以使用球體或像我橢球體,除非你想實現整個散射(通過面積而不是曲線積分)過程,那麼你真正需要的僅僅是從相機到大氣末的射線長度。

    所以你也可以做一個cube-map紋理與預計算的大氣邊緣距離,因爲平坦的區域內的運動並不重要。

  2. 您還需要太陽的位置

    可以簡化爲只繞着地軸正常每天1輪,或者您也可以只渲染填補之前實現本賽季的軌跡轉變

  3. 現在與天空屏幕

    你可以在內部着色器中做到這一切。一個Quad就足夠了。

    片段:從大氣球體/橢球體得到大氣厚度形式立方體圖或像素方向相交,然後進行積分(完整或簡化)。將顏色輸出到屏幕像素