From ce1ce634aa7ac57aec4fc31dd667180805a34c59 Mon Sep 17 00:00:00 2001
From: Jiangping Xu
Date: Wed, 9 Oct 2019 23:58:24 -0400
Subject: [PATCH 1/4] Done
---
README.md | 323 +--------
bin/Release/vulkan_grass_rendering.exe | Bin 245248 -> 285696 bytes
.../v15/Solution.VC.db | Bin 0 -> 1576960 bytes
.../v15/Solution.VC.db-shm | Bin 0 -> 32768 bytes
.../v15/Solution.VC.db-wal | Bin 0 -> 457352 bytes
build/ALL_BUILD.vcxproj | 185 ++++++
build/ALL_BUILD.vcxproj.filters | 8 +
build/ALL_BUILD.vcxproj.user | 4 +
build/CMakeCache.txt | 366 ++++++++++
build/CMakeFiles/3.13.4/CMakeCCompiler.cmake | 73 ++
.../CMakeFiles/3.13.4/CMakeCXXCompiler.cmake | 76 +++
.../3.13.4/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 49664 bytes
.../3.13.4/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 49664 bytes
build/CMakeFiles/3.13.4/CMakeRCCompiler.cmake | 6 +
build/CMakeFiles/3.13.4/CMakeSystem.cmake | 15 +
.../3.13.4/CompilerIdC/CMakeCCompilerId.c | 623 ++++++++++++++++++
.../3.13.4/CompilerIdC/CompilerIdC.exe | Bin 0 -> 14848 bytes
.../3.13.4/CompilerIdC/CompilerIdC.vcxproj | 68 ++
.../CompilerIdC/Debug/CMakeCCompilerId.obj | Bin 0 -> 2183 bytes
.../Debug/CompilerIdC.tlog/CL.command.1.tlog | Bin 0 -> 860 bytes
.../Debug/CompilerIdC.tlog/CL.read.1.tlog | Bin 0 -> 660 bytes
.../Debug/CompilerIdC.tlog/CL.write.1.tlog | Bin 0 -> 528 bytes
.../CompilerIdC.lastbuildstate | 2 +
.../CompilerIdC.tlog/link.command.1.tlog | Bin 0 -> 1096 bytes
.../Debug/CompilerIdC.tlog/link.read.1.tlog | Bin 0 -> 3946 bytes
.../Debug/CompilerIdC.tlog/link.write.1.tlog | Bin 0 -> 522 bytes
.../CompilerIdCXX/CMakeCXXCompilerId.cpp | 602 +++++++++++++++++
.../3.13.4/CompilerIdCXX/CompilerIdCXX.exe | Bin 0 -> 14848 bytes
.../CompilerIdCXX/CompilerIdCXX.vcxproj | 68 ++
.../Debug/CMakeCXXCompilerId.obj | Bin 0 -> 2204 bytes
.../CompilerIdCXX.tlog/CL.command.1.tlog | Bin 0 -> 884 bytes
.../Debug/CompilerIdCXX.tlog/CL.read.1.tlog | Bin 0 -> 672 bytes
.../Debug/CompilerIdCXX.tlog/CL.write.1.tlog | Bin 0 -> 548 bytes
.../CompilerIdCXX.lastbuildstate | 2 +
.../CompilerIdCXX.tlog/link.command.1.tlog | Bin 0 -> 1120 bytes
.../Debug/CompilerIdCXX.tlog/link.read.1.tlog | Bin 0 -> 3962 bytes
.../CompilerIdCXX.tlog/link.write.1.tlog | Bin 0 -> 538 bytes
build/CMakeFiles/3.13.4/VCTargetsPath.txt | 1 +
build/CMakeFiles/3.13.4/VCTargetsPath.vcxproj | 28 +
.../VCTargetsPath.lastbuildstate | 2 +
build/CMakeFiles/CMakeError.log | 38 ++
build/CMakeFiles/CMakeOutput.log | 381 +++++++++++
build/CMakeFiles/TargetDirectories.txt | 12 +
.../compute.comp.spv.rule | 1 +
.../graphics.frag.spv.rule | 1 +
.../graphics.vert.spv.rule | 1 +
.../grass.frag.spv.rule | 1 +
.../grass.tesc.spv.rule | 1 +
.../grass.tese.spv.rule | 1 +
.../grass.vert.spv.rule | 1 +
.../generate.stamp.rule | 1 +
build/CMakeFiles/cmake.check_cache | 1 +
build/CMakeFiles/feature_tests.bin | Bin 0 -> 51712 bytes
build/CMakeFiles/feature_tests.c | 20 +
build/CMakeFiles/feature_tests.cxx | 398 +++++++++++
build/CMakeFiles/generate.stamp | 1 +
build/CMakeFiles/generate.stamp.depend | 95 +++
build/CMakeFiles/generate.stamp.list | 5 +
build/ZERO_CHECK.vcxproj | 167 +++++
build/ZERO_CHECK.vcxproj.filters | 13 +
...cis565_project4_vulkan_grass_rendering.sln | 183 +++++
build/cmake_install.cmake | 51 ++
build/external/CMakeFiles/generate.stamp | 1 +
.../external/CMakeFiles/generate.stamp.depend | 2 +
build/external/GLFW/ALL_BUILD.vcxproj | 179 +++++
build/external/GLFW/ALL_BUILD.vcxproj.filters | 8 +
build/external/GLFW/CMakeFiles/generate.stamp | 1 +
.../GLFW/CMakeFiles/generate.stamp.depend | 16 +
build/external/GLFW/GLFW.sln | 61 ++
build/external/GLFW/cmake_install.cmake | 40 ++
.../GLFW/src/CMakeFiles/generate.stamp | 1 +
.../GLFW/src/CMakeFiles/generate.stamp.depend | 2 +
build/external/GLFW/src/Release/glfw3.lib | Bin 0 -> 428386 bytes
build/external/GLFW/src/cmake_install.cmake | 34 +
.../GLFW/src/glfw.dir/Release/context.obj | Bin 0 -> 17783 bytes
.../GLFW/src/glfw.dir/Release/egl_context.obj | Bin 0 -> 25751 bytes
.../GLFW/src/glfw.dir/Release/glfw.log | 19 +
.../Release/glfw.tlog/CL.command.1.tlog | Bin 0 -> 23640 bytes
.../glfw.dir/Release/glfw.tlog/CL.read.1.tlog | Bin 0 -> 349132 bytes
.../Release/glfw.tlog/CL.write.1.tlog | Bin 0 -> 6874 bytes
.../Release/glfw.tlog/Lib-link.read.1.tlog | Bin 0 -> 7786 bytes
.../Release/glfw.tlog/Lib-link.write.1.tlog | Bin 0 -> 4028 bytes
.../Release/glfw.tlog/Lib.command.1.tlog | Bin 0 -> 5028 bytes
.../glfw.tlog/custombuild.command.1.tlog | Bin 0 -> 1180 bytes
.../Release/glfw.tlog/custombuild.read.1.tlog | Bin 0 -> 214 bytes
.../glfw.tlog/custombuild.write.1.tlog | Bin 0 -> 458 bytes
.../Release/glfw.tlog/glfw.lastbuildstate | 2 +
.../GLFW/src/glfw.dir/Release/init.obj | Bin 0 -> 62762 bytes
.../GLFW/src/glfw.dir/Release/input.obj | Bin 0 -> 54021 bytes
.../GLFW/src/glfw.dir/Release/monitor.obj | Bin 0 -> 15726 bytes
.../src/glfw.dir/Release/osmesa_context.obj | Bin 0 -> 11215 bytes
.../GLFW/src/glfw.dir/Release/vulkan.obj | Bin 0 -> 15740 bytes
.../GLFW/src/glfw.dir/Release/wgl_context.obj | Bin 0 -> 22920 bytes
.../GLFW/src/glfw.dir/Release/win32_init.obj | Bin 0 -> 20367 bytes
.../src/glfw.dir/Release/win32_joystick.obj | Bin 0 -> 21845 bytes
.../src/glfw.dir/Release/win32_monitor.obj | Bin 0 -> 16302 bytes
.../src/glfw.dir/Release/win32_thread.obj | Bin 0 -> 3853 bytes
.../GLFW/src/glfw.dir/Release/win32_time.obj | Bin 0 -> 1998 bytes
.../src/glfw.dir/Release/win32_window.obj | Bin 0 -> 61062 bytes
.../GLFW/src/glfw.dir/Release/window.obj | Bin 0 -> 27328 bytes
build/external/GLFW/src/glfw.vcxproj | 309 +++++++++
build/external/GLFW/src/glfw.vcxproj.filters | 93 +++
build/external/GLFW/src/glfw3.pc | 13 +
build/external/GLFW/src/glfw3Config.cmake | 1 +
.../GLFW/src/glfw3ConfigVersion.cmake | 46 ++
build/external/GLFW/src/glfw_config.h | 57 ++
build/external/cmake_install.cmake | 40 ++
build/src/CMakeFiles/generate.stamp | 1 +
build/src/CMakeFiles/generate.stamp.depend | 3 +
build/src/cmake_install.cmake | 34 +
build/src/compute.comp.spv.vcxproj | 231 +++++++
build/src/compute.comp.spv.vcxproj.filters | 23 +
build/src/graphics.frag.spv.vcxproj | 231 +++++++
build/src/graphics.frag.spv.vcxproj.filters | 23 +
build/src/graphics.vert.spv.vcxproj | 231 +++++++
build/src/graphics.vert.spv.vcxproj.filters | 23 +
build/src/grass.frag.spv.vcxproj | 231 +++++++
build/src/grass.frag.spv.vcxproj.filters | 23 +
build/src/grass.tesc.spv.vcxproj | 231 +++++++
build/src/grass.tesc.spv.vcxproj.filters | 23 +
build/src/grass.tese.spv.vcxproj | 231 +++++++
build/src/grass.tese.spv.vcxproj.filters | 23 +
build/src/grass.vert.spv.vcxproj | 231 +++++++
build/src/grass.vert.spv.vcxproj.filters | 23 +
build/src/images/grass.jpg | Bin 0 -> 265432 bytes
build/src/shaders/compute.comp.spv | Bin 0 -> 11472 bytes
build/src/shaders/graphics.frag.spv | Bin 0 -> 692 bytes
build/src/shaders/graphics.vert.spv | Bin 0 -> 1712 bytes
build/src/shaders/grass.frag.spv | Bin 0 -> 1548 bytes
build/src/shaders/grass.tesc.spv | Bin 0 -> 3916 bytes
build/src/shaders/grass.tese.spv | Bin 0 -> 3996 bytes
build/src/shaders/grass.vert.spv | Bin 0 -> 1368 bytes
.../Release/Blades.obj | Bin 0 -> 23692 bytes
.../Release/BufferUtils.obj | Bin 0 -> 13026 bytes
.../Release/Camera.obj | Bin 0 -> 18767 bytes
.../Release/Device.obj | Bin 0 -> 4554 bytes
.../Release/Image.obj | Bin 0 -> 234347 bytes
.../Release/Instance.obj | Bin 0 -> 188075 bytes
.../Release/Model.obj | Bin 0 -> 27899 bytes
.../Release/Renderer.obj | Bin 0 -> 149375 bytes
.../Release/Scene.obj | Bin 0 -> 18885 bytes
.../Release/ShaderModule.obj | Bin 0 -> 64617 bytes
.../Release/SwapChain.obj | Bin 0 -> 29611 bytes
.../Release/Window.obj | Bin 0 -> 4591 bytes
.../Release/main.obj | Bin 0 -> 39604 bytes
.../vulkan_g.95BE4470.tlog/CL.command.1.tlog | Bin 0 -> 24416 bytes
.../vulkan_g.95BE4470.tlog/CL.read.1.tlog | Bin 0 -> 682182 bytes
.../vulkan_g.95BE4470.tlog/CL.write.1.tlog | Bin 0 -> 6906 bytes
.../custombuild.command.1.tlog | Bin 0 -> 1124 bytes
.../custombuild.read.1.tlog | Bin 0 -> 372 bytes
.../custombuild.write.1.tlog | Bin 0 -> 402 bytes
.../link.command.1.tlog | Bin 0 -> 6000 bytes
.../vulkan_g.95BE4470.tlog/link.read.1.tlog | Bin 0 -> 10072 bytes
.../vulkan_g.95BE4470.tlog/link.write.1.tlog | Bin 0 -> 3556 bytes
.../vulkan_grass_rendering.lastbuildstate | 2 +
.../Release/vulkan_grass_rendering.log | 3 +
build/src/vulkan_grass_rendering.vcxproj | 414 ++++++++++++
.../vulkan_grass_rendering.vcxproj.filters | 65 ++
build/src/vulkan_grass_rendering.vcxproj.user | 4 +
.../compute.comp.spv/compute.comp.spv.log | 1 +
.../compute.comp.spv.lastbuildstate | 2 +
.../custombuild.command.1.tlog | Bin 0 -> 2522 bytes
.../custombuild.read.1.tlog | Bin 0 -> 662 bytes
.../custombuild.write.1.tlog | Bin 0 -> 912 bytes
.../custombuild.command.1.tlog | Bin 0 -> 2528 bytes
.../custombuild.read.1.tlog | Bin 0 -> 664 bytes
.../custombuild.write.1.tlog | Bin 0 -> 916 bytes
.../graphics.frag.spv.lastbuildstate | 2 +
.../graphics.frag.spv/graphics.frag.spv.log | 1 +
.../custombuild.command.1.tlog | Bin 0 -> 2528 bytes
.../custombuild.read.1.tlog | Bin 0 -> 664 bytes
.../custombuild.write.1.tlog | Bin 0 -> 916 bytes
.../graphics.vert.spv.lastbuildstate | 2 +
.../graphics.vert.spv/graphics.vert.spv.log | 1 +
.../Release/grass.frag.spv/grass.frag.spv.log | 1 +
.../custombuild.command.1.tlog | Bin 0 -> 2510 bytes
.../custombuild.read.1.tlog | Bin 0 -> 658 bytes
.../custombuild.write.1.tlog | Bin 0 -> 904 bytes
.../grass.frag.spv.lastbuildstate | 2 +
.../Release/grass.tesc.spv/grass.tesc.spv.log | 1 +
.../custombuild.command.1.tlog | Bin 0 -> 2510 bytes
.../custombuild.read.1.tlog | Bin 0 -> 658 bytes
.../custombuild.write.1.tlog | Bin 0 -> 904 bytes
.../grass.tesc.spv.lastbuildstate | 2 +
.../Release/grass.tese.spv/grass.tese.spv.log | 1 +
.../custombuild.command.1.tlog | Bin 0 -> 2510 bytes
.../custombuild.read.1.tlog | Bin 0 -> 658 bytes
.../custombuild.write.1.tlog | Bin 0 -> 904 bytes
.../grass.tese.spv.lastbuildstate | 2 +
.../Release/grass.vert.spv/grass.vert.spv.log | 1 +
.../custombuild.command.1.tlog | Bin 0 -> 2510 bytes
.../custombuild.read.1.tlog | Bin 0 -> 658 bytes
.../custombuild.write.1.tlog | Bin 0 -> 904 bytes
.../grass.vert.spv.lastbuildstate | 2 +
build/x64/Release/ZERO_CHECK/ZERO_CHECK.log | 6 +
.../ZERO_CHECK.tlog/ZERO_CHECK.lastbuildstate | 2 +
.../custombuild.command.1.tlog | Bin 0 -> 1352 bytes
.../ZERO_CHECK.tlog/custombuild.read.1.tlog | Bin 0 -> 16638 bytes
.../ZERO_CHECK.tlog/custombuild.write.1.tlog | Bin 0 -> 1418 bytes
img/FPSWithDifferentCulling.png | Bin 0 -> 30473 bytes
img/demo.gif | Bin 0 -> 8467667 bytes
img/dis.gif | Bin 0 -> 5035928 bytes
img/ori.gif | Bin 0 -> 2976155 bytes
src/Renderer.cpp | 120 +++-
src/Renderer.h | 4 +
src/main.cpp | 2 +-
src/shaders/compute.comp | 99 ++-
src/shaders/grass.frag | 10 +-
src/shaders/grass.tesc | 31 +-
src/shaders/grass.tese | 18 +
src/shaders/grass.vert | 13 +
211 files changed, 7064 insertions(+), 316 deletions(-)
create mode 100644 build/.vs/cis565_project4_vulkan_grass_rendering/v15/Solution.VC.db
create mode 100644 build/.vs/cis565_project4_vulkan_grass_rendering/v15/Solution.VC.db-shm
create mode 100644 build/.vs/cis565_project4_vulkan_grass_rendering/v15/Solution.VC.db-wal
create mode 100644 build/ALL_BUILD.vcxproj
create mode 100644 build/ALL_BUILD.vcxproj.filters
create mode 100644 build/ALL_BUILD.vcxproj.user
create mode 100644 build/CMakeCache.txt
create mode 100644 build/CMakeFiles/3.13.4/CMakeCCompiler.cmake
create mode 100644 build/CMakeFiles/3.13.4/CMakeCXXCompiler.cmake
create mode 100644 build/CMakeFiles/3.13.4/CMakeDetermineCompilerABI_C.bin
create mode 100644 build/CMakeFiles/3.13.4/CMakeDetermineCompilerABI_CXX.bin
create mode 100644 build/CMakeFiles/3.13.4/CMakeRCCompiler.cmake
create mode 100644 build/CMakeFiles/3.13.4/CMakeSystem.cmake
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/CMakeCCompilerId.c
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/CompilerIdC.exe
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/CompilerIdC.vcxproj
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CMakeCCompilerId.obj
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/CL.command.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/CL.read.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/CL.write.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/CompilerIdC.lastbuildstate
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/link.command.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/link.read.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdC/Debug/CompilerIdC.tlog/link.write.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/CMakeCXXCompilerId.cpp
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/CompilerIdCXX.exe
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/CompilerIdCXX.vcxproj
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CMakeCXXCompilerId.obj
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/CL.command.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/CL.read.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/CL.write.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/CompilerIdCXX.lastbuildstate
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/link.command.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/link.read.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/CompilerIdCXX/Debug/CompilerIdCXX.tlog/link.write.1.tlog
create mode 100644 build/CMakeFiles/3.13.4/VCTargetsPath.txt
create mode 100644 build/CMakeFiles/3.13.4/VCTargetsPath.vcxproj
create mode 100644 build/CMakeFiles/3.13.4/x64/Debug/VCTargetsPath.tlog/VCTargetsPath.lastbuildstate
create mode 100644 build/CMakeFiles/CMakeError.log
create mode 100644 build/CMakeFiles/CMakeOutput.log
create mode 100644 build/CMakeFiles/TargetDirectories.txt
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/compute.comp.spv.rule
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/graphics.frag.spv.rule
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/graphics.vert.spv.rule
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/grass.frag.spv.rule
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/grass.tesc.spv.rule
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/grass.tese.spv.rule
create mode 100644 build/CMakeFiles/a9932b03be4a5cdaa73b966551202659/grass.vert.spv.rule
create mode 100644 build/CMakeFiles/c9ba31ded5691be5ffae8720d856dcff/generate.stamp.rule
create mode 100644 build/CMakeFiles/cmake.check_cache
create mode 100644 build/CMakeFiles/feature_tests.bin
create mode 100644 build/CMakeFiles/feature_tests.c
create mode 100644 build/CMakeFiles/feature_tests.cxx
create mode 100644 build/CMakeFiles/generate.stamp
create mode 100644 build/CMakeFiles/generate.stamp.depend
create mode 100644 build/CMakeFiles/generate.stamp.list
create mode 100644 build/ZERO_CHECK.vcxproj
create mode 100644 build/ZERO_CHECK.vcxproj.filters
create mode 100644 build/cis565_project4_vulkan_grass_rendering.sln
create mode 100644 build/cmake_install.cmake
create mode 100644 build/external/CMakeFiles/generate.stamp
create mode 100644 build/external/CMakeFiles/generate.stamp.depend
create mode 100644 build/external/GLFW/ALL_BUILD.vcxproj
create mode 100644 build/external/GLFW/ALL_BUILD.vcxproj.filters
create mode 100644 build/external/GLFW/CMakeFiles/generate.stamp
create mode 100644 build/external/GLFW/CMakeFiles/generate.stamp.depend
create mode 100644 build/external/GLFW/GLFW.sln
create mode 100644 build/external/GLFW/cmake_install.cmake
create mode 100644 build/external/GLFW/src/CMakeFiles/generate.stamp
create mode 100644 build/external/GLFW/src/CMakeFiles/generate.stamp.depend
create mode 100644 build/external/GLFW/src/Release/glfw3.lib
create mode 100644 build/external/GLFW/src/cmake_install.cmake
create mode 100644 build/external/GLFW/src/glfw.dir/Release/context.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/egl_context.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.log
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/CL.command.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/CL.read.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/CL.write.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/Lib-link.read.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/Lib-link.write.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/Lib.command.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/custombuild.command.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/custombuild.read.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/custombuild.write.1.tlog
create mode 100644 build/external/GLFW/src/glfw.dir/Release/glfw.tlog/glfw.lastbuildstate
create mode 100644 build/external/GLFW/src/glfw.dir/Release/init.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/input.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/monitor.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/osmesa_context.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/vulkan.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/wgl_context.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/win32_init.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/win32_joystick.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/win32_monitor.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/win32_thread.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/win32_time.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/win32_window.obj
create mode 100644 build/external/GLFW/src/glfw.dir/Release/window.obj
create mode 100644 build/external/GLFW/src/glfw.vcxproj
create mode 100644 build/external/GLFW/src/glfw.vcxproj.filters
create mode 100644 build/external/GLFW/src/glfw3.pc
create mode 100644 build/external/GLFW/src/glfw3Config.cmake
create mode 100644 build/external/GLFW/src/glfw3ConfigVersion.cmake
create mode 100644 build/external/GLFW/src/glfw_config.h
create mode 100644 build/external/cmake_install.cmake
create mode 100644 build/src/CMakeFiles/generate.stamp
create mode 100644 build/src/CMakeFiles/generate.stamp.depend
create mode 100644 build/src/cmake_install.cmake
create mode 100644 build/src/compute.comp.spv.vcxproj
create mode 100644 build/src/compute.comp.spv.vcxproj.filters
create mode 100644 build/src/graphics.frag.spv.vcxproj
create mode 100644 build/src/graphics.frag.spv.vcxproj.filters
create mode 100644 build/src/graphics.vert.spv.vcxproj
create mode 100644 build/src/graphics.vert.spv.vcxproj.filters
create mode 100644 build/src/grass.frag.spv.vcxproj
create mode 100644 build/src/grass.frag.spv.vcxproj.filters
create mode 100644 build/src/grass.tesc.spv.vcxproj
create mode 100644 build/src/grass.tesc.spv.vcxproj.filters
create mode 100644 build/src/grass.tese.spv.vcxproj
create mode 100644 build/src/grass.tese.spv.vcxproj.filters
create mode 100644 build/src/grass.vert.spv.vcxproj
create mode 100644 build/src/grass.vert.spv.vcxproj.filters
create mode 100644 build/src/images/grass.jpg
create mode 100644 build/src/shaders/compute.comp.spv
create mode 100644 build/src/shaders/graphics.frag.spv
create mode 100644 build/src/shaders/graphics.vert.spv
create mode 100644 build/src/shaders/grass.frag.spv
create mode 100644 build/src/shaders/grass.tesc.spv
create mode 100644 build/src/shaders/grass.tese.spv
create mode 100644 build/src/shaders/grass.vert.spv
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Blades.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/BufferUtils.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Camera.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Device.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Image.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Instance.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Model.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Renderer.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Scene.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/ShaderModule.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/SwapChain.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/Window.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/main.obj
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/CL.command.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/CL.read.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/CL.write.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/custombuild.command.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/custombuild.read.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/custombuild.write.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/link.command.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/link.read.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/link.write.1.tlog
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_g.95BE4470.tlog/vulkan_grass_rendering.lastbuildstate
create mode 100644 build/src/vulkan_grass_rendering.dir/Release/vulkan_grass_rendering.log
create mode 100644 build/src/vulkan_grass_rendering.vcxproj
create mode 100644 build/src/vulkan_grass_rendering.vcxproj.filters
create mode 100644 build/src/vulkan_grass_rendering.vcxproj.user
create mode 100644 build/src/x64/Release/compute.comp.spv/compute.comp.spv.log
create mode 100644 build/src/x64/Release/compute.comp.spv/compute.comp.spv.tlog/compute.comp.spv.lastbuildstate
create mode 100644 build/src/x64/Release/compute.comp.spv/compute.comp.spv.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/compute.comp.spv/compute.comp.spv.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/compute.comp.spv/compute.comp.spv.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/graphics.frag.spv/graphics.1EBBA249.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/graphics.frag.spv/graphics.1EBBA249.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/graphics.frag.spv/graphics.1EBBA249.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/graphics.frag.spv/graphics.1EBBA249.tlog/graphics.frag.spv.lastbuildstate
create mode 100644 build/src/x64/Release/graphics.frag.spv/graphics.frag.spv.log
create mode 100644 build/src/x64/Release/graphics.vert.spv/graphics.7871A1FE.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/graphics.vert.spv/graphics.7871A1FE.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/graphics.vert.spv/graphics.7871A1FE.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/graphics.vert.spv/graphics.7871A1FE.tlog/graphics.vert.spv.lastbuildstate
create mode 100644 build/src/x64/Release/graphics.vert.spv/graphics.vert.spv.log
create mode 100644 build/src/x64/Release/grass.frag.spv/grass.frag.spv.log
create mode 100644 build/src/x64/Release/grass.frag.spv/grass.frag.spv.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/grass.frag.spv/grass.frag.spv.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/grass.frag.spv/grass.frag.spv.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/grass.frag.spv/grass.frag.spv.tlog/grass.frag.spv.lastbuildstate
create mode 100644 build/src/x64/Release/grass.tesc.spv/grass.tesc.spv.log
create mode 100644 build/src/x64/Release/grass.tesc.spv/grass.tesc.spv.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/grass.tesc.spv/grass.tesc.spv.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/grass.tesc.spv/grass.tesc.spv.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/grass.tesc.spv/grass.tesc.spv.tlog/grass.tesc.spv.lastbuildstate
create mode 100644 build/src/x64/Release/grass.tese.spv/grass.tese.spv.log
create mode 100644 build/src/x64/Release/grass.tese.spv/grass.tese.spv.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/grass.tese.spv/grass.tese.spv.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/grass.tese.spv/grass.tese.spv.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/grass.tese.spv/grass.tese.spv.tlog/grass.tese.spv.lastbuildstate
create mode 100644 build/src/x64/Release/grass.vert.spv/grass.vert.spv.log
create mode 100644 build/src/x64/Release/grass.vert.spv/grass.vert.spv.tlog/custombuild.command.1.tlog
create mode 100644 build/src/x64/Release/grass.vert.spv/grass.vert.spv.tlog/custombuild.read.1.tlog
create mode 100644 build/src/x64/Release/grass.vert.spv/grass.vert.spv.tlog/custombuild.write.1.tlog
create mode 100644 build/src/x64/Release/grass.vert.spv/grass.vert.spv.tlog/grass.vert.spv.lastbuildstate
create mode 100644 build/x64/Release/ZERO_CHECK/ZERO_CHECK.log
create mode 100644 build/x64/Release/ZERO_CHECK/ZERO_CHECK.tlog/ZERO_CHECK.lastbuildstate
create mode 100644 build/x64/Release/ZERO_CHECK/ZERO_CHECK.tlog/custombuild.command.1.tlog
create mode 100644 build/x64/Release/ZERO_CHECK/ZERO_CHECK.tlog/custombuild.read.1.tlog
create mode 100644 build/x64/Release/ZERO_CHECK/ZERO_CHECK.tlog/custombuild.write.1.tlog
create mode 100644 img/FPSWithDifferentCulling.png
create mode 100644 img/demo.gif
create mode 100644 img/dis.gif
create mode 100644 img/ori.gif
diff --git a/README.md b/README.md
index 47a8c52..c24709e 100644
--- a/README.md
+++ b/README.md
@@ -1,302 +1,51 @@
-Instructions - Vulkan Grass Rendering
-========================
+
+
+
-This is due **Wednesday 10/9, evening at midnight**.
+Vulkan Grass Rendering
+================
-**QUICK NOTE**: Please use `git clone --recursive` when cloning this repo as there are submodules which need to be cloned as well.
+**University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 4**
+* Jiangping Xu
+ * [LinkedIn](https://www.linkedin.com/in/jiangping-xu-365b19134/)
+* Tested on: Windows 10, i7-4700MQ @ 2.40GHz 8GB, GT 755M 6100MB (personal laptop)
+___
-**Summary:**
-In this project, you will use Vulkan to implement a grass simulator and renderer. You will
-use compute shaders to perform physics calculations on Bezier curves that represent individual
-grass blades in your application. Since rendering every grass blade on every frame will is fairly
-inefficient, you will also use compute shaders to cull grass blades that don't contribute to a given frame.
-The remaining blades will be passed to a graphics pipeline, in which you will write several shaders.
-You will write a vertex shader to transform Bezier control points, tessellation shaders to dynamically create
-the grass geometry from the Bezier curves, and a fragment shader to shade the grass blades.
+This project is based on the paper [Responsive Real-Time Grass Grass Rendering for General 3D Scenes](https://www.cg.tuwien.ac.at/research/publications/2017/JAHRMANN-2017-RRTG/JAHRMANN-2017-RRTG-draft.pdf)
-The base code provided includes all of the basic Vulkan setup, including a compute pipeline that will run your compute
-shaders and two graphics pipelines, one for rendering the geometry that grass will be placed on and the other for
-rendering the grass itself. Your job will be to write the shaders for the grass graphics pipeline and the compute pipeline,
-as well as binding any resources (descriptors) you may need to accomplish the tasks described in this assignment.
+## Features
+* Forces \
+_gravity_ : consists of environmental gravity (`gE`) and front gravity (`gF = (1/4) * ||gE|| * f`, where `f` is the front facing direction of the blade) \
+_recovery_ : a elastic force that brings the grass blade back into equilibrium (`r = (initial_pos - curr_pos) * stiffness`) \
+_wind_ : use the wind function wi(pos) = vec3(0.5, sin(pos.x + pos.y + time), 0.5) to represents the
+direction and the strength of the wind at pos. There are also a directional alignment term and a height ratio term to scale the wind force according to the height and orientation of the blade.
- 
+* Orientation Culling : cull the blade when the front face direction is perpendicular to the view vector.
-You are not required to use this base code if you don't want
-to. You may also change any part of the base code as you please.
-**This is YOUR project.** The above .gifs are just examples that you
-can use as a reference to compare to. Feel free to get creative with your implementations!
+
+
+

+
+
-**Important:**
-- If you are not in CGGT/DMD, you may replace this project with a GPU compute
-project. You MUST get this pre-approved by Shehzan or one of the TAs before continuing!
+* View-Frustum Culling : cull blades that are outside of the view-frustum.
+* Distance Culling : cull blades that are too far.
+* Lambert shading
+* LOD Tesselation : tessellate to varying levels of detail as a function of how far the grass blade is from the camera.
-### Contents
+## Performance Analysis
+### Culling
+
+
+
-* `src/` C++/Vulkan source files.
- * `shaders/` glsl shader source files
- * `images/` images used as textures within graphics pipelines
-* `external/` Includes and static libraries for 3rd party libraries.
-* `img/` Screenshots and images to use in your READMEs
+From the result above, we can tell frustum culling is the most effective culling mothod. Distance culling also culls out quit a lot blades. The orientation culling seems to have the least effect on the perfermance.\
+Theoratically, these improvements may vary a lot according to the position of the camera.
-### Installing Vulkan
+### LOD Tesselation
+When using a constant level of tesselation (the highest level used in lod tesselation), the fps is 153; when using a LOD tesselation, the fps increases to 187.
-In order to run a Vulkan project, you first need to download and install the [Vulkan SDK](https://vulkan.lunarg.com/).
-Make sure to run the downloaded installed as administrator so that the installer can set the appropriate environment
-variables for you.
-Once you have done this, you need to make sure your GPU driver supports Vulkan. Download and install a
-[Vulkan driver](https://developer.nvidia.com/vulkan-driver) from NVIDIA's website.
-Finally, to check that Vulkan is ready for use, go to your Vulkan SDK directory (`C:/VulkanSDK/` unless otherwise specified)
-and run the `cube.exe` example within the `Bin` directory. IF you see a rotating gray cube with the LunarG logo, then you
-are all set!
-### Running the code
-While developing your grass renderer, you will want to keep validation layers enabled so that error checking is turned on.
-The project is set up such that when you are in `debug` mode, validation layers are enabled, and when you are in `release` mode,
-validation layers are disabled. After building the code, you should be able to run the project without any errors. You will see a plane with a grass texture on it to begin with.
-
-
-
-## Requirements
-
-**Ask on the mailing list for any clarifications.**
-
-In this project, you are given the following code:
-
-* The basic setup for a Vulkan project, including the swapchain, physical device, logical device, and the pipelines described above.
-* Structs for some of the uniform buffers you will be using.
-* Some buffer creation utility functions.
-* A simple interactive camera using the mouse.
-
-You need to implement the following features/pipeline stages:
-
-* Compute shader (`shaders/compute.comp`)
-* Grass pipeline stages
- * Vertex shader (`shaders/grass.vert')
- * Tessellation control shader (`shaders/grass.tesc`)
- * Tessellation evaluation shader (`shaders/grass.tese`)
- * Fragment shader (`shaders/grass.frag`)
-* Binding of any extra descriptors you may need
-
-See below for more guidance.
-
-## Base Code Tour
-
-Areas that you need to complete are
-marked with a `TODO` comment. Functions that are useful
-for reference are marked with the comment `CHECKITOUT`.
-
-* `src/main.cpp` is the entry point of our application.
-* `src/Instance.cpp` sets up the application state, initializes the Vulkan library, and contains functions that will create our
-physical and logical device handles.
-* `src/Device.cpp` manages the logical device and sets up the queues that our command buffers will be submitted to.
-* `src/Renderer.cpp` contains most of the rendering implementation, including Vulkan setup and resource creation. You will
-likely have to make changes to this file in order to support changes to your pipelines.
-* `src/Camera.cpp` manages the camera state.
-* `src/Model.cpp` manages the state of the model that grass will be created on. Currently a plane is hardcoded, but feel free to
-update this with arbitrary model loading!
-* `src/Blades.cpp` creates the control points corresponding to the grass blades. There are many parameters that you can play with
-here that will change the behavior of your rendered grass blades.
-* `src/Scene.cpp` manages the scene state, including the model, blades, and simualtion time.
-* `src/BufferUtils.cpp` provides helper functions for creating buffers to be used as descriptors.
-
-We left out descriptions for a couple files that you likely won't have to modify. Feel free to investigate them to understand their
-importance within the scope of the project.
-
-## Grass Rendering
-
-This project is an implementation of the paper, [Responsive Real-Time Grass Rendering for General 3D Scenes](https://www.cg.tuwien.ac.at/research/publications/2017/JAHRMANN-2017-RRTG/JAHRMANN-2017-RRTG-draft.pdf).
-Please make sure to use this paper as a primary resource while implementing your grass renderers. It does a great job of explaining
-the key algorithms and math you will be using. Below is a brief description of the different components in chronological order of how your renderer will
-execute, but feel free to develop the components in whatever order you prefer.
-
-We recommend starting with trying to display the grass blades without any forces on them before trying to add any forces on the blades themselves. Here is an example of what that may look like:
-
-
-
-### Representing Grass as Bezier Curves
-
-In this project, grass blades will be represented as Bezier curves while performing physics calculations and culling operations.
-Each Bezier curve has three control points.
-* `v0`: the position of the grass blade on the geomtry
-* `v1`: a Bezier curve guide that is always "above" `v0` with respect to the grass blade's up vector (explained soon)
-* `v2`: a physical guide for which we simulate forces on
-
-We also need to store per-blade characteristics that will help us simulate and tessellate our grass blades correctly.
-* `up`: the blade's up vector, which corresponds to the normal of the geometry that the grass blade resides on at `v0`
-* Orientation: the orientation of the grass blade's face
-* Height: the height of the grass blade
-* Width: the width of the grass blade's face
-* Stiffness coefficient: the stiffness of our grass blade, which will affect the force computations on our blade
-
-We can pack all this data into four `vec4`s, such that `v0.w` holds orientation, `v1.w` holds height, `v2.w` holds width, and
-`up.w` holds the stiffness coefficient.
-
-
-
-### Simulating Forces
-
-In this project, you will be simulating forces on grass blades while they are still Bezier curves. This will be done in a compute
-shader using the compute pipeline that has been created for you. Remember that `v2` is our physical guide, so we will be
-applying transformations to `v2` initially, then correcting for potential errors. We will finally update `v1` to maintain the appropriate
-length of our grass blade.
-
-#### Binding Resources
-
-In order to update the state of your grass blades on every frame, you will need to create a storage buffer to maintain the grass data.
-You will also need to pass information about how much time has passed in the simulation and the time since the last frame. To do this,
-you can extend or create descriptor sets that will be bound to the compute pipeline.
-
-#### Gravity
-
-Given a gravity direction, `D.xyz`, and the magnitude of acceleration, `D.w`, we can compute the environmental gravity in
-our scene as `gE = normalize(D.xyz) * D.w`.
-
-We then determine the contribution of the gravity with respect to the front facing direction of the blade, `f`,
-as a term called the "front gravity". Front gravity is computed as `gF = (1/4) * ||gE|| * f`.
-
-We can then determine the total gravity on the grass blade as `g = gE + gF`.
-
-#### Recovery
-
-Recovery corresponds to the counter-force that brings our grass blade back into equilibrium. This is derived in the paper using Hooke's law.
-In order to determine the recovery force, we need to compare the current position of `v2` to its original position before
-simulation started, `iv2`. At the beginning of our simulation, `v1` and `v2` are initialized to be a distance of the blade height along the `up` vector.
-
-Once we have `iv2`, we can compute the recovery forces as `r = (iv2 - v2) * stiffness`.
-
-#### Wind
-
-In order to simulate wind, you are at liberty to create any wind function you want! In order to have something interesting,
-you can make the function depend on the position of `v0` and a function that changes with time. Consider using some combination
-of sine or cosine functions.
-
-Your wind function will determine a wind direction that is affecting the blade, but it is also worth noting that wind has a larger impact on
-grass blades whose forward directions are parallel to the wind direction. The paper describes this as a "wind alignment" term. We won't go
-over the exact math here, but use the paper as a reference when implementing this. It does a great job of explaining this!
-
-Once you have a wind direction and a wind alignment term, your total wind force (`w`) will be `windDirection * windAlignment`.
-
-#### Total force
-
-We can then determine a translation for `v2` based on the forces as `tv2 = (gravity + recovery + wind) * deltaTime`. However, we can't simply
-apply this translation and expect the simulation to be robust. Our forces might push `v2` under the ground! Similarly, moving `v2` but leaving
-`v1` in the same position will cause our grass blade to change length, which doesn't make sense.
-
-Read section 5.2 of the paper in order to learn how to determine the corrected final positions for `v1` and `v2`.
-
-### Culling tests
-
-Although we need to simulate forces on every grass blade at every frame, there are many blades that we won't need to render
-due to a variety of reasons. Here are some heuristics we can use to cull blades that won't contribute positively to a given frame.
-
-#### Orientation culling
-
-Consider the scenario in which the front face direction of the grass blade is perpendicular to the view vector. Since our grass blades
-won't have width, we will end up trying to render parts of the grass that are actually smaller than the size of a pixel. This could
-lead to aliasing artifacts.
-
-In order to remedy this, we can cull these blades! Simply do a dot product test to see if the view vector and front face direction of
-the blade are perpendicular. The paper uses a threshold value of `0.9` to cull, but feel free to use what you think looks best.
-
-#### View-frustum culling
-
-We also want to cull blades that are outside of the view-frustum, considering they won't show up in the frame anyway. To determine if
-a grass blade is in the view-frustum, we want to compare the visibility of three points: `v0, v2, and m`, where `m = (1/4)v0 * (1/2)v1 * (1/4)v2`.
-Notice that we aren't using `v1` for the visibility test. This is because the `v1` is a Bezier guide that doesn't represent a position on the grass blade.
-We instead use `m` to approximate the midpoint of our Bezier curve.
-
-If all three points are outside of the view-frustum, we will cull the grass blade. The paper uses a tolerance value for this test so that we are culling
-blades a little more conservatively. This can help with cases in which the Bezier curve is technically not visible, but we might be able to see the blade
-if we consider its width.
-
-#### Distance culling
-
-Similarly to orientation culling, we can end up with grass blades that at large distances are smaller than the size of a pixel. This could lead to additional
-artifacts in our renders. In this case, we can cull grass blades as a function of their distance from the camera.
-
-You are free to define two parameters here.
-* A max distance afterwhich all grass blades will be culled.
-* A number of buckets to place grass blades between the camera and max distance into.
-
-Define a function such that the grass blades in the bucket closest to the camera are kept while an increasing number of grass blades
-are culled with each farther bucket.
-
-#### Occlusion culling (extra credit)
-
-This type of culling only makes sense if our scene has additional objects aside from the plane and the grass blades. We want to cull grass blades that
-are occluded by other geometry. Think about how you can use a depth map to accomplish this!
-
-### Tessellating Bezier curves into grass blades
-
-In this project, you should pass in each Bezier curve as a single patch to be processed by your grass graphics pipeline. You will tessellate this patch into
-a quad with a shape of your choosing (as long as it looks sufficiently like grass of course). The paper has some examples of grass shapes you can use as inspiration.
-
-In the tessellation control shader, specify the amount of tessellation you want to occur. Remember that you need to provide enough detail to create the curvature of a grass blade.
-
-The generated vertices will be passed to the tessellation evaluation shader, where you will place the vertices in world space, respecting the width, height, and orientation information
-of each blade. Once you have determined the world space position of each vector, make sure to set the output `gl_Position` in clip space!
-
-** Extra Credit**: Tessellate to varying levels of detail as a function of how far the grass blade is from the camera. For example, if the blade is very far, only generate four vertices in the tessellation control shader.
-
-To build more intuition on how tessellation works, I highly recommend playing with the [helloTessellation sample](https://github.com/CIS565-Fall-2018/Vulkan-Samples/tree/master/samples/5_helloTessellation)
-and reading this [tutorial on tessellation](http://in2gpu.com/2014/07/12/tessellation-tutorial-opengl-4-3/).
-
-## Resources
-
-### Links
-
-The following resources may be useful for this project.
-
-* [Responsive Real-Time Grass Grass Rendering for General 3D Scenes](https://www.cg.tuwien.ac.at/research/publications/2017/JAHRMANN-2017-RRTG/JAHRMANN-2017-RRTG-draft.pdf)
-* [CIS565 Vulkan samples](https://github.com/CIS565-Fall-2018/Vulkan-Samples)
-* [Official Vulkan documentation](https://www.khronos.org/registry/vulkan/)
-* [Vulkan tutorial](https://vulkan-tutorial.com/)
-* [RenderDoc blog on Vulkan](https://renderdoc.org/vulkan-in-30-minutes.html)
-* [Tessellation tutorial](http://in2gpu.com/2014/07/12/tessellation-tutorial-opengl-4-3/)
-
-
-## Third-Party Code Policy
-
-* Use of any third-party code must be approved by asking on our Google Group.
-* If it is approved, all students are welcome to use it. Generally, we approve
- use of third-party code that is not a core part of the project. For example,
- for the path tracer, we would approve using a third-party library for loading
- models, but would not approve copying and pasting a CUDA function for doing
- refraction.
-* Third-party code **MUST** be credited in README.md.
-* Using third-party code without its approval, including using another
- student's code, is an academic integrity violation, and will, at minimum,
- result in you receiving an F for the semester.
-
-
-## README
-
-* A brief description of the project and the specific features you implemented.
-* GIFs of your project in its different stages with the different features being added incrementally.
-* A performance analysis (described below).
-
-### Performance Analysis
-
-The performance analysis is where you will investigate how...
-* Your renderer handles varying numbers of grass blades
-* The improvement you get by culling using each of the three culling tests
-
-## Submit
-
-If you have modified any of the `CMakeLists.txt` files at all (aside from the
-list of `SOURCE_FILES`), mentions it explicity.
-Beware of any build issues discussed on the Google Group.
-
-Open a GitHub pull request so that we can see that you have finished.
-The title should be "Project 6: YOUR NAME".
-The template of the comment section of your pull request is attached below, you can do some copy and paste:
-
-* [Repo Link](https://link-to-your-repo)
-* (Briefly) Mentions features that you've completed. Especially those bells and whistles you want to highlight
- * Feature 0
- * Feature 1
- * ...
-* Feedback on the project itself, if any.
diff --git a/bin/Release/vulkan_grass_rendering.exe b/bin/Release/vulkan_grass_rendering.exe
index f68db3a91c330e7ff4ac45238adcfedf2f35e64a..adb6cfb0edd346fda054859251d901bb3e205562 100644
GIT binary patch
literal 285696
zcmd?S3wTu3wZK2gOdveZq!Pu7HR`Cr_=rX;7_2j72F}1lqksfO#T$!IQ79x8lt0bgf~4+MpT*ZhBLpP4)mtoOVB`+fiK
z`{&Ed*=Il2UVH7e*Is+=wf7X?xXj^nI2xziUwWmVVXHyzy&^uWJgc^kK~psOP#Sd0s!gY?{<{qL!5e9FE%;_i~*5
z(Bn6!^6YV(<>;3_(Cv6C-QjqHM)T+TZ^CXB^r{#M6V*#abv+$1C@aL}&*_*_l`51h
zORNnf^^knY7zsLFJK5zJFBPnCIa=je>2eG?T~d;Nt6Yvf1Y5T_9Ya!a$9rz2mldMP
z#8|pxR-fZ#wBs%+|MA>%g0DT9Y^St6*^X4H9EW4dMYC_et^78JP`x5tF4tjWPZoK3n0_K1k-s67483mJZv5j5Uw>!+JT(t?HW1+|gy>Cwraxw^4UH#S>uWK!7JqerVf5#Z?I
zk77Q}?eb_@u3iK}9=Dbi>g6T~W?GiNSB{F!m)QJ};AEVl8%@Q9Rz*fAudZ!Kv9XS)
z<@jwna7i|=@dllniu2Y5jn}PDev|H47Bbcs8;wEZ4XOX!-c)Mz)}0LyE8lmk?-t+9
zzR9=Va#Ou^8mOg+#Zx!dPJmiMDf7u;v|g|JbOl35Zw#~u$@FMxjy7~wlQwkj8oxHw
z`y^lbqkNS__$KELM9en!#=oU=3;xcuQ{;Hqi@iR>3>6#!#o
zIzP5Apxsi(*W|T)OMEZs+B
zX;VPUtqo`mv0c)b1_?k+;tD#vS6|YKU|MobLCMF?`<0+$Y7Wp5dBbuZfV~~iU#WCToDf;m7o@wQ$
zYq^1CT2?xA8R_P041;z|z8>~_rg+;1hRnb+yK@&FV#I{MNYiR=XYe!zT2;R{20ma!
zIsDNDpXz3~m7s1KP4WupYCN*9uWsw*%jh1Ao+z_R5
zUXaXw^V)R3IXXu-Hd%MWTx6EXCS-4XJjm|`j{Mf&T|LWosz&F1G{MLUD|0gGce_<#5o->|IN?zklnexnxTt=@RWkw5TTK=JeKhw&?6Mr+@DO1NH|X`R<2u~iaVIurZ$NEC*&p6^Wj?5yr!g=wuvIul!ZBno$0
zi#ijZ>5(WLY)!TkH(R}@gW3N2wDN&3w38q++>{!{a*et{17(uC)n*ahsFKEX@(b^R
zV)u8cxa%DP!3i@wZarG=87$O;yS@x61`8VPI{E@^c8PA>kYuxOXM-OKo7Gnfp)b;F
zKklVFkLb1U^LR&(E@WDt;Tfh!Z*dFS`MOcAaL>6F4!rYe#es~uPTYhc_2_s(4W&kA
z=^omQ^zF2eJ&zjmP-BMcwTWKVjfz5hM7B%`8L+u=5~>5*gjM%TXjW`&3K@_MJz>3I
zF->U*jIsEah^!6NfIc=LrIRmchC)radSSyQcelz6T+LMoS9TCBRB#_m(<({&gGgb-FnY
z&1%4PtEBh(6*TM7zIt>FQF^AePLf=ZWLA@!tkYoy}{1j5u@t{gb)5Eoy@wb*8(_&$oOqXQ)lkwn%
zNoB9v^Q4M-$>U%mU^>^0XFZt&0|h7~sCttF(K*X~MjS0+QPGpkfu;Rbft|tVxJLug
zq7|e+Vf~sVnDisdfzpt%8Hr`heJjmT6Vqy*QQ6m9KT}yw37OTNWh$!4x|S@uk$PWm
zFD@A39zS0fg!mdJlWqpttphA*jpd#dc2U2v&dSiG^m;mAn00Db{W&3Hlhps_n^J$p
zjbyP7QaEJ5kWDDoPHU}g{P%(C6iGOaVqr%O}a>YdPiv188gw9^qnW8KKeWPNLE-H5S@xuQ%D
z(~aL%f=IFPrBEc-_q-SkM9z`u4H*X|HV4%pWb6urJFR`X72dB~#|8x6X#-6{i3DZCxaK&r6y6q)=+U{=5^PVsCk3+XKAhR1A@B2N+1O2@dAG`{Z*0+y7Dqj^y(?Z%%H6ft3uV#B&$cYZY;5G
zO5&nkXUU|mmJ)$V%FH^SGL3;sDJt=ES(rqu%ezVhS_L~ri;z(tir&>qb9h*xXvH3D
za4MsfNr>p>d>-TTgir=;>#nB@wgNIn6a3M;o@FhyMyevAiBC&oV3`;ItYxPOSwK3l
z48HN16Vj}T9chk&twM!4cA_<%7x;w~bZS#HEYprKjNQRPW4-7T0};32D#1o;&*U2xwNxK9aOaOoh^R>{;t
z$(<6jSFrnn=(iH`+D81F67{*FCtoZ^AZL<_4IjvAsPr?w+#i6&Q3`(0Kw!VbyiZj}
zpY-uSNc-Sa=AZ;Gx5s1UjesfFZVI&{YYYlL%aiulG;$0hnFu{{F1+Jg4R$wfi~^|!lXR}
z;E!4!?Zm?h(!sEdunU0>>ZgCRZgZ0f_-{*Ls^1Ny-A@7aH9l`k&K3e2BopDC0!jk1
zm{o9g$pExLbO;DQLAF|zPb)pdD_E@68rDimiyagQrSGL6P>9qtJ;~Qi
zkMdO(5uzsvo{N|jiYsbEROGMFJ4I`xu235)=d%z`ihb;bm;})vt3Hh(^f3)utd*n)
zN^A#K!W|Nx>q2UK#Tw-HW)jrJc38p$Ftk)`hf^Ya&A`aVIQogCmwWQbJ9(W%%yt1`
z@=;>vdvYY=N_js(>(oG{E2NJbMY3y?_>>BF)>&t=G?v^0e)5EvhjK+8-qK2-bClRJ
zjOa=45-o#xQc)&g*8-==Mc^=jLZ170&T)}G8CfKAfSs=iJm7q7ayzjY%O*Jq!$V1Q
z-mp=bB+okQm#j|(1DQqQd_=k_rrRV?n2(MSSu5eg^2Mx?`=tc-$&jWB3BM`0@dQDs
zXB`%*>1`xdTjIbus(iEg*
zsW+k9RA@9KIP0E4WU80k`?ZNQEo-J*UOuN&n25BjMbameM4Dt>n&
zad(kR%iRnb?y*7&Wj__J*+PGBmgW*ja_AzvV0QB#=$zbFNu0cO9~?r?4ggGQmM^9W
zTR43J5MdhB4<-F&GDqW>^d=N}M?@r~L(@Vb(k5-EkXTtK#R(h|Ffv>ezsdxsRG=M1
zPge8J$HKB?ZU-|#vq5v;BLi)6+!nNxsJ2vwG0aXs?1tLoJtHJ|P`XOqSr5WaV4iim
z=Q7QGhnrByGfZ<|4IK6~@{^ofFO31vr&=zP$$Mx~+qH)6%ycqt5xJWtNb1IkL9k{N09uGa7__;1u2Hu88wVwqvz
zP?e}W?*dQ_+c#vWk}T}p-mL-1i5_^%`%W98=!;6aK~m6zhBG{u$uJlGmDkChVf6Jz
z3Eu7*LGX2k{9xT^fJk(g`;gtd1kH0xFENfA66et*r94^`Sf{8&%Ewgk6(0!TK1wbc
zy^t1PZ8!W{T8*|sZ+&6+)_e38bKiEl;wz;+0OBxs(E6@9QBa-~Q*E_%4q+v&;Vbl=
zwNQP7qS8LWOGf)7>Eq8OAhL-;Oh~4DR0KlrgRBw-iXiLBDjhCUOsS~Kr3XnLw@O07
z{)jxA0!MgC>!CzK`txA2X=rhy^Qq>(RxN83GGY!ZiylU2hKw5M$Rn>3A)U4j3E1*v
zF!Cg4f*9b;X@5Yhh)I#DZwE4kc{bzsLsARvQ>Zzk>2Z4i#Fm6NJoL0VxTnD5DDuR$%2{pOg(eskn9;Ag){
zOSOrgk*Ai|0o!=x`LWcm3r6S?h&wmD^x0Oz&4d|yAFzVTnp!Hkrjf$(BJ1wCbgp~U
zWJFU&RG>)WWb2ooiCJJ%(0u$+FtWm!itJrd-}8c^G9$3a6{8NX4r@fSEOz?|s7x)3
z^)eFF4NbCwZi&kk?NMTe5d(v`!7|I|m6%duN+f0)F;gUFE-|xMIiDgc=jcp(3Kk|{
z6berbQ+%wrO!h2pxwUg0owV->R%$y{*_Ew^ezuuhHy#qgTaPp;(|bSbugL@&LYj1s
zH93{`V2?B@he0m?rugM#=;T@K-BPM^k={8U&K*2~9bVa&g@0GE>W6nNrZ?{n82H^&
zlMGx_Nnv_M@u=*%BIipV6gEZP*ULtFzVI9yd<2IPEtv-#U;|prb6zq(|AdOnQiV_n
z>Ba1oY+LWsZf#2S4P`R^M4Z~T)Us3&f$b64`?Q;DQDL4TT^kzmln`!AhG!A}t%8-M
z5M;=BQDo+-Wb9Xjmn6ee2v1SrKqbKn6)au`fP3xO6|y~OZ9I^W^~_ZRh?M5$FcK?u
zV+W8OOjg!kN!KwWo5e8ZsbZlZI`>8$NW
z>%4n;XDsO@yienO3h#_0osnc#N`(xj5i{(;BpfMITF|(UQJH(6tlx@S8BCoc$!2le
z-jqvjC~)Hie2p2QbaeMmhVk+rIrQc_Ws2f$HcBG)C_?w
zc2TLUzbvrX$fuO;JiziGiIB1%CD9$9Dk*4nVkGM@&@JVm?1Z^H$)@y)oj{dNQNTof
zowN;N4Ux*$O762rlfdK_sh*cQN-9m7A?=
zp^vmo$RYhLla7Lv%L9BfCFfTnM`w{^o4knvnngL9UhZ-8!perWKsXvK#U^9cLTUEW
zEYU_nR6%o;;|oh3(V^vC_~c$`kg&mg&oChZ2m+FdXze6MEU2ng6Z=JW%fYul_)0wp
z6F5bhr5YeM1Q`OI4alSt_XxG>6(NtsnD>za+>%zjLtgZJN%<<(Du9)M21rh}$epE1
zPbLc-PGM;h>&7}7j&lkz%H{^1qJeBsbyK|b3s93ao7mr^kWT0$DR1|_Ov*HuB3}^_
z_R=t?@hWuid;EftV4zlzVCl|CTh4^V2%I5|z@iTdOeX&Od~TP4R;qaE11(pi0#Wp+
zjhXbzCS1}m_N7j~v)tXe0%ZyS9@EXyj^oqaVM;)D^oN=TGK
zz*}TRj6|4pP^MI2T1*Z!C>H}8fyti!BCDYfYWk~~*aW%x3?Go&Dqm6*9&pbPG1{b)*vcYKP3|IpCt+vBoF^e=7ZuSyNtQfn;-P2*G;wd2
zSg{1CX-Hl^5kP1Klp=)~_gVrHt3a=pQfpPeQc4*G%Oa9^o@5n$Tm{xqfwKSAlk28O
z$?x7sNKJuK0fud{2{GSY>6ADjPdlJ{i+RO$74Mm2;T5Z50#4z;v!OZOrxtpMj!!5JS!LrKk>;rwo;otvkGyV&!M~jrA#~
zh9)cilv1V{D&kJ#<{rx_A*_+nP^V1xL
z>(TB`0J`DJOyyPOjk@A8bj9WuP*G5+n)Jjuxp*AfwQbnoTchF==j7RuB>%cw@`hA>
z_&25e5o*~F?&$@9Kf>WzqH^{ivk<8-IdI0bt_W0KIa0LK1(1zuTam>JF;YpWrz7
zTyi{oX4pWAy8{tViPZkIaxk6Y=}6k-SabYjKx)yP2pJ0&8E=M+Ki&_`3by);c3CK!
z#rONL%b6oftsI~mfjff6rs&Q8Rq$3c@S+iz84bMB7`R{jxElk%6{1wGTeq7iFwA;QZE7nghMZz!gY3pW
z42$4IaFf*cPm+rbmxq!;+l$~8Qdw~(L`gp7Haf6sZ7ayBy;||)y;-~ndi_dzRuuSW
z-w|~_JFq?FMbLb=?L~0tkyMrk?JQ??X8CW)a?GEtUke%NqQ-v7F0$Py3Sz-%(PMm`
zph@F-%6n6=v8YuMTb2z%zUa7BtmURi96lT`1)^hH$UmQaY(Fz}n-44MtL2ugb7kRZ
z?S5Vn<8%feJZdbl{Wxg*X;W0&1tV$kjAV0it-7~Wi^siTw>a0@eizM2@tf`ZZ9eT;
zBYj=u*0{el8C)bqB$yN
z!VWzen1<)bR9#z$Uv=@Sy;yx>Kx=9Yye4^Zy%s_xTHuas0THcep-d^ko!&^rjy6qy
z6qJBdOq@SshgztUV~Q;AMi7`KL{)t00uXsuSnn?t0_+iSnQcrcwdGLWgef4B$bOv7
z6BVc-;74i>^BE0(yf4sbS2otRrt4)p^qT!zHLgAQsEW^sasrXTfH7zrm@UIAPYD?1
zHuB+H(#M;vcMi&PJW^POTi{W=)K!`8hMI>MmvB01SnuDkE@DL}MgOx~QL94b*_6nB
ztr`!@t-5Kh00$)-T;w-uWc^t1mU5^wHb-k-Bh{!8S&N5BV~u1MK@qLl!FOZLvwRDQ
z{n39)Z~3GDit%WyS`6}%<~
zcqT}Tm(m#+&!j~yWC|LCJR!5Dl3e7s-dingPrfSp;fpfaGlNe#93jps)0B(Sc*^>X
z8caP>&Uknk0IXZjmeQM}fl8}9g}`{vv|?kU$d}83E!Ed6*57PhN0wqEAms%MaaFpJ
zEFpXnOZ>(r5kH(JpvGKWf)(7!%nmqy5Wabt?Lot+*bFP9q{6f{Ibb91R3(0lg5$g5
zFAyxFH9|@rneu3?ar5AxJ{ZiSv1Ul;yR7CLYc5N^3xCYuQ!Z`Kl>&iE@d29K7^o(T
z!-`_>qz#?EKGUq3{}ei)c0>P4vIwp<65t_(YE&=E=|{Z_7?L9PLyR8QFhD2)Y}#lG
zG~e@z5J?^f9ciz_x++zh)rSyub#V(opCHQ%&`c_LS{^bi6vOclW{WB=<3(7JN2@%P
z-%_+jxXR{M8MoFymoc8-K@>hENP}y$Cp4jUqP6_cve0`?=Xc*^hqk(9?8O8uc&x)7%*juD!);Q
zX%VwM+=&p`JC~7Unw3(?fbI01nf-W+2yHtmXPP}xU8%BRcCxHDRHk_=yeV1u^G>+IKFl)16G80H74(dZqpp;$F@@tMjRE(CspINnt_r`!%`Z?U5b`QrG
zydo6adJ_<$>(R$NLVZ2@l4llAp!tELOIl-~L>@I;D=rIn^sdNyQM_2mkQ2SxW8RzA
z=BE;^<`KJ8jydmWW56Tl`d*ab({^t7U~jEP+7<4|&}wE9Pyoo31JvlvImRLL#(7xE
z#Y1kgjLh5V<5C$(@-jyvtRm`fB5F?-j+CQN@
z=UNo{3!Wz8Sw1g8owbm!N$TZ&2cOo)zzQ`;#(afAuAmuJZ3QgrGZ`Tl0}wdqRTq*-
ztaY}kY?D=NzsrPKk{TXwSeL6*yQg#`*>gtm6k+V&PE?F71Q*8UC<6T3U=%L!r%{0)ZVJ?VR?(-hHeh_=*NWqXwH2P>OG|Wzqx^f}mqR=q6(@yX)>WXd&)BSb
zudROp-q08o!|l$B0U+XB(7UF&!s)}498MR0(2Z9^Wqb7K)1FFsqe3B>FdHg|wzLhv
zc#N{8`J^<;eEA8m)y|+;FC#Nt>r7;)FMy`e(SFHZ%|gpzERK-p*NsIC4~OHx)qW!u
zbsCG8NaTS6djlOBP>#)_Ok
z;pU1yx|#7wFGi6sU^M!|9qARP6SLz(VlMWD+tVw~O69t2H*u$_xPgJfCQ2HMD)Q4_rg~
zqF?(CwEGLKMH2$zo{o>s%GU!mTjv%9YMST%s4Gv0zp!P|C8SD@b-t>0^w>p@B`i}O%a
zLdFyJiARA=uZ7Sd=ZYKeEbR<=cNnK?EAf0>`A*RJE^gqV;qZsH^q-{Y=HFs;t-WS9
zU-F2KHg%cbxTD=?to0jLZ-Hv<^Lugp@q;!O-=EIM=X&C&ZP0n*2gc~H{KmD1Q6qC1
zJ2{DoZ;y%kznbMUN2f)5`wG|2_asKUjM3!1_R~h0?jXap9~1^03;OA00hjKqh4nrS
zCO9wINPn)I5-Qw3KPQR)&IQ<(H55~3|>#wKbk7f
z^l7X6NcrbYVo=%){)3%*BYyU(@izk|M!CVE=6jn@*SKa476|*527v%(sso@kfe~Cj;4vtdCCsR(M_}4Add0cQVkgcncJ4^$QDMLZ0HXcaq~*SmZ3}lq&;Zd_G_O
zuk{I0
z5)jQSuKA#R5HaDona(vbr!#A}2cjcbt2M-j%Np6txW7_~^;Jilq5y=5?9@LnBX&1W
za-M9mXRw@i%MovuGGrA#aY4h9b7VCMZRuWWP$%IyILWG?7KHNl>3MCU2IQbSb2Q({
zr+*$jKj;U(+TDYEre5i*s#8Z%r|)#kJlUcAF?@N=)3-Q&o{@TM@=vdI+||z!aK7oQ
zJv69lx7_#PGy8u}c-;(ElKI9V4qt8iAfIzjvc)0rqp^OK9DSTybqiW#E@;;
z+f%jM*kM_eHdULB_tv5yhiq$exKd$B2{e}tyAri4@G9C%fdE4z3Vl`k?*xY8FHm+(cLJ`o+o&UbCT9HIEqZlow=(sohQ#Eikd!xZ1G
zx8BlyKzr5cyVPYDRi9d{iCAU~*w2Eb09V**PYW>sC_y_@XSSAmRskzud@akpDWT{R
zPmK2vImN!kNkmlm6@*y9%@^dY>EdZ6GtU(Sj3SrV1*b7;Zs$3LVvmvO*C^-6tNH$d
zI+T=re_ov*-P{*W^shKAoEW@dsCmtsYi^h@VZwp9-`MM`{rn8Sb8p*8;e>m^K)X6EFTSQ1gKn`A__yYMQmkZ+Mnx
z**f(B)a6#~f%}Q_8yv`4xdC-ri`>IIy0;d&Tk?LdoBrLTJ#Zs&k|`)@J>mRNl_Tv!
z6##%oG93fJO`K>$eAqW?PGn!rHieMz7+2@k5G@lsV2un{CsBx|vMogd;*3Qwi)owiz)1xZ6?SkR=<(Hp>N@eZ9
z+L
0Nb!PJ27e4G_eOlI-
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