2017-08-10 61 views
1

我已經使用Qt3D設置了延遲渲染管線。到目前爲止這麼好,但現在我想在場景中渲染的網格周圍添加選擇框。推遲渲染如何從燈光貢獻中排除網格

不幸的是,選擇框網格是受燈光影響,我不希望(請參閱「陰影」圖片下面)。例如,我可能想要將環境光強度設置爲0,並且選擇框仍應可見。另一個例子是,如果我想在一個視口角中顯示典型的X/Y/Z指示器。

我已經得到了光的貢獻計算,這是典型的通光着色器(簡稱)這樣的:

void main() 
{ 
    vec2 texCoord = gl_FragCoord.xy/winSize; 
    vec4 col = texture(color, texCoord); 
    vec3 pos = texture(position, texCoord).xyz; 
    vec3 norm = texture(normal, texCoord).xyz; 
    ... calculate lights contribution... 
    fragColor = vec4(col.rgb * lightColor, col.a); 
} 

如果我更換fragColor行:

fragColor = vec4(col.rgb, col.a); 

我得到非陰影下面的圖片,它顯示了我想要的選擇框的顏色。

從光通中排除特定網格是否有任何技巧或常見做法?

我已經試着用特殊的數值「欺騙」着色器,比如顏色alpha = 0.123,但它根本沒有任何幫助。

enter image description here

非陰影

enter image description here

回答

2

你基本上有兩種選擇:

  1. 當像素不亮時,將其存儲在gbuffer中的某處。這可以通過其中一個顏色附件中的標誌或通過在深度或模板緩衝區中存儲特殊值來完成。

  2. 在照明場景渲染之後渲染所有不需要照明的基元。

這兩個選項都有其優點/缺點。如果你有一個不需要光照的大區域,因爲你可以在着色器中跳過這些計算,所以有了一個標誌,它有時可以更高效。另一方面,這個解決方案可能需要更多的內存,因爲你必須將這些信息存儲在某個地方。在第二個版本中,您必須確保您仍然尊重在生成gbuffer時創建的深度緩衝區(否則它們不會隱藏在照明對象後面),這可能與附加相同深度附件或非常複雜(如果照明數據直接呈現給後緩衝器)。

+0

BDL,謝謝,我想我會選擇第二個。我發佈這個10分鐘後,我意識到我可以用一個單獨的着色器來渲染這些網格物體。我唯一擔心的是他們如何與gbuffer碎片混合時看起來如何。如果我取得了一些好成績,我會發布更新。 –