我想在我的圖形(遊戲)引擎基於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
這與您的實際問題無關,但它確實會立即向我顯示。你應該考慮將'inPosition'聲明爲'vec4'。 GLSL將使用(0.0,0.0,0.0,1.0)爲缺失的組件自動擴展***頂點屬性***。所以,如果你聲明它爲'vec4',並且只有在你使用'glVertexAttribPointer(...)'的時候給它足夠的數據來填充'vec3',GLSL會自動給'inPosition.w'賦值** 1.0 **和那麼你不必在頂點着色器中混淆像'vec4(inPosition,1.0)'這樣的東西。 *這隻適用於頂點屬性,順便說一句。* –
@Irbis它是如何與你的問題?你以什麼方式去結果? – Spektre