2012-12-29 77 views
0

在計算機圖形學中,將抖動應用於採樣位置以避免可見的採樣模式是一種常見技術。着色器 - CG/GLSL/HLSL如何實現抖動

將抖動應用到片段着色器中的採樣位置的正確方法是什麼?我能想到的一種方法是將噪聲紋理輸入到着色器中,然後根據此噪聲紋理的texl值更改任何想要採樣的採樣位置。

有更好的實現抖動的方法嗎?

+0

http://gamedev.stackexchange.com/ – user1849534

回答

1

各種硬件驅動程序AA方案通常都是基於抖動的 - 每個供應商都有自己喜歡的模式。不幸的是,用戶/玩家通常可能會弄亂設置並打開和關閉。

這可能會讓你覺得沒有「正確」的方式 - 你會是對的!有一些方法,其中一些對於某些任務是正確的。學習和使用你喜歡的東西。

對於表面紋理抖動,你可以嘗試像這樣:

  1. 在Photoshop中,製作一個256×512個RGB圖像(或256x511,對於NVIDIA DDS出口的一些版本),所有的填充隨機噪聲,另存爲DDS,並使用「使用現有的mip貼圖」。無論紋理縮放多少(至少通過許多有用的大小範圍),這將使您獲得大致均勻的噪聲。

  2. 在您的着色器中,讀取噪聲紋理,然後將其應用於UV,然後讀取其他紋理。

    float4 noise = tex2D(noiseSampler,OriginalUV);

    float2 newUV = OriginalUV + someSmallScale *(noise.xy-0.5);

    float4 jitteredColor = tex2D(colorSampler,newUV);

嘗試其他變化,只要你喜歡。請注意,強烈的紋理抖動會導致很多紋理緩存未命中,這可能會降低性能,並且在正常貼圖周圍時要小心,因爲您正在將高頻分量引入已經過濾的信號中。