From 6b0cd6b15cdff4c77bd9eecb2e15f0c787f25842 Mon Sep 17 00:00:00 2001 From: Liam Boone Date: Fri, 2 Nov 2012 21:03:50 -0400 Subject: [PATCH 01/12] Updated to CUDA 4.2 for my system. --- PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj | 10 +- PROJ3_WIN/src/rasterizeKernels.cu.deps | 531 ++++++++++++++++++ src/freeglut.dll | Bin 0 -> 197120 bytes src/glew32.dll | Bin 0 -> 204800 bytes src/glut32.dll | Bin 0 -> 237568 bytes 5 files changed, 536 insertions(+), 5 deletions(-) create mode 100644 PROJ3_WIN/src/rasterizeKernels.cu.deps create mode 100644 src/freeglut.dll create mode 100644 src/glew32.dll create mode 100644 src/glut32.dll diff --git a/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj b/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj index 1077f39..8db78df 100755 --- a/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj +++ b/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj @@ -50,7 +50,7 @@ - + @@ -60,7 +60,7 @@ - true + false false @@ -72,7 +72,7 @@ Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include;C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common\inc;../shared/glew/include;../shared/freeglut/include;%(AdditionalIncludeDirectories) + C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include;C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc;../shared/glew/include;../shared/freeglut/include;%(AdditionalIncludeDirectories) Console @@ -85,7 +85,7 @@ $(ProjectDir)$(Platform)/$(Configuration)/%(Filename)%(Extension).obj - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include;C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.0/C/common/inc;../shared/glew/includes;../shared/freeglut/includes + C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include;C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C/common/inc;../shared/glew/includes;../shared/freeglut/includes @@ -115,6 +115,6 @@ - + \ No newline at end of file diff --git a/PROJ3_WIN/src/rasterizeKernels.cu.deps b/PROJ3_WIN/src/rasterizeKernels.cu.deps new file mode 100644 index 0000000..d51a46a --- /dev/null +++ b/PROJ3_WIN/src/rasterizeKernels.cu.deps @@ -0,0 +1,531 @@ +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda_runtime.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_config.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sal.h +c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vadefs.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\limits.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stddef.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\channel_descriptor.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\cuda_runtime_api.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\cuda_runtime_api.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\common_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\time.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wtime.inl +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\time.inl +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\math_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdlib.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cmath +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\yvals.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\use_ansi.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cstdlib +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\cuda_surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\channel_descriptor.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\cuda_texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\channel_descriptor.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\sm_11_atomic_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\sm_12_atomic_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\sm_13_double_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\sm_20_atomic_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\sm_20_intrinsics.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\sm_30_intrinsics.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\cuda_surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_fetch_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\builtin_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\driver_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\surface_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\cuda_texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\host_defines.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\texture_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_functions.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\device_launch_parameters.h +c:\program files\nvidia gpu computing toolkit\cuda\v4.2\include\vector_types.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdio.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\swprintf.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda.h +C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C/common/inc\cutil_math.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda_runtime.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/config.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/simple_defines.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/compiler.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/device_backend.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/host_device.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\host_defines.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/debug.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/config/compiler_fence.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\intrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\setjmp.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\immintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wmmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\nmmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\smmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\tmmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\pmmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\emmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\malloc.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mm3dnow.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/cstdint.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/discard_block_engine.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\iostream +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\istream +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ios +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xlocnum +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\climits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cstdio +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\streambuf +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xiosbase +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xlocale +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cstring +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdexcept +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstddef +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cstddef +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\eh.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\new +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\iosfwd +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cwchar +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wchar.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdbg.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\type_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\limits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ymath.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cfloat +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\float.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtwrn.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xtr1common +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxtype_traits +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\typeinfo +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xlocinfo +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xlocinfo.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ctype.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\locale.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xdebug +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\system_error +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cerrno +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\errno.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\share.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/random_core_access.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/discard_block_engine.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/linear_congruential_engine.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/linear_congruential_engine_discard.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/mod.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/linear_congruential_engine.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/linear_feedback_shift_engine.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/linear_feedback_shift_engine_wordmask.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/linear_feedback_shift_engine.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/subtract_with_carry_engine.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/subtract_with_carry_engine.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/xor_combine_engine.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/type_traits.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/type_traits/has_trivial_assign.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/xor_combine_engine_max.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/mpl/math.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/xor_combine_engine.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/uniform_int_distribution.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/pair.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/pair.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/detail/integer_traits.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/uniform_int_distribution.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/uniform_real_distribution.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/uniform_real_distribution.inl +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/normal_distribution.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/normal_distribution.inl +c:\users\liam\documents\github\project3-rasterizer\src\rasterizeKernels.h +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda.h +C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C/common/inc\cutil_math.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cassert +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\assert.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/type.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec1.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle_func.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec1.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_trigonometric.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_trigonometric.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_exponential.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_exponential.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_common.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_common.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_packing.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_packing.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_geometric.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_geometric.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_matrix.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_matrix.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_vector_relational.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_vector_relational.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_integer.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_integer.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_noise.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_noise.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\rasterizeTools.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\utilities.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap1 +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xxshared +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\iterator +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sstream +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfunctional +c:\users\liam\documents\github\project3-rasterizer\src\cudaMat4.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda_runtime.h +c:\users\liam\documents\github\project3-rasterizer\src\cudaMat4.h diff --git a/src/freeglut.dll b/src/freeglut.dll new file mode 100644 index 0000000000000000000000000000000000000000..4ec8893337649be4b2e91c4b5fe937da2578b9ca GIT binary patch literal 197120 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 V1fmE;5r`rXMIeem6oLOm;9p!SggyWO literal 0 HcmV?d00001 diff --git a/src/glut32.dll b/src/glut32.dll new file mode 100644 index 0000000000000000000000000000000000000000..106646ff710941b60525ad3ee9bd68dc2a27b667 GIT binary patch literal 237568 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 literal 0 HcmV?d00001 From cf149db0005f4641157bf0c5bb22bf1ad0aea40d Mon Sep 17 00:00:00 2001 From: Liam Boone Date: Sat, 3 Nov 2012 03:59:36 -0400 Subject: [PATCH 02/12] Psychedelic Cow with backface culling, still Zfighting, perspective Tform is odd --- PROJ3_WIN/src/rasterizeKernels.cu.deps | 4 + src/rasterizeKernels.cu | 107 ++++++++++++++++++++++++- src/rasterizeKernels.h | 2 + 3 files changed, 110 insertions(+), 3 deletions(-) diff --git a/PROJ3_WIN/src/rasterizeKernels.cu.deps b/PROJ3_WIN/src/rasterizeKernels.cu.deps index d51a46a..6728478 100644 --- a/PROJ3_WIN/src/rasterizeKernels.cu.deps +++ b/PROJ3_WIN/src/rasterizeKernels.cu.deps @@ -442,6 +442,10 @@ c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_noise.hpp c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_noise.inl c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm/gtc/matrix_transform.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\gtc\../glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\gtc\matrix_transform.inl c:\users\liam\documents\github\project3-rasterizer\src\rasterizeTools.h c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index 826ec80..a187e6d 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -130,9 +130,21 @@ __global__ void sendImageToPBO(uchar4* PBOpos, glm::vec2 resolution, glm::vec3* } //TODO: Implement a vertex shader -__global__ void vertexShadeKernel(float* vbo, int vbosize){ +__global__ void vertexShadeKernel(float* vbo, int vbosize, glm::mat4 mM, glm::mat4 vM, glm::mat4 pM){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if(index= 0 && lambdaB >= 0 && lambdaA + lambdaB <= 1 ) + { + float depth = primitives[index].p0.z*lambdaA + + primitives[index].p1.z*lambdaB + + primitives[index].p2.z*(1-lambdaA-lambdaB); + if( depth > depthbuffer[(int)(x+resolution.x*y)].position.z ) + { + depthbuffer[(int)(x+resolution.x*y)].position.z = depth; + depthbuffer[(int)(x+resolution.x*y)].color = primitives[index].c0*lambdaA + + primitives[index].c1*lambdaB + + primitives[index].c2*(1-lambdaA-lambdaB); + } + } + } + } } } @@ -157,6 +247,7 @@ __global__ void fragmentShadeKernel(fragment* depthbuffer, glm::vec2 resolution) int y = (blockIdx.y * blockDim.y) + threadIdx.y; int index = x + (y * resolution.x); if(x<=resolution.x && y<=resolution.y){ + } } @@ -175,6 +266,14 @@ __global__ void render(glm::vec2 resolution, fragment* depthbuffer, glm::vec3* f // Wrapper for the __global__ call that sets up the kernel calls and does a ton of memory management void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize){ + + glm::mat4 modelMatrix = glm::rotate( glm::mat4(1.0f), frame/3, glm::vec3( 0, 1, 0 ) ); + glm::mat4 projectionMatrix = glm::scale( + glm::translate( + glm::perspective( 45.0f, resolution.x/resolution.y, 0.1f, 100.0f ), + glm::vec3(resolution, 0.0f)),glm::vec3(-resolution,1.0f)); + glm::mat4 viewMatrix = glm::lookAt( glm::vec3( 0, 0, 1 + frame/100 ), glm::vec3( 0, 0, 0 ), glm::vec3( 0, 1, 0 ) ); + // set up crucial magic int tileSize = 8; dim3 threadsPerBlock(tileSize, tileSize); @@ -221,7 +320,7 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* //------------------------------ //vertex shader //------------------------------ - vertexShadeKernel<<>>(device_vbo, vbosize); + vertexShadeKernel<<>>(device_vbo, vbosize, modelMatrix, viewMatrix, projectionMatrix); cudaDeviceSynchronize(); //------------------------------ @@ -237,10 +336,12 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* rasterizationKernel<<>>(primitives, ibosize/3, depthbuffer, resolution); cudaDeviceSynchronize(); + checkCUDAError("Rasterizer"); //------------------------------ //fragment shader //------------------------------ fragmentShadeKernel<<>>(depthbuffer, resolution); + checkCUDAError("Frag Shader"); cudaDeviceSynchronize(); //------------------------------ diff --git a/src/rasterizeKernels.h b/src/rasterizeKernels.h index bef3653..5f9696b 100755 --- a/src/rasterizeKernels.h +++ b/src/rasterizeKernels.h @@ -10,6 +10,8 @@ #include #include #include "glm/glm.hpp" +#include "glm/gtc/matrix_transform.hpp" + void kernelCleanup(); void cudaRasterizeCore(uchar4* pos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize); From b81866952f622e211133d6354c35f808b5a7b65d Mon Sep 17 00:00:00 2001 From: Liam Boone Date: Sat, 3 Nov 2012 18:19:57 -0400 Subject: [PATCH 03/12] started adding in locks --- src/rasterizeKernels.cu | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index a187e6d..74f378e 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -14,6 +14,7 @@ fragment* depthbuffer; float* device_vbo; float* device_cbo; int* device_ibo; +int* lock; triangle* primitives; void checkCUDAError(const char *msg) { @@ -83,11 +84,12 @@ __global__ void clearImage(glm::vec2 resolution, glm::vec3* image, glm::vec3 col } //Kernel that clears a given fragment buffer with a given fragment -__global__ void clearDepthBuffer(glm::vec2 resolution, fragment* buffer, fragment frag){ +__global__ void clearDepthBuffer(glm::vec2 resolution, fragment* buffer, fragment frag, int* lock){ int x = (blockIdx.x * blockDim.x) + threadIdx.x; int y = (blockIdx.y * blockDim.y) + threadIdx.y; int index = x + (y * resolution.x); - if(x<=resolution.x && y<=resolution.y){ + if(x<=resolution.x && y<=resolution.y){ + lock[index] = 0; fragment f = frag; f.position.x = x; f.position.y = y; @@ -181,7 +183,7 @@ __global__ void primitiveAssemblyKernel(float* vbo, int vbosize, float* cbo, int } //TODO: Implement a rasterization method, such as scanline. -__global__ void rasterizationKernel(triangle* primitives, int primitivesCount, fragment* depthbuffer, glm::vec2 resolution){ +__global__ void rasterizationKernel(triangle* primitives, int primitivesCount, fragment* depthbuffer, int * lock, glm::vec2 resolution){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; if(index depthbuffer[(int)(x+resolution.x*y)].position.z ) + bool inLoop = true; + while( inLoop ) { - depthbuffer[(int)(x+resolution.x*y)].position.z = depth; - depthbuffer[(int)(x+resolution.x*y)].color = primitives[index].c0*lambdaA + - primitives[index].c1*lambdaB + - primitives[index].c2*(1-lambdaA-lambdaB); + if( depth > depthbuffer[(int)(x+resolution.x*y)].position.z ) + { + depthbuffer[(int)(x+resolution.x*y)].position.z = depth; + depthbuffer[(int)(x+resolution.x*y)].color = primitives[index].c0*lambdaA + + primitives[index].c1*lambdaB + + primitives[index].c2*(1-lambdaA-lambdaB); + } + inLoop = false; } } } @@ -286,6 +293,8 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* //set up depthbuffer depthbuffer = NULL; cudaMalloc((void**)&depthbuffer, (int)resolution.x*(int)resolution.y*sizeof(fragment)); + lock = NULL; + cudaMalloc((void**)&lock, (int)resolution.x*(int)resolution.y*sizeof(int)); //kernel launches to black out accumulated/unaccumlated pixel buffers and clear our scattering states clearImage<<>>(resolution, framebuffer, glm::vec3(0,0,0)); @@ -294,7 +303,7 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* frag.color = glm::vec3(0,0,0); frag.normal = glm::vec3(0,0,0); frag.position = glm::vec3(0,0,-10000); - clearDepthBuffer<<>>(resolution, depthbuffer,frag); + clearDepthBuffer<<>>(resolution, depthbuffer,frag,lock); //------------------------------ //memory stuff @@ -333,7 +342,7 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* //------------------------------ //rasterization //------------------------------ - rasterizationKernel<<>>(primitives, ibosize/3, depthbuffer, resolution); + rasterizationKernel<<>>(primitives, ibosize/3, depthbuffer, lock, resolution); cudaDeviceSynchronize(); checkCUDAError("Rasterizer"); From eec6c2a7f2a66666f0fe84640a57563de15d3f60 Mon Sep 17 00:00:00 2001 From: William Date: Sat, 3 Nov 2012 23:54:56 -0400 Subject: [PATCH 04/12] Fixed Zfighting, Working on lighting/expanding structs --- PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj | 1 + PROJ3_WIN/src/rasterizeKernels.cu.deps | 235 +++++++++--------- src/rasterizeKernels.cu | 79 +++--- src/rasterizeTools.h | 7 + 4 files changed, 168 insertions(+), 154 deletions(-) diff --git a/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj b/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj index 8db78df..2b0b484 100755 --- a/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj +++ b/PROJ3_WIN/565Rasterizer/565Rasterizer.vcxproj @@ -86,6 +86,7 @@ $(ProjectDir)$(Platform)/$(Configuration)/%(Filename)%(Extension).obj C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include;C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C/common/inc;../shared/glew/includes;../shared/freeglut/includes + compute_20,sm_20 diff --git a/PROJ3_WIN/src/rasterizeKernels.cu.deps b/PROJ3_WIN/src/rasterizeKernels.cu.deps index 6728478..64b6be3 100644 --- a/PROJ3_WIN/src/rasterizeKernels.cu.deps +++ b/PROJ3_WIN/src/rasterizeKernels.cu.deps @@ -230,6 +230,7 @@ c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\malloc.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h +c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ammintrin.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mm3dnow.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h @@ -334,124 +335,124 @@ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/un C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/uniform_real_distribution.inl C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/normal_distribution.h C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/normal_distribution.inl -c:\users\liam\documents\github\project3-rasterizer\src\rasterizeKernels.h +c:\users\wjboone\documents\github\project3-rasterizer\src\rasterizeKernels.h C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda.h C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C/common/inc\cutil_math.h -c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core/setup.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_detail.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/setup.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/_detail.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\setup.hpp c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cassert c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\assert.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/type.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec1.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle_func.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec1.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec2.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec2.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec3.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec3.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec4.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec4.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_trigonometric.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_trigonometric.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_exponential.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_exponential.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_common.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_fixes.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_common.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_packing.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_packing.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_geometric.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_geometric.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_matrix.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_matrix.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_vector_relational.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_vector_relational.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_integer.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_integer.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_noise.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_noise.inl -c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_swizzle.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm/gtc/matrix_transform.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\gtc\../glm.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\gtc\matrix_transform.inl -c:\users\liam\documents\github\project3-rasterizer\src\rasterizeTools.h -c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp -c:\users\liam\documents\github\project3-rasterizer\src\utilities.h -c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/type.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_half.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_half.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_half.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec1.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle_func.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec1.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec2.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec2.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec3.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec3.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec4.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec4.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_trigonometric.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_trigonometric.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_exponential.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_exponential.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_common.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_fixes.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_common.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_packing.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_packing.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_geometric.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_geometric.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_matrix.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_matrix.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_vector_relational.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_vector_relational.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_integer.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_integer.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_noise.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_noise.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/_swizzle.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm/gtc/matrix_transform.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\gtc\../glm.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\gtc\matrix_transform.inl +c:\users\wjboone\documents\github\project3-rasterizer\src\rasterizeTools.h +c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\utilities.h +c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap @@ -528,8 +529,8 @@ c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sstream c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfunctional -c:\users\liam\documents\github\project3-rasterizer\src\cudaMat4.h -c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\cudaMat4.h +c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda_runtime.h -c:\users\liam\documents\github\project3-rasterizer\src\cudaMat4.h +c:\users\wjboone\documents\github\project3-rasterizer\src\cudaMat4.h diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index 74f378e..9867985 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -132,7 +132,7 @@ __global__ void sendImageToPBO(uchar4* PBOpos, glm::vec2 resolution, glm::vec3* } //TODO: Implement a vertex shader -__global__ void vertexShadeKernel(float* vbo, int vbosize, glm::mat4 mM, glm::mat4 vM, glm::mat4 pM){ +__global__ void vertexShadeKernel(float* vbo, int vbosize, glm::mat4 mM, glm::mat4 vM, glm::mat4 pM, glm::mat4 sM){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; if(index depthbuffer[(int)(x+resolution.x*y)].position.z ) + if( atomicExch( &(lock[dIndex]), 1 ) == 0 ) { - depthbuffer[(int)(x+resolution.x*y)].position.z = depth; - depthbuffer[(int)(x+resolution.x*y)].color = primitives[index].c0*lambdaA + - primitives[index].c1*lambdaB + - primitives[index].c2*(1-lambdaA-lambdaB); + if( depth > depthbuffer[dIndex].position.z ) + { + depthbuffer[dIndex].position.x = x; + depthbuffer[dIndex].position.y = y; + depthbuffer[dIndex].position.z = depth; + depthbuffer[dIndex].color = primitives[index].c0*lambdaA + + primitives[index].c1*lambdaB + + primitives[index].c2*(1-lambdaA-lambdaB); + depthbuffer[dIndex].normal = norm; + } + inLoop = false; + atomicExch( &(lock[dIndex]), 0 ); } - inLoop = false; } } } @@ -249,12 +254,11 @@ __global__ void rasterizationKernel(triangle* primitives, int primitivesCount, f } //TODO: Implement a fragment shader -__global__ void fragmentShadeKernel(fragment* depthbuffer, glm::vec2 resolution){ +__global__ void fragmentShadeKernel(fragment* depthbuffer, glm::vec2 resolution ){ int x = (blockIdx.x * blockDim.x) + threadIdx.x; int y = (blockIdx.y * blockDim.y) + threadIdx.y; int index = x + (y * resolution.x); if(x<=resolution.x && y<=resolution.y){ - } } @@ -266,7 +270,7 @@ __global__ void render(glm::vec2 resolution, fragment* depthbuffer, glm::vec3* f int index = x + (y * resolution.x); if(x<=resolution.x && y<=resolution.y){ - framebuffer[index] = depthbuffer[index].color; + framebuffer[index] = depthbuffer[index].color; } } @@ -274,12 +278,13 @@ __global__ void render(glm::vec2 resolution, fragment* depthbuffer, glm::vec3* f void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize){ - glm::mat4 modelMatrix = glm::rotate( glm::mat4(1.0f), frame/3, glm::vec3( 0, 1, 0 ) ); - glm::mat4 projectionMatrix = glm::scale( - glm::translate( - glm::perspective( 45.0f, resolution.x/resolution.y, 0.1f, 100.0f ), - glm::vec3(resolution, 0.0f)),glm::vec3(-resolution,1.0f)); - glm::mat4 viewMatrix = glm::lookAt( glm::vec3( 0, 0, 1 + frame/100 ), glm::vec3( 0, 0, 0 ), glm::vec3( 0, 1, 0 ) ); + glm::mat4 modelMatrix = glm::rotate( glm::mat4(1.0f), frame, glm::vec3( 0, 1, 0 ) ); + glm::mat4 projectionMatrix = glm::perspective( 45.0f, resolution.x/resolution.y, 0.1f, 100.0f ); + glm::mat4 screenMatrix = glm::mat4(1.0f); + screenMatrix = glm::scale( screenMatrix, glm::vec3( resolution, 1.0f ) ); + screenMatrix = glm::translate( screenMatrix, glm::vec3( 0.5, 0.5, 0 ) ); + screenMatrix = glm::scale( screenMatrix, -glm::vec3( 0.5, 0.5, 1 ) ); + glm::mat4 viewMatrix = glm::lookAt( glm::vec3( 0, 0, 2 ), glm::vec3( 0, 0, 0 ), glm::vec3( 0, 1, 0 ) ); // set up crucial magic int tileSize = 8; @@ -329,14 +334,14 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* //------------------------------ //vertex shader //------------------------------ - vertexShadeKernel<<>>(device_vbo, vbosize, modelMatrix, viewMatrix, projectionMatrix); + vertexShadeKernel<<>>(device_vbo, vbosize, modelMatrix, viewMatrix, projectionMatrix, screenMatrix); cudaDeviceSynchronize(); //------------------------------ //primitive assembly //------------------------------ primitiveBlocks = ceil(((float)ibosize/3)/((float)tileSize)); - primitiveAssemblyKernel<<>>(device_vbo, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives); + primitiveAssemblyKernel<<>>(device_vbo, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame); cudaDeviceSynchronize(); //------------------------------ diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index e9b5dcc..0eff0ef 100755 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -9,6 +9,12 @@ #include "utilities.h" #include "cudaMat4.h" +struct vertex { + glm::vec3 position; + glm::vec3 color; + glm::vec3 lightdir; +} + struct triangle { glm::vec3 p0; glm::vec3 p1; @@ -22,6 +28,7 @@ struct fragment{ glm::vec3 color; glm::vec3 normal; glm::vec3 position; + glm::vec3 lightdir; }; //Multiplies a cudaMat4 matrix and a vec4 From 0bb135f2cc5c00de520aedc993eb6760495b31fd Mon Sep 17 00:00:00 2001 From: William Date: Sun, 4 Nov 2012 20:40:18 -0500 Subject: [PATCH 05/12] Working on lighting --- src/rasterizeKernels.cu | 98 +++++++++++++++++++++-------------------- src/rasterizeTools.h | 33 +++++++------- 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index 9867985..c9cb455 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -11,6 +11,7 @@ glm::vec3* framebuffer; fragment* depthbuffer; +vertex* device_vboFull; float* device_vbo; float* device_cbo; int* device_ibo; @@ -132,7 +133,7 @@ __global__ void sendImageToPBO(uchar4* PBOpos, glm::vec2 resolution, glm::vec3* } //TODO: Implement a vertex shader -__global__ void vertexShadeKernel(float* vbo, int vbosize, glm::mat4 mM, glm::mat4 vM, glm::mat4 pM, glm::mat4 sM){ +__global__ void vertexShadeKernel(float* vbo, int vbosize, vertex* vboFull, glm::mat4 mM, glm::mat4 vM, glm::mat4 pM, glm::mat4 sM){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; if(index= 0 && lambdaB >= 0 && lambdaA + lambdaB <= 1 ) + glm::vec3 barycoord = calculateBarycentricCoordinate( tri, glm::vec2( x, y ) ); + dIndex = dY + x; + if( isBarycentricCoordInBounds( barycoord ) ) { - float depth = primitives[index].p0.z*lambdaA + - primitives[index].p1.z*lambdaB + - primitives[index].p2.z*(1-lambdaA-lambdaB);//*/; + float depth = getZAtCoordinate( barycoord, tri ); bool inLoop = true; while( inLoop ) { @@ -238,10 +234,13 @@ __global__ void rasterizationKernel(triangle* primitives, int primitivesCount, f depthbuffer[dIndex].position.x = x; depthbuffer[dIndex].position.y = y; depthbuffer[dIndex].position.z = depth; - depthbuffer[dIndex].color = primitives[index].c0*lambdaA + - primitives[index].c1*lambdaB + - primitives[index].c2*(1-lambdaA-lambdaB); + depthbuffer[dIndex].color = tri.v0.color*barycoord.x + + tri.v1.color*barycoord.y + + tri.v2.color*barycoord.z; depthbuffer[dIndex].normal = norm; + depthbuffer[dIndex].lightdir = tri.v0.lightdir*barycoord.x + + tri.v1.lightdir*barycoord.y + + tri.v2.lightdir*barycoord.z; } inLoop = false; atomicExch( &(lock[dIndex]), 0 ); @@ -259,6 +258,7 @@ __global__ void fragmentShadeKernel(fragment* depthbuffer, glm::vec2 resolution int y = (blockIdx.y * blockDim.y) + threadIdx.y; int index = x + (y * resolution.x); if(x<=resolution.x && y<=resolution.y){ + depthbuffer[index].color *= ( float ) max( 0.0f, -glm::dot( glm::normalize( depthbuffer[index].normal ), glm::normalize( depthbuffer[index].lightdir ) ) ) + glm::vec3( 0.1f ); } } @@ -283,8 +283,8 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* glm::mat4 screenMatrix = glm::mat4(1.0f); screenMatrix = glm::scale( screenMatrix, glm::vec3( resolution, 1.0f ) ); screenMatrix = glm::translate( screenMatrix, glm::vec3( 0.5, 0.5, 0 ) ); - screenMatrix = glm::scale( screenMatrix, -glm::vec3( 0.5, 0.5, 1 ) ); - glm::mat4 viewMatrix = glm::lookAt( glm::vec3( 0, 0, 2 ), glm::vec3( 0, 0, 0 ), glm::vec3( 0, 1, 0 ) ); + screenMatrix = glm::scale( screenMatrix, -glm::vec3( 0.5, 0.5, -1 ) ); + glm::mat4 viewMatrix = glm::lookAt( glm::vec3( 0, 2, 2 ), glm::vec3( 0, 0, 0 ), glm::vec3( 0, 1, 0 ) ); // set up crucial magic int tileSize = 8; @@ -319,11 +319,14 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* device_ibo = NULL; cudaMalloc((void**)&device_ibo, ibosize*sizeof(int)); cudaMemcpy( device_ibo, ibo, ibosize*sizeof(int), cudaMemcpyHostToDevice); - + device_vbo = NULL; cudaMalloc((void**)&device_vbo, vbosize*sizeof(float)); cudaMemcpy( device_vbo, vbo, vbosize*sizeof(float), cudaMemcpyHostToDevice); + device_vboFull = NULL; + cudaMalloc((void**)&device_vboFull, vbosize/3*sizeof(float)); + device_cbo = NULL; cudaMalloc((void**)&device_cbo, cbosize*sizeof(float)); cudaMemcpy( device_cbo, cbo, cbosize*sizeof(float), cudaMemcpyHostToDevice); @@ -334,14 +337,14 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* //------------------------------ //vertex shader //------------------------------ - vertexShadeKernel<<>>(device_vbo, vbosize, modelMatrix, viewMatrix, projectionMatrix, screenMatrix); + vertexShadeKernel<<>>(device_vbo, vbosize, device_vboFull, modelMatrix, viewMatrix, projectionMatrix, screenMatrix); cudaDeviceSynchronize(); //------------------------------ //primitive assembly //------------------------------ primitiveBlocks = ceil(((float)ibosize/3)/((float)tileSize)); - primitiveAssemblyKernel<<>>(device_vbo, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame); + primitiveAssemblyKernel<<>>(device_vboFull, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame); cudaDeviceSynchronize(); //------------------------------ @@ -374,6 +377,7 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* void kernelCleanup(){ cudaFree( primitives ); cudaFree( device_vbo ); + cudaFree( device_vboFull ); cudaFree( device_cbo ); cudaFree( device_ibo ); cudaFree( framebuffer ); diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index 0eff0ef..45dca32 100755 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -13,15 +13,12 @@ struct vertex { glm::vec3 position; glm::vec3 color; glm::vec3 lightdir; -} +}; struct triangle { - glm::vec3 p0; - glm::vec3 p1; - glm::vec3 p2; - glm::vec3 c0; - glm::vec3 c1; - glm::vec3 c2; + vertex v0; + vertex v1; + vertex v2; }; struct fragment{ @@ -42,30 +39,30 @@ __host__ __device__ glm::vec3 multiplyMV(cudaMat4 m, glm::vec4 v){ //LOOK: finds the axis aligned bounding box for a given triangle __host__ __device__ void getAABBForTriangle(triangle tri, glm::vec3& minpoint, glm::vec3& maxpoint){ - minpoint = glm::vec3(min(min(tri.p0.x, tri.p1.x),tri.p2.x), - min(min(tri.p0.y, tri.p1.y),tri.p2.y), - min(min(tri.p0.z, tri.p1.z),tri.p2.z)); - maxpoint = glm::vec3(max(max(tri.p0.x, tri.p1.x),tri.p2.x), - max(max(tri.p0.y, tri.p1.y),tri.p2.y), - max(max(tri.p0.z, tri.p1.z),tri.p2.z)); + minpoint = glm::vec3(min(min(tri.v0.position.x, tri.v1.position.x),tri.v2.position.x), + min(min(tri.v0.position.y, tri.v1.position.y),tri.v2.position.y), + min(min(tri.v0.position.z, tri.v1.position.z),tri.v2.position.z)); + maxpoint = glm::vec3(max(max(tri.v0.position.x, tri.v1.position.x),tri.v2.position.x), + max(max(tri.v0.position.y, tri.v1.position.y),tri.v2.position.y), + max(max(tri.v0.position.z, tri.v1.position.z),tri.v2.position.z)); } //LOOK: calculates the signed area of a given triangle __host__ __device__ float calculateSignedArea(triangle tri){ - return 0.5*((tri.p2.x - tri.p0.x)*(tri.p1.y - tri.p0.y) - (tri.p1.x - tri.p0.x)*(tri.p2.y - tri.p0.y)); + return 0.5*((tri.v2.position.x - tri.v0.position.x)*(tri.v1.position.y - tri.v0.position.y) - (tri.v1.position.x - tri.v0.position.x)*(tri.v2.position.y - tri.v0.position.y)); } //LOOK: helper function for calculating barycentric coordinates __host__ __device__ float calculateBarycentricCoordinateValue(glm::vec2 a, glm::vec2 b, glm::vec2 c, triangle tri){ triangle baryTri; - baryTri.p0 = glm::vec3(a,0); baryTri.p1 = glm::vec3(b,0); baryTri.p2 = glm::vec3(c,0); + baryTri.v0.position = glm::vec3(a,0); baryTri.v1.position = glm::vec3(b,0); baryTri.v2.position = glm::vec3(c,0); return calculateSignedArea(baryTri)/calculateSignedArea(tri); } //LOOK: calculates barycentric coordinates __host__ __device__ glm::vec3 calculateBarycentricCoordinate(triangle tri, glm::vec2 point){ - float beta = calculateBarycentricCoordinateValue(glm::vec2(tri.p0.x,tri.p0.y), point, glm::vec2(tri.p2.x,tri.p2.y), tri); - float gamma = calculateBarycentricCoordinateValue(glm::vec2(tri.p0.x,tri.p0.y), glm::vec2(tri.p1.x,tri.p1.y), point, tri); + float beta = calculateBarycentricCoordinateValue(glm::vec2(tri.v0.position.x,tri.v0.position.y), point, glm::vec2(tri.v2.position.x,tri.v2.position.y), tri); + float gamma = calculateBarycentricCoordinateValue(glm::vec2(tri.v0.position.x,tri.v0.position.y), glm::vec2(tri.v1.position.x,tri.v1.position.y), point, tri); float alpha = 1.0-beta-gamma; return glm::vec3(alpha,beta,gamma); } @@ -79,7 +76,7 @@ __host__ __device__ bool isBarycentricCoordInBounds(glm::vec3 barycentricCoord){ //LOOK: for a given barycentric coordinate, return the corresponding z position on the triangle __host__ __device__ float getZAtCoordinate(glm::vec3 barycentricCoord, triangle tri){ - return -(barycentricCoord.x*tri.p0.z + barycentricCoord.y*tri.p1.z + barycentricCoord.z*tri.p2.z); + return -(barycentricCoord.x*tri.v0.position.z + barycentricCoord.y*tri.v1.position.z + barycentricCoord.z*tri.v2.position.z); } #endif \ No newline at end of file From 4af44d0b953e4e7611751c5ec914bf67981ac028 Mon Sep 17 00:00:00 2001 From: William Date: Sun, 4 Nov 2012 22:33:18 -0500 Subject: [PATCH 06/12] diffuse good, next up specular --- src/rasterizeKernels.cu | 34 +++++++++++++++++++++++----------- src/rasterizeTools.h | 1 + 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index c9cb455..9d550df 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -147,7 +147,7 @@ __global__ void vertexShadeKernel(float* vbo, int vbosize, vertex* vboFull, glm: vboFull[index].lightdir = ( glm::vec4( 10, 10, 10, 1 ) - v ).swizzle(glm::X, glm::Y, glm::Z); - v = sM*pM*vM*v; + //v = sM*pM*vM*v; vboFull[index].position = v.swizzle(glm::X, glm::Y, glm::Z); vboFull[index].position /= v.w; @@ -155,7 +155,7 @@ __global__ void vertexShadeKernel(float* vbo, int vbosize, vertex* vboFull, glm: } //TODO: Implement primative assembly -__global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize, triangle* primitives, int frame){ +__global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize, triangle* primitives, int frame, glm::mat4 vM, glm::mat4 pM, glm::mat4 sM ){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; int primitivesCount = ibosize/3; if(index>>(device_vboFull, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame); + primitiveAssemblyKernel<<>>(device_vboFull, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame, viewMatrix, projectionMatrix, screenMatrix); cudaDeviceSynchronize(); //------------------------------ @@ -375,6 +386,7 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* } void kernelCleanup(){ + cudaFree( lock ); cudaFree( primitives ); cudaFree( device_vbo ); cudaFree( device_vboFull ); diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index 45dca32..fd2df9c 100755 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -19,6 +19,7 @@ struct triangle { vertex v0; vertex v1; vertex v2; + glm::vec3 normal; }; struct fragment{ From 5bb82c1d62567eae62d38b6a9d43ccfd766282da Mon Sep 17 00:00:00 2001 From: William Date: Mon, 5 Nov 2012 21:44:54 -0500 Subject: [PATCH 07/12] switched to cudamat4 --- src/rasterizeKernels.cu | 109 ++++++++++++++++++++++++++-------------- src/rasterizeTools.h | 10 ++++ 2 files changed, 82 insertions(+), 37 deletions(-) diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index 9d550df..7f92b88 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -133,29 +133,35 @@ __global__ void sendImageToPBO(uchar4* PBOpos, glm::vec2 resolution, glm::vec3* } //TODO: Implement a vertex shader -__global__ void vertexShadeKernel(float* vbo, int vbosize, vertex* vboFull, glm::mat4 mM, glm::mat4 vM, glm::mat4 pM, glm::mat4 sM){ - int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if(index 0.2 ) + { + u = multiplyMV4( mM, v ); + } - //v = sM*pM*vM*v; + vboFull[index].lightdir = ( glm::vec4( lpos, 1 ) - v ).swizzle(glm::X, glm::Y, glm::Z); + + //v = sM*pM*vM*v; - vboFull[index].position = v.swizzle(glm::X, glm::Y, glm::Z); - vboFull[index].position /= v.w; - } + vboFull[index].position = v.swizzle(glm::X, glm::Y, glm::Z); + } } //TODO: Implement primative assembly -__global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize, triangle* primitives, int frame, glm::mat4 vM, glm::mat4 pM, glm::mat4 sM ){ +__global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize, triangle* primitives, int frame, cudaMat4 vM, cudaMat4 pM, cudaMat4 sM ){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; int primitivesCount = ibosize/3; if(index>>(device_vbo, vbosize, device_vboFull, modelMatrix, viewMatrix, projectionMatrix, screenMatrix); + vertexShadeKernel<<>>(device_vbo, vbosize, device_vboFull, model, glm::vec3(10,10,10)); cudaDeviceSynchronize(); //------------------------------ //primitive assembly //------------------------------ primitiveBlocks = ceil(((float)ibosize/3)/((float)tileSize)); - primitiveAssemblyKernel<<>>(device_vboFull, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame, viewMatrix, projectionMatrix, screenMatrix); - + primitiveAssemblyKernel<<>>(device_vboFull, vbosize, device_cbo, 3/*cbosize*/, device_ibo, ibosize, primitives, 0*(int)frame, view, projection, screen); + + checkCUDAError("Prim Assembler"); cudaDeviceSynchronize(); //------------------------------ //rasterization //------------------------------ rasterizationKernel<<>>(primitives, ibosize/3, depthbuffer, lock, resolution); - cudaDeviceSynchronize(); checkCUDAError("Rasterizer"); + cudaDeviceSynchronize(); //------------------------------ //fragment shader //------------------------------ diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index fd2df9c..5c431a6 100755 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -38,6 +38,16 @@ __host__ __device__ glm::vec3 multiplyMV(cudaMat4 m, glm::vec4 v){ return r; } +//Multiplies a cudaMat4 matrix and a vec4 +__host__ __device__ glm::vec4 multiplyMV4(cudaMat4 m, glm::vec4 v){ + glm::vec4 r(1,1,1,1); + r.x = (m.x.x*v.x)+(m.x.y*v.y)+(m.x.z*v.z)+(m.x.w*v.w); + r.y = (m.y.x*v.x)+(m.y.y*v.y)+(m.y.z*v.z)+(m.y.w*v.w); + r.z = (m.z.x*v.x)+(m.z.y*v.y)+(m.z.z*v.z)+(m.z.w*v.w); + r.w = (m.w.x*v.x)+(m.w.y*v.y)+(m.w.z*v.z)+(m.w.w*v.w); + return r; +} + //LOOK: finds the axis aligned bounding box for a given triangle __host__ __device__ void getAABBForTriangle(triangle tri, glm::vec3& minpoint, glm::vec3& maxpoint){ minpoint = glm::vec3(min(min(tri.v0.position.x, tri.v1.position.x),tri.v2.position.x), From bddfadf0fd50524c5ef522dc552292d72279f4a9 Mon Sep 17 00:00:00 2001 From: Liam Boone Date: Tue, 6 Nov 2012 18:19:31 -0500 Subject: [PATCH 08/12] Final --- PROJ3_WIN/src/rasterizeKernels.cu.deps | 231 ++++++++++++------------- src/main.cpp | 55 +++++- src/main.h | 2 + src/rasterizeKernels.cu | 109 +++++++++--- src/rasterizeKernels.h | 3 +- 5 files changed, 250 insertions(+), 150 deletions(-) diff --git a/PROJ3_WIN/src/rasterizeKernels.cu.deps b/PROJ3_WIN/src/rasterizeKernels.cu.deps index 64b6be3..d51a46a 100644 --- a/PROJ3_WIN/src/rasterizeKernels.cu.deps +++ b/PROJ3_WIN/src/rasterizeKernels.cu.deps @@ -230,7 +230,6 @@ c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\malloc.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h -c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ammintrin.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mm3dnow.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h @@ -335,124 +334,120 @@ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/un C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/uniform_real_distribution.inl C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/normal_distribution.h C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\thrust/random/detail/normal_distribution.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\rasterizeKernels.h +c:\users\liam\documents\github\project3-rasterizer\src\rasterizeKernels.h C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda.h C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C/common/inc\cutil_math.h -c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/setup.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/_detail.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\cassert c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\assert.h c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\crtdefs.h -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/type.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_half.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_half.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_detail.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_half.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\setup.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\setup.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_detail.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec1.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle_func.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec1.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec2.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec2.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec3.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec3.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec4.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_float.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_int.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_size.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_vec4.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_trigonometric.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_trigonometric.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_exponential.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_exponential.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_common.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_fixes.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_common.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_packing.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_packing.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_geometric.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_geometric.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_matrix.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_matrix.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_vector_relational.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_detail.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_vector_relational.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_integer.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_integer.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/func_noise.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core\func_noise.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\./core/_swizzle.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm/gtc/matrix_transform.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\gtc\../glm.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\gtc\matrix_transform.inl -c:\users\wjboone\documents\github\project3-rasterizer\src\rasterizeTools.h -c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\utilities.h -c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/type.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_half.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\setup.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec1.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle_func.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec1.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_float.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_int.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_size.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_vec4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_gentype.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat2x4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat3x4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x2.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x3.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\type_mat4x4.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_trigonometric.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_trigonometric.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_exponential.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_exponential.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_common.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_common.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_packing.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_packing.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_geometric.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_geometric.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_matrix.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_matrix.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_vector_relational.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_detail.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_vector_relational.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_integer.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_integer.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\_vectorize.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/func_noise.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core\func_noise.inl +c:\users\liam\documents\github\project3-rasterizer\src\glm\./core/_swizzle.hpp +c:\users\liam\documents\github\project3-rasterizer\src\rasterizeTools.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\utilities.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfwrap @@ -529,8 +524,8 @@ c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sstream c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\string c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xfunctional -c:\users\wjboone\documents\github\project3-rasterizer\src\cudaMat4.h -c:\users\wjboone\documents\github\project3-rasterizer\src\glm/glm.hpp -c:\users\wjboone\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp +c:\users\liam\documents\github\project3-rasterizer\src\cudaMat4.h +c:\users\liam\documents\github\project3-rasterizer\src\glm/glm.hpp +c:\users\liam\documents\github\project3-rasterizer\src\glm\core/_fixes.hpp C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include\cuda_runtime.h -c:\users\wjboone\documents\github\project3-rasterizer\src\cudaMat4.h +c:\users\liam\documents\github\project3-rasterizer\src\cudaMat4.h diff --git a/src/main.cpp b/src/main.cpp index dfb689a..f49f77c 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,6 +71,8 @@ int main(int argc, char** argv){ #else glutDisplayFunc(display); glutKeyboardFunc(keyboard); + glutMouseFunc(mouseClick); + glutMotionFunc(mouseDrag); glutMainLoop(); #endif @@ -82,6 +84,10 @@ int main(int argc, char** argv){ //---------RUNTIME STUFF--------- //------------------------------- +float azimuth = -90; +float zenith = -45; +float zoom = 0; + void runCuda(){ // Map OpenGL buffer object for writing from CUDA on a single GPU // No data is moved (Win & Linux). When mapped to CUDA, OpenGL should not use this buffer @@ -100,7 +106,7 @@ void runCuda(){ ibosize = mesh->getIBOsize(); cudaGLMapBufferObject((void**)&dptr, pbo); - cudaRasterizeCore(dptr, glm::vec2(width, height), frame, vbo, vbosize, cbo, cbosize, ibo, ibosize); + cudaRasterizeCore(dptr, glm::vec2(width, height), frame, vbo, vbosize, cbo, cbosize, ibo, ibosize, glm::vec3( azimuth, zenith, zoom ) ); cudaGLUnmapBufferObject(pbo); vbo = NULL; @@ -178,14 +184,47 @@ void runCuda(){ void keyboard(unsigned char key, int x, int y) { - switch (key) - { - case(27): - shut_down(1); - break; - } + switch (key) + { + case('['): + zoom -=0.01; + break; + case(']'): + zoom +=0.01; + break; + case(27): + shut_down(1); + break; + + } } - + + int buttonPress; + int old_X, old_Y; + void mouseClick(int button, int state, int x, int y) + { + if( state == GLUT_DOWN ) + { + buttonPress = button; + } + old_X = x; + old_Y = y; + } + + void mouseDrag(int x, int y) + { + if( buttonPress == GLUT_LEFT_BUTTON ) + { + zenith -= y-old_Y; + azimuth += x-old_X; + } + else + { + zoom += 0.001* (y-old_Y); + } + old_X = x; + old_Y = y; + } #endif //------------------------------- diff --git a/src/main.h b/src/main.h index 63bf0fa..7359800 100755 --- a/src/main.h +++ b/src/main.h @@ -75,6 +75,8 @@ void runCuda(); #else void display(); void keyboard(unsigned char key, int x, int y); + void mouseDrag(int x, int y); + void mouseClick(int button, int state, int x, int y); #endif //------------------------------- diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index 7f92b88..9c625fc 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -133,7 +133,7 @@ __global__ void sendImageToPBO(uchar4* PBOpos, glm::vec2 resolution, glm::vec3* } //TODO: Implement a vertex shader -__global__ void vertexShadeKernel(float* vbo, int vbosize, vertex* vboFull, cudaMat4 mM, glm::vec3 lpos){ +__global__ void vertexShadeKernel(float* vbo, int vbosize, vertex* vboFull, cudaMat4 mM, cudaMat4 hM, glm::vec3 lpos){ int index = (blockIdx.x * blockDim.x) + threadIdx.x; if(index 0.2 ) + if( hinge > 0.50 ) { - u = multiplyMV4( mM, v ); + u = multiplyMV4( mM, u ); + if( hinge < 0.75 ) + { + float w = ( hinge-0.50 ) / 0.25; + v = v*(1-w) + u*w; + } + else + { + v = u; + } } vboFull[index].lightdir = ( glm::vec4( lpos, 1 ) - v ).swizzle(glm::X, glm::Y, glm::Z); @@ -172,6 +182,10 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in int idxX = ibo[idx0]*3; int idxY = idxX + 1; int idxZ = idxX + 2; + + int idxCx = ( ibo[idx0] % (cbosize/3) ) * 3; + int idxCy = idxCx + 1; + int idxCz = idxCx + 2; glm::vec4 pos = glm::vec4( vbo[ibo[idx0]].position, 1.0f ); @@ -180,13 +194,17 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in pos = multiplyMV4( sM, pos ); primitives[ index ].v0.position = (pos/pos.w).swizzle(glm::X,glm::Y,glm::Z); - primitives[ index ].v0.color = glm::vec3( cbo[(idxX+frame)%cbosize], cbo[(idxY+frame)%cbosize], cbo[(idxZ+frame)%cbosize] ); + primitives[ index ].v0.color = glm::vec3( cbo[idxCx], cbo[idxCy], cbo[idxCz] ); primitives[ index ].v0.lightdir = vbo[ibo[idx0]].lightdir; idxX = ibo[idx1]*3; idxY = idxX + 1; idxZ = idxX + 2; + idxCx = ( ibo[idx1] % (cbosize/3) ) * 3; + idxCy = idxCx + 1; + idxCz = idxCx + 2; + pos = glm::vec4( vbo[ibo[idx1]].position, 1.0f ); pos = multiplyMV4( vM, pos ); @@ -194,13 +212,17 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in pos = multiplyMV4( sM, pos ); primitives[ index ].v1.position = (pos/pos.w).swizzle(glm::X,glm::Y,glm::Z); - primitives[ index ].v1.color = glm::vec3( cbo[(idxX+frame)%cbosize], cbo[(idxY+frame)%cbosize], cbo[(idxZ+frame)%cbosize] ); + primitives[ index ].v1.color = glm::vec3( cbo[idxCx], cbo[idxCy], cbo[idxCz] ); primitives[ index ].v1.lightdir = vbo[ibo[idx1]].lightdir; idxX = ibo[idx2]*3; idxY = idxX + 1; idxZ = idxX + 2; + idxCx = ( ibo[idx2] % (cbosize/3) ) * 3; + idxCy = idxCx + 1; + idxCz = idxCx + 2; + pos = glm::vec4( vbo[ibo[idx2]].position, 1.0f ); pos = multiplyMV4( vM, pos ); @@ -208,7 +230,7 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in pos = multiplyMV4( sM, pos ); primitives[ index ].v2.position = (pos/pos.w).swizzle(glm::X,glm::Y,glm::Z); - primitives[ index ].v2.color = glm::vec3( cbo[(idxX+frame)%cbosize], cbo[(idxY+frame)%cbosize], cbo[(idxZ+frame)%cbosize] ); + primitives[ index ].v2.color = glm::vec3( cbo[idxCx], cbo[idxCy], cbo[idxCz] ); primitives[ index ].v2.lightdir = vbo[ibo[idx2]].lightdir; primitives[ index ].normal = glm::cross( glm::normalize( vbo[ibo[idx1]].position - vbo[ibo[idx0]].position ), @@ -244,6 +266,8 @@ __global__ void rasterizationKernel(triangle* primitives, int primitivesCount, f int dIndex; int dY; + float depth = 0; + for( int y = minP.y; y <= maxP.y; y++ ) { dY = y*resolution.x; @@ -253,12 +277,12 @@ __global__ void rasterizationKernel(triangle* primitives, int primitivesCount, f dIndex = dY + x; if( isBarycentricCoordInBounds( barycoord ) ) { - float depth = getZAtCoordinate( barycoord, tri ); + depth = getZAtCoordinate( barycoord, tri ); bool inLoop = true; while( inLoop ) { - if( atomicExch( &(lock[dIndex]), 1 ) == 0 ) - { + //if( atomicExch( &(lock[dIndex]), 1 ) == 0 ) + //{ if( depth > depthbuffer[dIndex].position.z ) { depthbuffer[dIndex].position.x = x; @@ -273,8 +297,8 @@ __global__ void rasterizationKernel(triangle* primitives, int primitivesCount, f tri.v2.lightdir*barycoord.z; } inLoop = false; - atomicExch( &(lock[dIndex]), 0 ); - } + //atomicExch( &(lock[dIndex]), 0 ); + //} } } } @@ -308,11 +332,13 @@ __global__ void render(glm::vec2 resolution, fragment* depthbuffer, glm::vec3* f } // Wrapper for the __global__ call that sets up the kernel calls and does a ton of memory management -void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize) +void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize, glm::vec3 params) { + float camtilt = params.y/180.0f*3.14159; + cudaMat4 view = { glm::vec4( 1, 0, 0, 0 ), - glm::vec4( 0, cos( -3.14159/4 ), sin( -3.14159/4 ), 0 ), - glm::vec4( 0,-sin( -3.14159/4 ), cos( -3.14159/4 ), -3 ), + glm::vec4( 0, cos( camtilt ), sin( camtilt ), 0 ), + glm::vec4( 0,-sin( camtilt ), cos( camtilt ), params.z-3 ), glm::vec4( 0, 0, 0, 1 ) }; cudaMat4 projection = { glm::vec4( 2.41421, 0, 0, 0 ), @@ -325,11 +351,50 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* glm::vec4( 0, 0, 1, 0 ), glm::vec4( 0, 0, 0, 1 ) }; + float bodyrotate = params.x/180.0f*3.14159; + + cudaMat4 model = { glm::vec4( cos( bodyrotate ), 0, sin( bodyrotate ), 0 ), + glm::vec4( 0, 1, 0, 0 ), + glm::vec4(-sin( bodyrotate ), 0, cos( bodyrotate ), 0 ), + glm::vec4( 0, 0, 0, 1 ) }; + + + cudaMat4 rtrans = { glm::vec4( 1, 0, 0, -.06 ), + glm::vec4( 0, 1, 0, -.35 ), + glm::vec4( 0, 0, 1, 0 ), + glm::vec4( 0, 0, 0, 1 ) }; + + float headtilt = cos( frame*(11)/180.0f*3.14159 )*0.2; + + cudaMat4 no = { glm::vec4( cos( headtilt ), 0, sin( headtilt ), 0 ), + glm::vec4( 0, 1, 0, 0 ), + glm::vec4(-sin( headtilt ), 0, cos( headtilt ), 0 ), + glm::vec4( 0, 0, 0, 1 ) }; + + headtilt = sin( frame*(7)/180.0f*3.14159 )*0.3; + + cudaMat4 yes = { glm::vec4( cos( headtilt ), sin( headtilt ), 0, 0 ), + glm::vec4(-sin( headtilt ), cos( headtilt ), 0, 0 ), + glm::vec4( 0, 0, 1, 0 ), + glm::vec4( 0, 0, 0, 1 ) }; + + headtilt = sin( frame*(13)/180.0f*3.14159 )*0.15; + + cudaMat4 what = { glm::vec4( 1, 0, 0, 0 ), + glm::vec4( 0, cos( headtilt ), sin( headtilt ), 0 ), + glm::vec4( 0,-sin( headtilt ), cos( headtilt ), 0 ), + glm::vec4( 0, 0, 0, 1 ) }; + + cudaMat4 ftrans = { glm::vec4( 1, 0, 0, .06 ), + glm::vec4( 0, 1, 0, .35 ), + glm::vec4( 0, 0, 1, 0 ), + glm::vec4( 0, 0, 0, 1 ) }; - cudaMat4 model = { glm::vec4( cos( frame/180.0f*3.14159 ), 0, sin( frame/180.0f*3.14159 ), 0 ), - glm::vec4( 0, 1, 0, 0 ), - glm::vec4(-sin( frame/180.0f*3.14159 ), 0, cos( frame/180.0f*3.14159 ), 0 ), - glm::vec4( 0, 0, 0, 1 ) }; + cudaMat4 head = utilityCore::glmMat4ToCudaMat4( utilityCore::cudaMat4ToGlmMat4( ftrans ) * + utilityCore::cudaMat4ToGlmMat4( yes ) * + utilityCore::cudaMat4ToGlmMat4( no ) * + utilityCore::cudaMat4ToGlmMat4( what ) * + utilityCore::cudaMat4ToGlmMat4( rtrans ) ); // set up crucial magic int tileSize = 8; @@ -382,14 +447,14 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* //------------------------------ //vertex shader //------------------------------ - vertexShadeKernel<<>>(device_vbo, vbosize, device_vboFull, model, glm::vec3(10,10,10)); + vertexShadeKernel<<>>(device_vbo, vbosize, device_vboFull, model, head, glm::vec3(10,10,10)); cudaDeviceSynchronize(); //------------------------------ //primitive assembly //------------------------------ primitiveBlocks = ceil(((float)ibosize/3)/((float)tileSize)); - primitiveAssemblyKernel<<>>(device_vboFull, vbosize, device_cbo, 3/*cbosize*/, device_ibo, ibosize, primitives, 0*(int)frame, view, projection, screen); + primitiveAssemblyKernel<<>>(device_vboFull, vbosize, device_cbo, cbosize, device_ibo, ibosize, primitives, 0*(int)frame, view, projection, screen); checkCUDAError("Prim Assembler"); cudaDeviceSynchronize(); diff --git a/src/rasterizeKernels.h b/src/rasterizeKernels.h index 5f9696b..447789e 100755 --- a/src/rasterizeKernels.h +++ b/src/rasterizeKernels.h @@ -10,10 +10,9 @@ #include #include #include "glm/glm.hpp" -#include "glm/gtc/matrix_transform.hpp" void kernelCleanup(); -void cudaRasterizeCore(uchar4* pos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize); +void cudaRasterizeCore(uchar4* pos, glm::vec2 resolution, float frame, float* vbo, int vbosize, float* cbo, int cbosize, int* ibo, int ibosize, glm::vec3 params); #endif //RASTERIZEKERNEL_H From 964daeb7f7a583b9f0b5237e178a01f2c4f8559b Mon Sep 17 00:00:00 2001 From: liamboone Date: Tue, 6 Nov 2012 18:32:18 -0500 Subject: [PATCH 09/12] Update README.md --- README.md | 159 +++++------------------------------------------------- 1 file changed, 13 insertions(+), 146 deletions(-) diff --git a/README.md b/README.md index dd7d45a..bcce103 100644 --- a/README.md +++ b/README.md @@ -6,157 +6,24 @@ Fall 2012 Due Monday 11/05/2012 ------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -NOTE: -------------------------------------------------------------------------------- -This project requires an NVIDIA graphics card with CUDA capability! Any card with CUDA compute capability 1.1 or higher will work fine for this project. For a full list of CUDA capable cards and their compute capability, please consult: http://developer.nvidia.com/cuda/cuda-gpus. If you do not have an NVIDIA graphics card in the machine you are working on, feel free to use any machine in the SIG Lab or in Moore100 labs. All machines in the SIG Lab and Moore100 are equipped with CUDA capable NVIDIA graphics cards. If this too proves to be a problem, please contact Patrick or Karl as soon as possible. - -------------------------------------------------------------------------------- -INTRODUCTION: -------------------------------------------------------------------------------- -In this project, you will implement a simplified CUDA based implementation of a standard rasterized graphics pipeline, similar to the OpenGL pipeline. In this project, you will implement vertex shading, primitive assembly, perspective transformation, rasterization, fragment shading, and write the resulting fragments to a framebuffer. More information about the rasterized graphics pipeline can be found in the 10/15 class slides and in your notes from CIS560. - -The basecode provided includes an OBJ loader and much of the mundane I/O and bookkeeping code. The basecode also includes some functions that you may find useful, described below. The core rasterization pipeline is left for you to implement. - -You MAY NOT use ANY raycasting/raytracing AT ALL in this project, EXCEPT in the fragment shader step. One of the purposes of this project is to see how a rasterization pipeline can generate graphics WITHOUT the need for raycasting! Raycasting may only be used in the fragment shader effect for interesting shading results, but is absolutely not allowed in any other stages of the pipeline. - -Also, you MAY NOT use OpenGL ANYWHERE in this project, aside from the given OpenGL code for drawing Pixel Buffer Objects to the screen. Use of OpenGL for any pipeline stage instead of your own custom implementation will result in an incomplete project. - -Finally, note that while this basecode is meant to serve as a strong starting point for a CUDA rasterizer, you are not required to use this basecode if you wish, and you may also change any part of the basecode specification as you please, so long as the final rendered result is correct. - -------------------------------------------------------------------------------- -CONTENTS: -------------------------------------------------------------------------------- -The Project3 root directory contains the following subdirectories: - -* src/ contains the source code for the project. Both the Windows Visual Studio solution and the OSX makefile reference this folder for all source; the base source code compiles on OSX and Windows without modification. -* objs/ contains an example cow.obj test file: the standard "bovine test". -* renders/ contains an example render of the given example cow.obj file with a z-depth fragment shader. -* PROJ1_WIN/ contains a Windows Visual Studio 2010 project and all dependencies needed for building and running on Windows 7. -* PROJ1_OSX/ contains a OSX makefile, run script, and all dependencies needed for building and running on Mac OSX 10.8. - -The Windows and OSX versions of the project build and run exactly the same way as in Project0, Project1, and Project2. - -------------------------------------------------------------------------------- -REQUIREMENTS: -------------------------------------------------------------------------------- -In this project, you are given code for: - -* A library for loading/reading standard Alias/Wavefront .obj format mesh files and converting them to OpenGL style VBOs/IBOs -* A suggested order of kernels with which to implement the graphics pipeline -* Working code for CUDA-GL interop - -You will need to implement the following stages of the graphics pipeline and features: - -* Vertex Shading -* Primitive Assembly with support for triangle VBOs/IBOs -* Perspective Transformation -* Rasterization through either a scanline or a tiled approach -* Fragment Shading -* A depth buffer for storing and depth testing fragments -* Fragment to framebuffer writing -* A simple lighting/shading scheme, such as Lambert or Blinn-Phong, implemented in the fragment shader - -You are also required to implement at least 3 of the following features: - -* Additional pipeline stages. Each one of these stages can count as 1 feature: - * Geometry shader - * Transformation feedback - * Back-face culling - * Scissor test - * Stencil test - * Blending - -IMPORTANT: For each of these stages implemented, you must also add a section to your README stating what the expected performance impact of that pipeline stage is, and real performance comparisons between your rasterizer with that stage and without. - -* Correct color interpretation between points on a primitive -* Texture mapping WITH texture filtering and perspective correct texture coordinates -* Support for additional primitices. Each one of these can count as HALF of a feature. - * Lines - * Line strips - * Triangle fans - * Triangle strips - * Points -* Anti-aliasing -* Order-independent translucency using a k-buffer -* MOUSE BASED interactive camera support. Interactive camera support based only on the keyboard is not acceptable for this feature. - -------------------------------------------------------------------------------- -BASE CODE TOUR: -------------------------------------------------------------------------------- -You will be working primarily in two files: rasterizeKernel.cu, and rasterizerTools.h. Within these files, areas that you need to complete are marked with a TODO comment. Areas that are useful to and serve as hints for optional features are marked with TODO (Optional). Functions that are useful for reference are marked with the comment LOOK. - -* rasterizeKernels.cu contains the core rasterization pipeline. - * A suggested sequence of kernels exists in this file, but you may choose to alter the order of this sequence or merge entire kernels if you see fit. For example, if you decide that doing has benefits, you can choose to merge the vertex shader and primitive assembly kernels, or merge the perspective transform into another kernel. There is not necessarily a right sequence of kernels (although there are wrong sequences, such as placing fragment shading before vertex shading), and you may choose any sequence you want. Please document in your README what sequence you choose and why. - * The provided kernels have had their input parameters removed beyond basic inputs such as the framebuffer. You will have to decide what inputs should go into each stage of the pipeline, and what outputs there should be. - -* rasterizeTools.h contains various useful tools, including a number of barycentric coordinate related functions that you may find useful in implementing scanline based rasterization... - * A few pre-made structs are included for you to use, such as fragment and triangle. A simple rasterizer can be implemented with these structs as is. However, as with any part of the basecode, you may choose to modify, add to, use as-is, or outright ignore them as you see fit. - * If you do choose to add to the fragment struct, be sure to include in your README a rationale for why. - -You will also want to familiarize yourself with: - -* main.cpp, which contains code that transfers VBOs/CBOs/IBOs to the rasterization pipeline. Interactive camera work will also have to be implemented in this file if you choose that feature. -* utilities.h, which serves as a kitchen-sink of useful functions - -------------------------------------------------------------------------------- -SOME RESOURCES: -------------------------------------------------------------------------------- -The following resources may be useful for this project: - -* High-Performance Software Rasterization on GPUs - * Paper (HPG 2011): http://www.tml.tkk.fi/~samuli/publications/laine2011hpg_paper.pdf - * Code: http://code.google.com/p/cudaraster/ Note that looking over this code for reference with regard to the paper is fine, but we most likely will not grant any requests to actually incorporate any of this code into your project. - * Slides: http://bps11.idav.ucdavis.edu/talks/08-gpuSoftwareRasterLaineAndPantaleoni-BPS2011.pdf -* The Direct3D 10 System (SIGGRAPH 2006) - for those interested in doing geometry shaders and transform feedback. - * http://133.11.9.3/~takeo/course/2006/media/papers/Direct3D10_siggraph2006.pdf -* Multi-Fragment Effects on the GPU using the k-Buffer - for those who want to do a k-buffer - * http://www.inf.ufrgs.br/~comba/papers/2007/kbuffer_preprint.pdf -* FreePipe: A Programmable, Parallel Rendering Architecture for Efficient Multi-Fragment Effects (I3D 2010) - * https://sites.google.com/site/hmcen0921/cudarasterizer -* Writing A Software Rasterizer In Javascript: - * Part 1: http://simonstechblog.blogspot.com/2012/04/software-rasterizer-part-1.html - * Part 2: http://simonstechblog.blogspot.com/2012/04/software-rasterizer-part-2.html - -------------------------------------------------------------------------------- -NOTES ON GLM: -------------------------------------------------------------------------------- -This project uses GLM, the GL Math library, for linear algebra. You need to know two important points on how GLM is used in this project: - -* In this project, indices in GLM vectors (such as vec3, vec4), are accessed via swizzling. So, instead of v[0], v.x is used, and instead of v[1], v.y is used, and so on and so forth. -* GLM Matrix operations work fine on NVIDIA Fermi cards and later, but pre-Fermi cards do not play nice with GLM matrices. As such, in this project, GLM matrices are replaced with a custom matrix struct, called a cudaMat4, found in cudaMat4.h. A custom function for multiplying glm::vec4s and cudaMat4s is provided as multiplyMV() in intersections.h. - ------------------------------------------------------------------------------- BLOG ------------------------------------------------------------------------------- -As mentioned in class, all students should have student blogs detailing progress on projects. If you already have a blog, you can use it; otherwise, please create a blog using www.blogger.com or any other tool, such as www.wordpress.org. Blog posts on your project are due on the SAME DAY as the project, and should include: - -* A brief description of the project and the specific features you implemented. -* A link to your github repo if the code is open source. -* At least one screenshot of your project running. -* A 30 second or longer video of your project running. To create the video use http://www.microsoft.com/expression/products/Encoder4_Overview.aspx +http://liamboone.blogspot.com/2012/11/project-3-rasterizer.html ------------------------------------------------------------------------------- -THIRD PARTY CODE POLICY +Description ------------------------------------------------------------------------------- -* Use of any third-party code must be approved by asking on Piazza. 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 ray 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 result in you receiving an F for the semester. +In the third project we were tasked with coding a CUDA based rasterization pipeline. I have implemented the actual rasterization with a very simple method of checking barycentric coordinates in an AABB around the triangles being drawn. -------------------------------------------------------------------------------- -SELF-GRADING -------------------------------------------------------------------------------- -* On the submission date, email your grade, on a scale of 0 to 100, to Karl, yiningli@seas.upenn.edu, with a one paragraph explanation. Be concise and realistic. Recall that we reserve 30 points as a sanity check to adjust your grade. Your actual grade will be (0.7 * your grade) + (0.3 * our grade). We hope to only use this in extreme cases when your grade does not realistically reflect your work - it is either too high or too low. In most cases, we plan to give you the exact grade you suggest. -* Projects are not weighted evenly, e.g., Project 0 doesn't count as much as the path tracer. We will determine the weighting at the end of the semester based on the size of each project. - -------------------------------------------------------------------------------- -SUBMISSION -------------------------------------------------------------------------------- -As with the previous project, you should fork this project and work inside of your fork. Upon completion, commit your finished project back to your fork, and make a pull request to the master repository. -You should include a README.md file in the root directory detailing the following +Features: + -Simple Lambert shading + -Mouse controlled camera + -left click and drag horizontally controls model rotation + -left click and drag controls camera elevation + -right click and drag vertically controls camera zoom + -Vertex blending between the head, which is animated by it's own rotation matrix, and the body + -Color blending + -Back face culling -* A brief description of the project and specific features you implemented -* At least one screenshot of your project running, and at least one screenshot of the final rendered output of your raytracer -* Instructions for building and running your project if they differ from the base code -* A link to your blog post detailing the project -* A list of all third-party code used \ No newline at end of file +The vertex blending that I have added allows free rotation of the cow's head as can be seen in the video using a transformation matrix in addition to the one used on the body. From 0bba32b0e47fea6aa4f3b2f712efa2eb5f953c68 Mon Sep 17 00:00:00 2001 From: liamboone Date: Tue, 6 Nov 2012 18:34:01 -0500 Subject: [PATCH 10/12] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bcce103..04a62a6 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ Description ------------------------------------------------------------------------------- In the third project we were tasked with coding a CUDA based rasterization pipeline. I have implemented the actual rasterization with a very simple method of checking barycentric coordinates in an AABB around the triangles being drawn. -Features: +Features: + -Simple Lambert shading -Mouse controlled camera -left click and drag horizontally controls model rotation From d028025135754a67ce297f312fdcc3288a3372be Mon Sep 17 00:00:00 2001 From: liamboone Date: Tue, 6 Nov 2012 18:34:37 -0500 Subject: [PATCH 11/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 04a62a6..c4a795d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ CIS565: Project 3: CUDA Rasterizer ------------------------------------------------------------------------------- Fall 2012 ------------------------------------------------------------------------------- -Due Monday 11/05/2012 +Due Tuesday 11/06/2012 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- From 518e71eb3661ee85e63aaabaf6e606cc019ab66a Mon Sep 17 00:00:00 2001 From: Liam Boone Date: Tue, 6 Nov 2012 19:05:44 -0500 Subject: [PATCH 12/12] bug fix --- src/main.cpp | 5 +++-- src/rasterizeKernels.cu | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f49f77c..ca48f47 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -99,8 +99,9 @@ void runCuda(){ float newcbo[] = {0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0}; - cbo = newcbo; - cbosize = 9; + + cbo = newcbo; //mesh->getCBO(); + cbosize = 9; //mesh->getCBOsize(); ibo = mesh->getIBO(); ibosize = mesh->getIBOsize(); diff --git a/src/rasterizeKernels.cu b/src/rasterizeKernels.cu index 9c625fc..de27253 100755 --- a/src/rasterizeKernels.cu +++ b/src/rasterizeKernels.cu @@ -183,7 +183,7 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in int idxY = idxX + 1; int idxZ = idxX + 2; - int idxCx = ( ibo[idx0] % (cbosize/3) ) * 3; + int idxCx = ( ibo[idx0]%(cbosize/3) ) * 3; int idxCy = idxCx + 1; int idxCz = idxCx + 2; @@ -201,7 +201,7 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in idxY = idxX + 1; idxZ = idxX + 2; - idxCx = ( ibo[idx1] % (cbosize/3) ) * 3; + idxCx = ( ibo[idx1]%(cbosize/3) ) * 3; idxCy = idxCx + 1; idxCz = idxCx + 2; @@ -219,7 +219,7 @@ __global__ void primitiveAssemblyKernel(vertex* vbo, int vbosize, float* cbo, in idxY = idxX + 1; idxZ = idxX + 2; - idxCx = ( ibo[idx2] % (cbosize/3) ) * 3; + idxCx = ( ibo[idx2]%(cbosize/3) ) * 3; idxCy = idxCx + 1; idxCz = idxCx + 2; @@ -435,7 +435,7 @@ void cudaRasterizeCore(uchar4* PBOpos, glm::vec2 resolution, float frame, float* cudaMemcpy( device_vbo, vbo, vbosize*sizeof(float), cudaMemcpyHostToDevice); device_vboFull = NULL; - cudaMalloc((void**)&device_vboFull, vbosize/3*sizeof(float)); + cudaMalloc((void**)&device_vboFull, vbosize*sizeof(vertex)); device_cbo = NULL; cudaMalloc((void**)&device_cbo, cbosize*sizeof(float));