From dfd0c57c596804dc5cd34bdd8fd15a92831fcaac Mon Sep 17 00:00:00 2001 From: connellpaxton Date: Tue, 6 Feb 2024 11:31:29 -0500 Subject: [PATCH] Fixed normal generation (for real this time). Issue was in sampling texture on the CPU side. --- Renderer/Renderer.cpp | 2 +- Scene/Terrain.cpp | 13 ++++++++++--- assets/shaders/terrain.frag | 14 ++++---------- assets/shaders/terrain.frag.spv | Bin 2264 -> 2228 bytes 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index 6d88e28..d1790e9 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -230,7 +230,7 @@ Renderer::Renderer(Window& win) : win(win) { { dev, "assets/shaders/terrain.vert.spv", vk::ShaderStageFlagBits::eVertex }, { dev, "assets/shaders/terrain.tesc.spv", vk::ShaderStageFlagBits::eTessellationControl }, { dev, "assets/shaders/terrain.tese.spv", vk::ShaderStageFlagBits::eTessellationEvaluation }, - { dev, "assets/shaders/gooch.frag.spv", vk::ShaderStageFlagBits::eFragment }, + { dev, "assets/shaders/terrain.frag.spv", vk::ShaderStageFlagBits::eFragment }, }; terrain_pipeline = std::make_unique(dev, terrain_shaders, swapchain->extent, *render_pass, bindings, *terrain->vertex_buffer, GraphicsPipeline::eTERRAIN); diff --git a/Scene/Terrain.cpp b/Scene/Terrain.cpp index 5a5c2aa..8895be7 100644 --- a/Scene/Terrain.cpp +++ b/Scene/Terrain.cpp @@ -13,7 +13,14 @@ float Terrain::getHeight(int32_t x, int32_t y) { x %= 64; y %= 64; - return heightmap_tex->image_data[(y * heightmap_tex->extent.height * heightmap_tex->extent.width / 64 + x * heightmap_tex->extent.width / 64) * 4]; + float xf = x; + float yf = y; + xf /= 64.0; + xf *= heightmap_tex->extent.width; + yf /= 64.0; + yf *= heightmap_tex->extent.height; + + return static_cast(heightmap_tex->image_data[static_cast(static_cast(yf) * heightmap_tex->extent.width + xf) * 4]) / 256.0f; } Terrain::Terrain(vk::PhysicalDevice phys_dev, vk::Device dev, Texture& tex) : phys_dev(phys_dev), dev(dev) { @@ -73,9 +80,9 @@ Terrain::Terrain(vk::PhysicalDevice phys_dev, vk::Device dev, Texture& tex) : ph - moores_heights[0][2] - 2.0f * moores_heights[1][2] - moores_heights[2][2] ); /* fill in missing component, first scalar scales bump */ - normal.y = 15.0 * glm::sqrt(glm::abs(1.0 - normal.x*normal.x - normal.z*normal.z)); + normal.y = 0.25 * glm::sqrt(glm::abs(1.0 - normal.x*normal.x - normal.z*normal.z)); - + //vertices[x + y * patch_size].norm = glm::vec3(getHeight(x, y)); vertices[x + y * patch_size].norm = glm::normalize(normal * glm::vec3(2.0f, 1.0f, 2.0f)); } diff --git a/assets/shaders/terrain.frag b/assets/shaders/terrain.frag index b12905f..6cc0007 100644 --- a/assets/shaders/terrain.frag +++ b/assets/shaders/terrain.frag @@ -16,19 +16,13 @@ layout (set = 0, binding = 0) uniform Matrices { float tess_edge_size; }; -layout (set = 0, binding = 1) uniform sampler2D heightmap; - -float height(vec2 uv) { - return 15.0 * texture(heightmap, uv).r; -} +layout (set = 0, binding = 1) uniform sampler2D heightmap; void main() { - vec3 N = norm; - - vec3 light_pos = normalize(vec3(cos(time), sin(time), 0.0))*10.0; + vec3 light_pos = vec3(10.0*cos(time), 10.0, 0.0); vec3 L = normalize(light_pos-pos); float r = length(light_pos-pos); - float t = clamp(dot(L, N), 0.0, 1.0) * 20.0/(r*r); + float t = clamp(dot(L, norm), 0.0, 1.0) * 20.0/(r*r); - FragColor = vec4(1.0); + FragColor = vec4(t, t/2.0, t*2.0, 1.0); } \ No newline at end of file diff --git a/assets/shaders/terrain.frag.spv b/assets/shaders/terrain.frag.spv index 21e7eb4ce7ee2082b82eca60c16d828642b28d79..6e079293ec044290924f0b6dd20f00f82ae58e83 100644 GIT binary patch literal 2228 zcmZQ(Qf6mhU}WHC;AL=QfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!No zaQBIK_xE@Aag9$dD2OjEsmw`@&&kY7jZeueN=+`wEK3Ec<3LiEnU|bXnu4r=m4O9p zKFoer237`61_p+l%=C>fKgKuI~vg)9bgcS&Y$DzX?TB$5+z!M4Ekg2E%MsI<7GG?#&mfema2D+2=q$c}>i zq7sOHh&USq14Bt_adCWFVsc4-5d#|oJ6Js^tia-_De0;4#hF#9AU`lO2!k|({lm;4 z%fP_k17(B49OP4024)6T1_p*AsJIr$d@!2@94C4CMY$j&K;Z$3AGe~!bm#n>e298h zaD0`dRygP97p1_|xiT;?WTb)uGdHn-fq}uDfrWvefq?UY7k-|zai@bg*7OAJfQIb;)C=#An5~%A@o7a0>uYNT?3LjP<(*ICLoD{;sYeM z07(pFA4m+8h++1E`~wo>U_|%q8WlqW!ZkP;9d6#mG3P+kG?L4F0vgTfuzd=MXGK1g1efeCD`A~;7u>=0vM2FD4= zUU3E%29Vo9egcJw0s{*J2Ll6G3?#12zyemw1#%37f+I*hH#AN`;U&Sq!oUMA13>wY zfkBjkg@KoWfdOPTNDD|mh|dSrBLhtnATvN>AoD z2&N7s26CqmG|WJG)0%;W0mKJ|HOL&0J4B%F0EGj{9U#6aR1ZkM7?ce%4tkV%X8@IWkgx!m58{LT1u_q$Uj-UYAbl`-P~3s!Vdm+B&1gUkkn14uoH4@wIlF-Zna1}A73gZL0_5E90h zW?*J;W?%rT1DWRnkp_!_%meX3X$K^1#=r_rH=sBM@j-6-!N9}-$`2s5pfmz1J3(;+ z7#|cipz;No4=Q6od`AXW22j|GGcbV5DNvl)LerT90|Ns{oCjPYGB8L&;{cRa zKys}Ntl;!0#lXM-N|PY@0B~u@z#zlGzyK2m#iJbqGq`*QiG$1s*$v7!Aa}#~pnL*~ z(`E)%aGD3@Baj-9ILHkkJ)nFI3PVuXfaF2ug8T{+hnb_szyP)j##aZYAqEDRxf%=% z3?MZiage#7G@}Xi8z|mD@*s0TVFnV1nWN3X04~2_d|harIRzRHdJGH?2H%~7(i-3X%S>D$SuYU4B+|z#y5fTVR}p%7#KimK;j)x zyUiFF7(ix$=_ssKxTvVgXBSe1KAJCJ0Q8g42%pG42%o_9SV$3 literal 2264 zcmZQ(Qf6mhU}WHC;AL=QfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!No zaQBIK_xE@Aag9$dD2OjEsmw`@&&kY7jZeueN=+`wEK3Ec<3LiEnU|bXnu4r=m4O9p zKFoer24)6M1_lN{1_lO@9LPO+`9--Px3My?GVn4mFyv&WXOzSjstv&3cTFJ0tN;KcLo*)Q25G$6hQex3=9k) zw+k>ZFnBPqfZYs|2KmziDO{C7f?zd>um<@JSsy5@k@bQ2Abk!<`aog`eGs!i@c~lT zfTRu-A0V*_NMfM)0EsO?5(C)>5(6c0n0rC~0f})ig8T%r17s&ijE4~v4$NSGg6su_ z2`Da@wpg4r2s_Cnt_D@#0SMI z$b67~K4_eR!b^gIg@K=efdM22;)^n{Fo5C=WEaT&+EBhARF4b;3j-)kfYgJ;K;{WU zR|d!L7EvF z>|uO!Fn@s~NWCq%%!7m#$UG1q6xX15&|zQ)hoL^O5-4VL16&W3*v*) z1xQSifs?@r8ipV~*h(k?<4ZFzGdMFafYpJ_bAif(#6aeO_@HzI5;kLC1*aQOe1iBO z_x)gCVgTg@kXlfB;e`4f#s`(7pm>7uL1hk%4+Fuk%^^n&sdNF1hD z9;z4Q2asF+;RZ^}tx!D{3=9k)HK2R}G8g0)O9lo8klir86_gLt tW6i+808#@I?|_FNG3;;`KjF|uc