From 4012425d358e3fa2ad41a1d525fa4b78e2232042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Con=C3=A1l?= Date: Sun, 28 Jan 2024 10:01:39 -0500 Subject: [PATCH] Made small ray tracer with a sphere to test fragment shading and uniform buffers --- CMakeLists.txt | 2 +- Renderer/Renderer.cpp | 9 +++-- Renderer/UniformBuffer.hpp | 1 + assets/shaders/trace.frag | 62 ++++++++++++++++++++++++++++++++++ assets/shaders/trace.frag.spv | Bin 0 -> 5208 bytes 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 assets/shaders/trace.frag create mode 100644 assets/shaders/trace.frag.spv diff --git a/CMakeLists.txt b/CMakeLists.txt index 2542296..8c877e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ add_dependencies(pleascach shaders) if(UNIX) add_custom_command( TARGET shaders POST_BUILD - COMMAND cp -r + COMMAND cmake -E copy_directory "$/assets" "$/assets") else() diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index 2c530a7..53d10ec 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -186,7 +186,7 @@ Renderer::Renderer(Window& win) : win(win) { std::vector shaders = { { dev, "assets/shaders/basic.vert.spv", vk::ShaderStageFlagBits::eVertex }, - { dev, "assets/shaders/basic.frag.spv", vk::ShaderStageFlagBits::eFragment }, + { dev, "assets/shaders/trace.frag.spv", vk::ShaderStageFlagBits::eFragment }, }; std::vector bindings = { @@ -265,11 +265,14 @@ void Renderer::draw() { command_buffer->bind(*vertex_buffer); command_buffer->bind(pipeline->layout, pipeline->desc_set); - const auto p = glm::perspective(glm::radians(90.0f), static_cast(swapchain->extent.width) / static_cast(swapchain->extent.height), 0.01f, 50.0f); + auto sz = win.getDimensions(); + + const auto p = glm::perspective(glm::radians(90.0f), static_cast(sz.width) / static_cast(sz.height), 0.01f, 50.0f); uniform_buffer->upload(UniformData{ //.mvp = p * glm::rotate(glm::mat4(1.0), glm::radians(static_cast(frame)), glm::vec3(1.0, 1.0, 1.0)), - .time = static_cast(frame), + .time = static_cast(frame) * 0.0167f, + .aspect_ratio = static_cast(sz.width)/static_cast(sz.height), }); diff --git a/Renderer/UniformBuffer.hpp b/Renderer/UniformBuffer.hpp index 9c89869..66523a5 100644 --- a/Renderer/UniformBuffer.hpp +++ b/Renderer/UniformBuffer.hpp @@ -12,6 +12,7 @@ struct UniformData { glm::mat4 mvp; float time; + float aspect_ratio; }; struct UniformBuffer { diff --git a/assets/shaders/trace.frag b/assets/shaders/trace.frag new file mode 100644 index 0000000..41e19b7 --- /dev/null +++ b/assets/shaders/trace.frag @@ -0,0 +1,62 @@ +#version 460 core + +layout (location = 0) in vec2 texCoord; +layout (location = 0) out vec4 FragColor; + +layout (set = 0, binding = 0) uniform Matrices { + mat4 mpv; + float time; + float aspect_ratio; +}; + +/* 4-float alignment in memory*/ +struct Ray { + vec3 orig; + float min; + vec3 dir; + float max; +}; + +vec3 ray_color(vec3 ray) { + float a = 0.5 * (ray.y+1.0); + + return vec3(1.0-a) + a*vec3(0.5, 0.7, 1.0); +} + + +/* returns float of where you hit, or -1.0 */ +float sphere(vec3 center, float r, Ray ray) { + vec3 p = ray.orig-center; + float a = dot(ray.dir, ray.dir); + float half_b = dot(p, ray.dir); + float c = dot(p, p) - r*r; + float discr = half_b*half_b - a*c; + + if(discr < 0.0) + return -1.0; + + return -half_b-sqrt(discr)/a; +} + +void main() { + vec2 pixel = texCoord*2.0-1.0; + Ray ray; + ray.orig = vec3(0.0); + ray.min = 0.1; + ray.max = 10000.0; + float fov = radians(90); + ray.dir = normalize(vec3(pixel.x * aspect_ratio, pixel.y, tan(fov/2.0))); + + vec3 sphere_center = vec3(0.0, 0.0, 1.0); + + float d = sphere(sphere_center, 0.5, ray); + + if(d < 0.0) { + FragColor = vec4(0.0); + return; + } + + vec3 n = normalize(ray.dir*d-sphere_center); + FragColor = vec4((n+vec3(1.0)) / 2.0, 1.0); + +} \ No newline at end of file diff --git a/assets/shaders/trace.frag.spv b/assets/shaders/trace.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..b16437f03eecc99e64d409618a2d0ede663f5800 GIT binary patch literal 5208 zcmZQ(Qf6mhU}WHC;AObQ00DvwObm<+3=G^1Y+%~mC)h`?xFki-#MA(!f{%e2M1ke_ z8Q2+E7#P4fH!(90B+oh~_;*z4$xhUC<|lGGvw z29TTh7#J9e7$9tZ5IeDwft7)eL6m`kAwMT2o>cRN(99PGnF%#t1jGiL&&(jsz`#%d z6_;aRU`T|rRT&rx->|lMMI87`rNKGz@FG?)Q z%m>MV;$kj{0d@-;!)kck#>1iu9ABG2egLasVb}t4e_~N$E|k9wjlUg@zZ;Fe7mdFU zh0hAkCvHWF>CX8%`LJ+5$-uw>%1G`EEa310#U04m9t#UlQtm7+;(*=i5+cLUUYpl}7b zzY*$wkT{6n%m6BZ85lr(YX%ku5FeCJVD1LFs~v1_gS`#|D1|dHbTcq8fZPJZAbUan z?S+~J;)C?{F)%QkJ#)qu#0SYw0GGuK3?M#8ej>cAa$ zU|{&gz`_8M+rYrUu#16#0hI1RY>=Np?%T@10Io|x_JYzZh!0|e(km!Wg4BV^>K#z` zg5*GH7sR(@UOgq{B=?hn3G5z_-5@uB%mmrJ2gz?hgVNPO1_lO@njO&a zJH)`i01|_R-w~wn1IZm`U|;}=f&2hsgX{p6NuYA*F9RbuTtV`nI0MD+DX5!4@e8sO z|zmInC)#0RMdwR@2Hpf)u!AJnc!=7ZYSAU-T^r5G3(K=y#jL|FJrGcYiK#9@3H z1_lO@8)5M#%fP?@QUekP`4!|QkQmHNP&*4`CUSZKwbwx6Fg2j|9J(4%`wt{O1sX3Z z3=9k)eIRj=Js`h=#9;1H2iN}$3@|e_pngHNSCfH(0VEDHQ;UIt0i+Kk4l84|p=kvq z2eJngh9EJRJ-SePV0=9&A7-XL0|Ns{4M-fM1{BYr4k{=vVSGad1_lrxW~UJY0|Q76 zNE{TdAU(zm3=AN%Kyn~=fZ`4$1~bEyfq?Y0&cMI`QUel)sj*~WU;u?1 zOpO%-0|Tfn2@;2?0d*KbcEQxxFfcHH)PcldZnI@zU;vp9k^{L7l#W1RFf;5J7{L8D zSQ+HVz`y_!gOx$fphOQX!$ERR3=9k)F;MyjvHvkJF@V~xAU;SOX0995kM#^J;PTm> zfq?-e29x)I+6yW_Kw;_aJdE1_lO@9H=~i>Gg(&4NQ#>0|Ns{9Y`GJ zZ(neKgnL*nGw#wzyK15sfoa%CX#`H0VEE~Cs7Ox3?O|V zagaSAzkSx`RA%xne*29O$%I7|&_tO689Fg~d74>A{~2h=wQsR4<@+yNS3 z0GS1n1Gxi~K0snHGeF}oATd}zEd-4NK>Ht{wibAR1Da1ka-gvQkQgZ4g4m!u0L!N! zahSQKQ2)U4X&D0p14s-eUk)0pVPIf@<