2016-07-28 247 views
0

我在GeForce GTX 750下使用OpenGL 4.3創建Shadow Map。現在基本效果如下圖所示,似乎是正確的: enter image description here 要擦除塊效應,我試着在着色器中手動執行2×2 PCF。它導致以下結果,這似乎也是正確的: enter image description here 對於加速,我想使用圖形卡提供的好處,它提供了一次獲取比較結果的線性過濾器。但效果與上述不同。 它更像是OpenGL的過濾陰影的渲染線,但在陰影貼圖沒有過濾器: enter image description here 下面是我如何做硬件PCF: 我注意到兩個基本的東西,在做爲了使用硬件PCF,它們是:使用OpenGL實現Shadow Map硬件PCF

  1. 使用shadow式採樣器,這在我的情況下,是samplerCubeShadow(我使用一個立方體貼圖類型,因爲我試圖創建一個點光源場景) 。
  2. 設置的比較模式和過濾型,這在我的情況下,通過下面的代碼完成:

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); 
    

在那之後,我用的是texture功能在這樣的着色器(的原因我使用texture但不textureProj是因爲後者似乎並不支持立方體貼圖陰影紋理,因爲它需要這顯然是尚不支持vec5型):

vec4 posInLight4D = positionsInLight/positionsInLight.w; // divided by the 4-th component) 
vec3 texCoord = GetCubeMapTexCoord(posInLight4D.xy); // get the texture coordinate in cube map texture. This can be assumed correct 
float lightness = texture(shadowMapHardware, vec4(texCoord, posInLight4D.z)); 

但不幸的是,這給出了第三張照片中顯示的結果。

據我瞭解,與比較模式線性濾波器的設置,顯卡將做一個附近的2x2區域內的比較線性插值結果,並賦予它通過texture函數返回。我想我已經完成了所有必要的部分,但仍然無法獲得第二張照片中顯示的確切結果。

任何人都可以給我任何關於我可能出錯的建議嗎?非常感謝。

PS:有趣的是:我試過textureGather功能,只返回比較結果而不是做過濾,並給出了確切的結果如圖2號圖片。但是這沒有自動過濾程序,顯然它不是硬件PCF的完整版本。

回答

2

爲了消除塊效應,我試着在着色器中手動執行2×2的PCF。它導致以下結果,這似乎也是正確的:

OpenGL規範並未規定在線性內插深度比較時要使用的特定算法。然而,它通常描述爲:

這樣做的細節是依賴於實現的,但應r 在範圍內的值[0,1]成比例的比較 通過或失敗的次數。

這不是非常受限制,它肯定不需要輸出,你看到「正確」。

事實上,actual PCF與您建議的要求有很大不同。你似乎想要的東西仍然非常麻煩。它只是不是二進制塊。您的算法沒有在比較結果之間進行線性插值;你只是做了4次最近的比較,並將它們平均在一起。

NVIDIA正在給你的是什麼PCD實際上是假設看起來像這樣:在比較結果之間的線性插值,基於你要採樣的點。

因此,您的期望是錯誤的,而不是NVIDIA。

+0

所以,您的意思是,通過對比較結果進行平均,我不會執行NVIDIA執行的「線性插值」 , 對?我檢查了之前提供的材料,但沒有說明如何完成這種插值。你能告訴我更多關於這方面的細節嗎?謝謝。 – Narusaki

+1

@Narusaki:它是線性插值。它的工作原理與非比較情況相同,只是它對後比較值進行插值。 –

+1

哦,我想我明白了你的意思:線性插值應該使用從「中心座標」到四個「角座標」的距離作爲「權重」,而不僅僅是對「角座標」上的四個值進行平均,這種情況下的重量是0.25。那是對的嗎? – Narusaki

0

通過@Nicol的回答,我想我誤解了插值的含義。以下是我實現的着色器級插值,它看起來與問題中的第二張圖片完全相同: enter image description here