This week was the beginning of midterms. Because of so, we only briefly covered image processing using different color models such as HSL/HSV and other techniques for shadow mapping. The topic of this post will be :
What we’ve all seen in reality is what effect motion has on our view of the world. Due to the discrepancy of movement and how much detail our eyes can see, we will see streaking - blurring of details. We are unable to perceive every moment of time/frame when the movement of ourselves or the world are too fast – the result is motion blur. Although motion blur can be problematic for the capture of images and video, it can also be employed to create a sense of realistic motion as well as directing focus to the object in motion. In games motion blur also has the added benefit of padding a low FPS scene to perhaps hide jerkiness. Too much motion blur however can cause negative effects such as causing dizziness.
Motion Blur
What we’ve all seen in reality is what effect motion has on our view of the world. Due to the discrepancy of movement and how much detail our eyes can see, we will see streaking - blurring of details. We are unable to perceive every moment of time/frame when the movement of ourselves or the world are too fast – the result is motion blur. Although motion blur can be problematic for the capture of images and video, it can also be employed to create a sense of realistic motion as well as directing focus to the object in motion. In games motion blur also has the added benefit of padding a low FPS scene to perhaps hide jerkiness. Too much motion blur however can cause negative effects such as causing dizziness.
A fast way
to implement simple motion blur in OpenGL is using the accumulation buffer.
This buffer is similar to the back/front buffer in the sense that it can store
images. The accumulation buffer can
store multiple images and blend them together using weights.
glClear(GL_ACCUM_BUFFER_BIT); //draw scene here glAccum(GL_ACCUM, 0.5); //change scene //draw scene here glAccum(GL_ACCUM, 0.5); glAccum(GL_RETURN, 1.0);
In the
above, the accumulation buffer is first cleared per frame, and then the scene
is rendered and passed to the accumulation buffer with a weighing of 0.5.
Afterwards the scene is altered (perhaps offset by velocity) and also passed
with the same weighing. There isn’t a set number to how many scenes you can pass
other than hardware and performance limits. To output the scene you simply call
return and assign the total weighing.
Motion Blur using the accumulation buffer with 4 draws:
Motion Blur using the accumulation buffer with 4 draws:
Motion Blurred scene (static objects) |
Motion Blurred particles |
Additionally,
the accumulation buffer can also be used to create antialiasing by offsetting
with marginal values, or create depth of field using similar techniques to blur
regions of the scene.The accumulation
buffer isn’t very effective in truth, as such is better to implement motion
blur using shaders and FBOs.
There are
many ways to implement motion blur using shaders, the technique listed in CPU
Gems as requirement for the homework assignment, makes use of depth. The technique
is a post processing effect. In the second pass, the values of the depth buffer
are passed to the fragment shader where by each fragment, is computed for its
world space coordinate. These values are then used with the previous frame’s
view projection to create a velocity vector from the current frame to the previous
frame. It is with these velocity vectors as an offset that pixels of the framebuffer
are sampled to create the motion blur effect.
Nguyuen, H. (2008).
Chapter 27. Motion Blur as a Post-Processing Effect. CPU Gems 3. Retrieved March 2, 2014, from http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html
Tong, Tiying.
(2013, September). Tutorial 5: Antialiasing and other fun with the Accumulation
Buffer. [Lecture Notes]. Retrieved from https://www.cse.msu.edu/~cse872/tutorial5.html
No comments:
Post a Comment