我試圖進行運動模糊後處理效果在GPU精粹3第27章所描述的,但由於模糊抖動,當我移動相機,並沒有按預期工作,我遇到的問題。 這是我的片段着色器:GLSL運動模糊抖動的
varying vec3 pos;
varying vec3 normal;
varying vec2 tex;
varying vec3 tangent;
uniform mat4 matrix;
uniform mat4 VPmatrix;
uniform mat4 matrixPrev;
uniform mat4 VPmatrixPrev;
uniform sampler2D diffuseTexture;
uniform sampler2D zTexture;
void main() {
vec2 texCoord = tex;
float zOverW = texture2D(zTexture, texCoord).r;
vec4 H = vec4(texCoord.x * 2.0 - 1.0, (1 - texCoord.y) * 2.0 - 1.0, zOverW, 1.0);
mat4 inv1 = inverse(matrix);
mat4 inv2 = inverse(VPmatrix);
vec4 D = H*(inv2*inv1);
vec4 worldPos = D/D.w;
mat4 prev = matrixPrev*VPmatrixPrev;
vec4 previousPos = worldPos*prev;
previousPos /= previousPos.w;
vec2 velocity = vec2((H.x-previousPos.x)/2.0, (H.y-previousPos.y)/2.0);
vec3 color = vec3(texture2D(diffuseTexture, texCoord));
for(int i = 0; i < 16; i++) {
texCoord += velocity;
vec3 color2 = vec3(texture2D(diffuseTexture, texCoord));
color += color2;
}
color /= 16;
gl_FragColor = vec4(color, 1.0);
}
制服matrix
和VPmatrix
是進行了如下的模型視圖和投影矩陣:
float matrix[16];
float VPmatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
glGetFloatv(GL_PROJECTION_MATRIX, VPmatrix);
制服matrixPrev
和VPmatrixPrev
是以前的模型視圖和投影矩陣得到渲染後如下:(以下matrixPrev
和VPmatrixPrev
代碼是全局變量)
for(int i = 0; i < 16; i++) {
matrixPrev[i] = matrix[i];
VPmatrixPrev[i] = VPmatrix[i];
}
所有四個矩陣被傳遞到着色器如下:
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "matrix"), 16, GL_FALSE, matrix);
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "VPmatrix"), 16, GL_FALSE, VPmatrix);
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "matrixPrev"), 16, GL_FALSE, matrixPrev);
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "VPmatrixPrev"), 16, GL_FALSE, VPmatrixPrev);
在着色器,統一zTexture是包含幀緩衝器的深度值的紋理。 (不知道他們是由W分)
我希望着色器的工作,但我所得到的卻是,當我與微妙的旋轉旋轉的攝像頭周圍的模糊抖動的真快。我試着渲染zTexture,我得到的結果是灰度圖像,所以它看起來沒問題。我也試過片段顏色設置爲H.xyz
和previousPos.xyz
和在渲染H.xyz
產生彩色屏幕,previousPos.xyz
產生相同的彩色屏幕,除了當相機旋轉顏色似乎顛倒了,所以我懷疑有什麼不對的提取世界從深度的位置。
我在這裏錯過了什麼嗎?任何幫助將不勝感激。
在你的代碼中,你做了16次模糊採樣。請注意,這意味着您需要每像素16倍採樣。好多啊。您是否嘗試將其降至例如4次?效果好嗎?你還看到抖動?單單根據代碼很難說任何事情,也許有些實驗會顯示出什麼是錯的。 – Krystian 2014-10-20 11:31:58