我在GeForce GTX 750下使用OpenGL 4.3創建Shadow Map。現在基本效果如下圖所示,似乎是正確的: 要擦除塊效應,我試着在着色器中手動執行2×2 PCF。它導致以下結果,這似乎也是正確的: 對於加速,我想使用圖形卡提供的好處,它提供了一次獲取比較結果的線性過濾器。但效果與上述不同。 它更像是OpenGL的過濾陰影的渲染線,但在陰影貼圖沒有過濾器: 下面是我如何做硬件PCF: 我注意到兩個基本的東西,在做爲了使用硬件PCF,它們是:使用OpenGL實現Shadow Map硬件PCF
- 使用
shadow
式採樣器,這在我的情況下,是samplerCubeShadow
(我使用一個立方體貼圖類型,因爲我試圖創建一個點光源場景) 。 設置的比較模式和過濾型,這在我的情況下,通過下面的代碼完成:
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的完整版本。
所以,您的意思是,通過對比較結果進行平均,我不會執行NVIDIA執行的「線性插值」 , 對?我檢查了之前提供的材料,但沒有說明如何完成這種插值。你能告訴我更多關於這方面的細節嗎?謝謝。 – Narusaki
@Narusaki:它是線性插值。它的工作原理與非比較情況相同,只是它對後比較值進行插值。 –
哦,我想我明白了你的意思:線性插值應該使用從「中心座標」到四個「角座標」的距離作爲「權重」,而不僅僅是對「角座標」上的四個值進行平均,這種情況下的重量是0.25。那是對的嗎? – Narusaki