Sharon Dong
Contact Fun Photos Projects About

My projects.



Screenshot of poem.

Poetry Generator

Screenshot of shader.

Real-Time Render

Screenshot of path tracer.

Monte Carlo Path Tracer


Screenshot of minecraft.

Mini Minecraft

Screenshot of program.

Mini Maya





Poetry Generator (Group Project)

Python
A neural network trained to generate poetry by fine-tuning GPT-2 on a large dataset of poems. Poems can be modified with various inputs, including sampling temperature, title, syllables and characters per line, number of words, number of poems, sentiment, alliteration, and rhyme scheme. All features are applied to generated poems through post-process methods. While working with David Li and Jake Lem, I was responsible for implementing the sentiment and alliteration modifications. We also used BERT masking to implement many of the features.
Some generations:

Inputs Generations
Lines per Stanza: 3
Number of poems: 1
Number of words: 200
Sentiment: Negative
Alliteration: s
sick scent of the sea,
In the synodic month
in the sky supra the sea

in the south-side
the bitter sour green smell so sour
cologne I swear it shall sidesplitte me:

You shall see me
spreading my skirts out on the snow
to spread some in the sun...

mock the shadow sooner the sooner —
I won't show you what it is I speak of in my sad song —
you shall soon be uncertain

what it symbolize to be a superpower:
Rhyme Scheme: aabb
Unit: Syllables
Units per line: 6,10
Lines per Stanza: 2
Number of words: 200
I came away from your
battleships of Iwo Jima or sure

battleships of Pearl till
I was a student living in brazil

dressed in a huge plaid band,
tucked into the back seat and By the stand

opposite a parks
made of tin and a concrete, I watched sharks

running their hooves kills
every another toward two hills

in a straight circle to
a distance I could see circling two

the elephants. What was
this moment, this fierce place? What I saw has

a wonderful loss state
history, absolutely great—
Title: Old McDonald Had A Farm
Rhyme Scheme: eieio
Unit: Syllables
Units per line: 6,8,10
Lines per Stanza: 5
...
to see the world that once you mine
was your own, a blue sky, the fields that grew
were green, your corn and wine
that was white, the corn and corn do
up like a record. The sun is in now

sky and the sky is green,
and all our corn is now turn
green, the fields that once were yellow, my queen
with me, you with my learn
and our father with me, and

all our fields begin to turn green, third
to see the world that was
once your land. the spring air had stirred
my spirit into a dance, like a laws
of twelve meeting a girl

of seventeen, a young girl two
last act was to dance to an old one who,
rather than trying to
forget it, was waiting for you
to leave for the day that you would be gone.
...




The Very Hungry Caterpillar Shader

WebGL
Rendered in real-time with raymarching, inspired by the children's book. All shapes are 3D primitives represented by signed distance functions with smooth blending or CSG (constructive solid geometry). A depth of field blurring effect is achieved with a post-process gaussian blur linear interpolation. Most of the textures are created procedurally, using 2D/ 3D fractal brownian motion and worley noise. See code and real-time render on ShaderToy.



GIF of shader.




Monte Carlo Path Tracer

C++
Full path tracer with direct and global illuminuation. Rays are sampled with multiple importance sampling for estimating direct illumination. I also implemented a full lighting integrator, using both direct and global illumination along with russian roulette ray termination. Materials with different BSDFs (specular, fresnel, microfacet) and different light sources (point, area, spot) are supported. Other features include a thin-lens camera and CSG (constructive solid geometry).



Image of render. Image of render.

Full Lighting Integrator
Samples per pixel: 400
Recursion limit: 8 bounces

Full Lighting Integrator
Samples per pixel: 900
Recursion limit: 8 bounces

Image of render. Image of render.

Direct Lighting Integrator
Samples per pixel: 100
Recursion limit: 5 bounces

Full Lighting Integrator
Samples per pixel: 100
Recursion limit: 5 bounces

Image of render. Image of render.

Direct Lighting Integrator
Samples per pixel: 100
Recursion limit: 5 bounces

Full Lighting Integrator
Samples per pixel: 100
Recursion limit: 5 bounces





Mini Minecraft (Group Project)

C++, OpenGL
Basic Minecraft interface that allows the user to move around and modify the terrain. Features include: chuncking terrain generation, procedural terrain, game engine update function and player physics, l-system rivers/ caves/ trees, textures with animation, multithreaded terrain generation, biomes, procedurally placed trees, and procedural day and night cycle. I was responsible for chunking terrain generation, texturing, and the day and night cycle.

Chunking (efficient terrain rendering)
The terrain is rendered using a "chunk" system where blocks of 16 X 256 X 16 are chunked together. Only the hull, or outside faces, of each chunk is rendered, and special cases like empty blocks, edge blocks, and transparent blocks are handled differently. A single interleaved VBO is used to store block informationn for more efficient processing.

Texturing
All textures are loaded in from 1 image file, and UV information for each block type is stored in the VBO. Animated textures, like water and lava, and transparent textures, like ice, are also implemented. A second VBO is used for transparent blocks, since opaque blocks are rendered before any transparent ones.

Procedural sky dome
The sky dome is implemented in a fragment shader. UV coordinates for a quad are generated through ray casting to sample colors from interpolating between hard coded color palettes that correspond to different time values. The terrain is lit from the rotating sun/ moon.







Mini Maya

C++, OpenGL
Mesh editor based off of Autodesk Maya. A half-edge data structure is used to support mesh topology editing operations including: splitting edges, triangulating faces, extruding faces, and smoothing mesh by catmull-clark subdivision. Meshes can be loaded in through OBJ files and skeletons through JSON files, where the data is parsed to form a half-edge mesh. The skeleton joints are stored in a scene graph tree, and are interactive through a GUI. I used the skeleton to implement mesh skinning and shader-based skin deformation, where a simple distance based linear blend skinning algorithm is used.



Image of cow obj. Image of cow skeleton.

Imported from OBJ and JSON files

Skin deformation

Image of cube. Image of smoothed cube. Image of smoothed dodecahedron.

Original cube

Smoothed cube

Dodecahedron with extruded and triangulated faces