在片段着色器中採樣全屏紋理的最佳方式是什麼,例如延遲渲染器中的g緩衝區或後處理着色器中的場景紋理?採樣全屏紋理的最佳方法
在我使用以下兩種方式的時刻:
傳遞屏幕尺寸着色器作爲一個統一的,並從
gl_FragCoord
計算(U,V):vec2 texCoord = gl_FragCoord.xy/vScreenSize; vec3 c = texture(tex, texCoord).rgb;
不由於需要劃分並且爲屏幕尺寸提供着色器是麻煩的,因此似乎是理想的。
gl_FragCoord.xy
轉換成ivec
並使用texelFetch
:vec3 c = texelFetch(tex, ivec2(gl_FragCoord.xy), 0).rgb;
此外,因爲需要從
float
到int
轉換不理想。
那麼,有沒有更好的辦法?我真的只是想在我的像素着色器繪製的確切點上對緩衝區進行採樣。
//編輯:
好,用插值紋理座標是來自頂點着色器,我設法弄清楚下面的代碼的建議:
頂點着色器:
#version 150
uniform mat4 im_ModelViewProjectionMatrix;
in vec3 iv_Vertex;
noperspective out vec2 vVertCoord;
void main(void)
{
gl_Position = im_ModelViewProjectionMatrix * vec4(iv_Vertex, 1.0);
vVertCoord = (gl_Position.xy/gl_Position.w) * (0.5) + vec2(0.5);
}
我基本上是從剪輯空間計算標準化設備座標(NDC)然後將NDC(範圍從[-1,1])映射到區間[0,1]。這適用於全屏四邊形(即使沒有透視分割,因爲座標非常簡單)。我需要在我的延遲渲染器中繪製爲光幾何圖形的任意幾何圖形具有一些問題。在頂點着色器I輸出vVertCoord
爲紅色= x和綠色= Y顏色:
#version 150
noperspective in vec2 vVertCoord;
out vec4 colorOut;
void main(void)
{
colorOut = vec4(vVertCoord.x, vVertCoord.y, 0, 1);
}
這是結果,當我點光球裏,一切都看起來很好(黑線呈現上目的):
但是,如果我靠攏光幾何這是結果:
左上角的紅色補丁在那裏做什麼?您不希望在禁用調試顏色的情況下查看實際顏色的結果,因爲它看起來像是lsd行程,當您移動相機時,一切都會變形。這與精度有關嗎?請注意,當我在像素着色器中使用gl_FragCoord時,一切正常。
是否有任何特別的原因,爲什麼你的紋理座標是基於gl_FragCoord而不是一個正常的插值屬性?在第一個例子中,這已經不再需要這個部門了。附:而不是vScreenSize,你可以有屏幕尺寸的倒數(把分割變成一個乘法) –
你可能不想要後者,這將消除做任何紋理過濾的可能性。雖然您可能認爲自己並不關心這一點,但在延遲着色引擎中,以不同的分辨率(特別是低端硬件,通常具有相當的填充率限制)進行G-Buffer生成和着色可能很有用。 –