moved graduation post back to blog folder

This commit is contained in:
Andrew Scott 2023-08-16 01:47:40 -04:00
parent d0158f3768
commit 2f0b253f65
Signed by: a
GPG key ID: 7CD5A5977E4931C1

View file

@ -0,0 +1,80 @@
---
title: "Graduation"
description: "It's official!"
pubDate: "Aug 16 2023"
heroImage: "/post_images/graduation.jpg"
---
Hi all, sorry for the huge delay in updates, hopefully you can cut me a just little slack... __as I
finally graduated!__ I took an admittedly long break after classes ended in June and I am so happy
to be able to say that I have officially completed my bachelor's degree in Computer Science. I was
just going over some of my projects this afternoon as I continue to refine my CV and it's really
incredible how far I've come. Like many of life's great moments I couldn't have done any of this without
support, and I want to thank my partner Valerie. From the bottom of my heart, I appreciate all that
you've done to help me on this journey.
My final projects for Computer Graphics Shaders as well as Intro to Databases went exceptionally
well. For my shaders class I chose to create a realistic motion blur based on documentation in Nvidia's
[GPU Gems 3](https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-27-motion-blur-post-processing-effect).
I was rather excited about this project and I'd like to go through a few details for anyone who might
be interested, otherwise feel free to skip ahead.
I used a two pass process with OpenGL and GLSL in which I first simply rendered an object to a texture. Then to create a
per-fragment blur effect I sample the depth buffer in the fragment shader to find each pixel's current
position and world position.
// Sample depth buffer
float dbAtPixel = texture(uDepthBuf, vec3(st, 1.));
// Find view position
vec4 viewAtPixel = vec4(s * 2 - 1, (1 - t) * 2 - 1, dbAtPixel, 1);
// Convert to world coords, -1 to 1
vec4 worldPos = viewAtPixel / viewAtPixel.w;
Next, I multiply the world position by a "blur position" (a stand-in for the
direction of movement) to find a previous position. This allows me to calculate a velocity.
// No previous view in a static image, so we make one up with uBlurPos
vec4 prevPos = worldPos * uBlurPos;
// Put in range -1 to 1
prevPos = prevPos / prevPos.w;
// Find pixel velocity and scale it if desired
vec2 velocity = uVelScale * vec2((currPos - prevPos)/2.);
In the third and final stage I sample the color buffer in a loop, using the velocity to cacluate
each fragments color. The number of times the color buffer is sampled directly impacts the quality
of the effect, with higher sample rates resulting in a smoother and more realistic blur.
// Sample color buffer
vec4 color = texture(uColorBuf, st);
// Add velocity to st coords
st += velocity;
// Continue sampling color buffer until preferred number of samples is reached
for (int i = 1; i < uNumSamples; ++i, st += velocity) {
vec4 rgba = texture(uColorBuf, st);
color += rgba;
}
// Average samples to get blur color
color = color / uNumSamples;
Of course, all of that was very boring if you don't know what it means. Let's see what it actually
looks like!
![2D bunny with orange and red stripes](/post_images/graduation/bunny_no_blur.jpg)
![2D bunny with orange and red stripes and a low quality blur](/post_images/graduation/bunny_low_sample.jpg)
![2D bunny with orange and red stripes and a high quality blur](/post_images/graduation/bunny_high_sample.jpg)
With those two classes completed I began the spring term and my final Capstone Project, a three
month long grind to produce a complete piece of professional quality software. I was grouped with
two other students and selected for the "3D Escape Room Game" - a video game intended to mimic the
experience of a real life escape room. This was the first full video game we had ever created so
naturally I was incredibly excited, but quite nervous too! I'll have a lot more to say about this
project in the near future, I was required to write a few blog-style assignments so I intend on
posting those as a series too. Unfortunately I don't think I'm allowed to make our code public, but
on the bright side you will be able to download and actually play the game!