Hi,
I am trying to implement motion blur from “GPU Gems 3” as a post effect using a fragment shader.
(http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html)
The sample code is in HLSL/Cg and I am having difficulties doing the conversion to GLSL right.
The “ViewProjectionMatrix” and it’s reverse are the problem, I guess.
I am using gl_ModelViewProjectionMatrixInverse and as a uniform I upload the GL_MODELVIEW matrix.
Here is my fragment shader code:
(using OpenGL 2.0)
uniform sampler2D tex;
uniform sampler2D tex2;
uniform mat4 PrevMatrix;
varying vec2 vTexCoord;
void main(void)
{
vec4 color = texture2D(tex, vTexCoord);
vec4 zOverW = texture2D(tex2, vTexCoord);
// H is the viewport position at this pixel in the range -1 to 1.
vec4 H = vec4(vTexCoord.x * 2 - 1, (1 - vTexCoord.y) * 2 - 1, zOverW.g, 1);
// Transform by the view-projection inverse.
vec4 D = gl_ModelViewProjectionMatrixInverse * H;
// Divide by w to get the world position.
vec4 worldPos = D / vec4(D.w);
// Current viewport position
vec4 currentPos = H;
// Use the world position, and transform by the previous view-projection matrix.
vec4 previousPos = PrevMatrix * worldpos;
// Convert to nonhomogeneous points [-1,1] by dividing by w.
previousPos = previousPos / vec4(previousPos.w);
// Use this frame's position and last frame's to compute the pixel velocity.
vec2 velocity = vec2(currentPos.xy - previousPos.xy)/2.0;
//velocity = (velocity + 1.0 ) / 2.0;
gl_FragColor = vec4(velocity.x, velocity.y, color.g, 1.0);
}
here I set the previous frame’s matrix:
GLint loc = glGetUniformLocation(program_object, "PrevMatrix" );
glUniformMatrix4fv( loc, 1, GL_FALSE, &prevMat[0]);
glGetFloatv(GL_MODELVIEW_MATRIX, prevMat);
Any help would be appreciated!