From 668b9c9b579a548ab2a1a50430456491a3403217 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Mon, 15 Jan 2024 19:12:06 +0100 Subject: [PATCH] Code cleanup, simplified descriptor setup --- examples/displacement/displacement.cpp | 266 ++++++------------ shaders/glsl/displacement/base.frag | 2 +- shaders/glsl/displacement/base.frag.spv | Bin 1932 -> 2104 bytes shaders/glsl/displacement/displacement.tesc | 5 + .../glsl/displacement/displacement.tesc.spv | Bin 2648 -> 2996 bytes shaders/glsl/displacement/displacement.tese | 5 +- .../glsl/displacement/displacement.tese.spv | Bin 4084 -> 4232 bytes shaders/hlsl/displacement/base.frag | 5 +- shaders/hlsl/displacement/base.frag.spv | Bin 2420 -> 1268 bytes shaders/hlsl/displacement/displacement.tesc | 6 + .../hlsl/displacement/displacement.tesc.spv | Bin 2548 -> 2872 bytes shaders/hlsl/displacement/displacement.tese | 8 +- .../hlsl/displacement/displacement.tese.spv | Bin 5680 -> 3236 bytes 13 files changed, 102 insertions(+), 195 deletions(-) diff --git a/examples/displacement/displacement.cpp b/examples/displacement/displacement.cpp index fb96c4bd..6a9e2ac4 100644 --- a/examples/displacement/displacement.cpp +++ b/examples/displacement/displacement.cpp @@ -1,6 +1,8 @@ /* * Vulkan Example - Displacement mapping with tessellation shaders * +* This samples uses tessellation shaders to displace geometry based on a height map +* * Copyright (C) 2016 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) @@ -12,40 +14,32 @@ class VulkanExample : public VulkanExampleBase { -private: - struct { - vks::Texture2D colorHeightMap; - } textures; public: bool splitScreen = true; bool displacement = true; vkglTF::Model plane; + vks::Texture2D colorHeightMap; - struct { - vks::Buffer tessControl, tessEval; - } uniformBuffers; - - struct UBOTessControl { - float tessLevel = 64.0f; - } uboTessControl; - - struct UBOTessEval { + // Uniform data/buffer used by both tessellation shader stages + struct UniformData { glm::mat4 projection; glm::mat4 modelView; glm::vec4 lightPos = glm::vec4(0.0f, -1.0f, 0.0f, 0.0f); float tessAlpha = 1.0f; float tessStrength = 0.1f; - } uboTessEval; + float tessLevel = 64.0f; + } uniformData; + vks::Buffer uniformBuffer; struct Pipelines { - VkPipeline solid; - VkPipeline wireframe = VK_NULL_HANDLE; + VkPipeline solid{ VK_NULL_HANDLE }; + VkPipeline wireframe{ VK_NULL_HANDLE }; } pipelines; - VkPipelineLayout pipelineLayout; - VkDescriptorSet descriptorSet; - VkDescriptorSetLayout descriptorSetLayout; + VkPipelineLayout pipelineLayout{ VK_NULL_HANDLE }; + VkDescriptorSet descriptorSet{ VK_NULL_HANDLE }; + VkDescriptorSetLayout descriptorSetLayout{ VK_NULL_HANDLE }; VulkanExample() : VulkanExampleBase() { @@ -58,19 +52,16 @@ public: ~VulkanExample() { - // Clean up used Vulkan resources - // Note : Inherited destructor cleans up resources stored in base class - vkDestroyPipeline(device, pipelines.solid, nullptr); - if (pipelines.wireframe != VK_NULL_HANDLE) { - vkDestroyPipeline(device, pipelines.wireframe, nullptr); - }; - - vkDestroyPipelineLayout(device, pipelineLayout, nullptr); - vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - - uniformBuffers.tessControl.destroy(); - uniformBuffers.tessEval.destroy(); - textures.colorHeightMap.destroy(); + if (device) { + vkDestroyPipeline(device, pipelines.solid, nullptr); + if (pipelines.wireframe != VK_NULL_HANDLE) { + vkDestroyPipeline(device, pipelines.wireframe, nullptr); + }; + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); + vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); + uniformBuffer.destroy(); + colorHeightMap.destroy(); + } } // Enable physical device features required for this example @@ -96,7 +87,7 @@ public: { const uint32_t glTFLoadingFlags = vkglTF::FileLoadingFlags::PreTransformVertices | vkglTF::FileLoadingFlags::PreMultiplyVertexColors | vkglTF::FileLoadingFlags::FlipY; plane.loadFromFile(getAssetPath() + "models/displacement_plane.gltf", vulkanDevice, queue, glTFLoadingFlags); - textures.colorHeightMap.loadFromFile(getAssetPath() + "textures/stonefloor03_color_height_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); + colorHeightMap.loadFromFile(getAssetPath() + "textures/stonefloor03_color_height_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); } void buildCommandBuffers() @@ -156,122 +147,56 @@ public: } } - void setupDescriptorPool() + void setupDescriptors() { + // Pool std::vector poolSizes = { vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2), vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1) }; VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(poolSizes, 2); VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); - } - void setupDescriptorSetLayout() - { - std::vector setLayoutBindings = - { - // Binding 0 : Tessellation control shader ubo - vks::initializers::descriptorSetLayoutBinding( - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, - 0), - // Binding 1 : Tessellation evaluation shader ubo - vks::initializers::descriptorSetLayoutBinding( - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, - 1), - // Binding 2 : Combined color (rgb) and height (alpha) map - vks::initializers::descriptorSetLayoutBinding( - VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, - 2), + // Layout + std::vector setLayoutBindings = { + // Binding 0 : Tessellation shader ubo + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, 0), + // Binding 1 : Combined color (rgb) and height (alpha) map + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 1), }; - - VkDescriptorSetLayoutCreateInfo descriptorLayout = - vks::initializers::descriptorSetLayoutCreateInfo( - setLayoutBindings.data(), - static_cast(setLayoutBindings.size())); - + VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings); VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout)); - VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = - vks::initializers::pipelineLayoutCreateInfo( - &descriptorSetLayout, - 1); - - VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayout)); - } - - void setupDescriptorSet() - { + // Set VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayout, 1); VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet)); - std::vector writeDescriptorSets = { - // Binding 0 : Tessellation control shader ubo - vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.tessControl.descriptor), - // Binding 1 : Tessellation evaluation shader ubo - vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &uniformBuffers.tessEval.descriptor), - // Binding 2 : Color and displacement map (alpha channel) - vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, &textures.colorHeightMap.descriptor), + // Binding 0 : Tessellation shader ubo + vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor), + // Binding 1 : Color and displacement map (alpha channel) + vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &colorHeightMap.descriptor), }; - vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); + vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr); } void preparePipelines() { - VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = - vks::initializers::pipelineInputAssemblyStateCreateInfo( - VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, - 0, - VK_FALSE); + // Layout + VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayout, 1); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCreateInfo, nullptr, &pipelineLayout)); - VkPipelineRasterizationStateCreateInfo rasterizationState = - vks::initializers::pipelineRasterizationStateCreateInfo( - VK_POLYGON_MODE_FILL, - VK_CULL_MODE_BACK_BIT, - VK_FRONT_FACE_COUNTER_CLOCKWISE, - 0); + // Pipelines + VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = vks::initializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, 0, VK_FALSE); + VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_BACK_BIT, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0); + VkPipelineColorBlendAttachmentState blendAttachmentState = vks::initializers::pipelineColorBlendAttachmentState(0xf, VK_FALSE); + VkPipelineColorBlendStateCreateInfo colorBlendState = vks::initializers::pipelineColorBlendStateCreateInfo(1, &blendAttachmentState); + VkPipelineDepthStencilStateCreateInfo depthStencilState = vks::initializers::pipelineDepthStencilStateCreateInfo(VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS_OR_EQUAL); + VkPipelineViewportStateCreateInfo viewportState = vks::initializers::pipelineViewportStateCreateInfo(1, 1, 0); + VkPipelineMultisampleStateCreateInfo multisampleState = vks::initializers::pipelineMultisampleStateCreateInfo(VK_SAMPLE_COUNT_1_BIT, 0); + std::vector dynamicStateEnables = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH }; + VkPipelineDynamicStateCreateInfo dynamicState = vks::initializers::pipelineDynamicStateCreateInfo(dynamicStateEnables); + VkPipelineTessellationStateCreateInfo tessellationState = vks::initializers::pipelineTessellationStateCreateInfo(3); - VkPipelineColorBlendAttachmentState blendAttachmentState = - vks::initializers::pipelineColorBlendAttachmentState( - 0xf, - VK_FALSE); - - VkPipelineColorBlendStateCreateInfo colorBlendState = - vks::initializers::pipelineColorBlendStateCreateInfo( - 1, - &blendAttachmentState); - - VkPipelineDepthStencilStateCreateInfo depthStencilState = - vks::initializers::pipelineDepthStencilStateCreateInfo( - VK_TRUE, - VK_TRUE, - VK_COMPARE_OP_LESS_OR_EQUAL); - - VkPipelineViewportStateCreateInfo viewportState = - vks::initializers::pipelineViewportStateCreateInfo(1, 1, 0); - - VkPipelineMultisampleStateCreateInfo multisampleState = - vks::initializers::pipelineMultisampleStateCreateInfo( - VK_SAMPLE_COUNT_1_BIT, - 0); - - std::vector dynamicStateEnables = { - VK_DYNAMIC_STATE_VIEWPORT, - VK_DYNAMIC_STATE_SCISSOR, - VK_DYNAMIC_STATE_LINE_WIDTH - }; - VkPipelineDynamicStateCreateInfo dynamicState = - vks::initializers::pipelineDynamicStateCreateInfo( - dynamicStateEnables.data(), - static_cast(dynamicStateEnables.size()), - 0); - - VkPipelineTessellationStateCreateInfo tessellationState = - vks::initializers::pipelineTessellationStateCreateInfo(3); - - // Tessellation pipeline // Load shaders std::array shaderStages; shaderStages[0] = loadShader(getShadersPath() + "displacement/base.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); @@ -292,6 +217,7 @@ public: pipelineCI.pStages = shaderStages.data(); pipelineCI.pVertexInputState = vkglTF::Vertex::getPipelineVertexInputState({ vkglTF::VertexComponent::Position, vkglTF::VertexComponent::Normal, vkglTF::VertexComponent::UV }); + // Tessellation pipelines // Solid pipeline VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.solid)); if (deviceFeatures.fillModeNonSolid) { @@ -306,88 +232,54 @@ public: void prepareUniformBuffers() { // Tessellation evaluation shader uniform buffer - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - &uniformBuffers.tessEval, - sizeof(uboTessEval))); - - // Tessellation control shader uniform buffer - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - &uniformBuffers.tessControl, - sizeof(uboTessControl))); - + VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &uniformBuffer, sizeof(UniformData))); // Map persistent - VK_CHECK_RESULT(uniformBuffers.tessControl.map()); - VK_CHECK_RESULT(uniformBuffers.tessEval.map()); - - updateUniformBuffers(); + VK_CHECK_RESULT(uniformBuffer.map()); } void updateUniformBuffers() { - uboTessEval.projection = camera.matrices.perspective; - uboTessEval.modelView = camera.matrices.view; - uboTessEval.lightPos.y = -0.5f - uboTessEval.tessStrength; - memcpy(uniformBuffers.tessEval.mapped, &uboTessEval, sizeof(uboTessEval)); - + uniformData.projection = camera.matrices.perspective; + uniformData.modelView = camera.matrices.view; + uniformData.lightPos.y = -0.5f - uniformData.tessStrength; // Tessellation control - float savedLevel = uboTessControl.tessLevel; - if (!displacement) - { - uboTessControl.tessLevel = 1.0f; + float savedLevel = uniformData.tessLevel; + // If displacement is unchecked, we simply set the tessellation level to 1.0f, which disables tessellation + if (!displacement) { + uniformData.tessLevel = 1.0f; } - - memcpy(uniformBuffers.tessControl.mapped, &uboTessControl, sizeof(uboTessControl)); - - if (!displacement) - { - uboTessControl.tessLevel = savedLevel; + memcpy(uniformBuffer.mapped, &uniformData, sizeof(UniformData)); + if (!displacement) { + uniformData.tessLevel = savedLevel; } } - void draw() - { - VulkanExampleBase::prepareFrame(); - - // Command buffer to be submitted to the queue - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; - - // Submit to queue - VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); - - VulkanExampleBase::submitFrame(); - } - void prepare() { VulkanExampleBase::prepare(); loadAssets(); prepareUniformBuffers(); - setupDescriptorSetLayout(); + setupDescriptors(); preparePipelines(); - setupDescriptorPool(); - setupDescriptorSet(); buildCommandBuffers(); prepared = true; } + void draw() + { + VulkanExampleBase::prepareFrame(); + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; + VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); + VulkanExampleBase::submitFrame(); + } + virtual void render() { if (!prepared) return; - draw(); - if (camera.updated) { - updateUniformBuffers(); - } - } - - virtual void viewChanged() - { updateUniformBuffers(); + draw(); } virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay) @@ -396,10 +288,10 @@ public: if (overlay->checkBox("Tessellation displacement", &displacement)) { updateUniformBuffers(); } - if (overlay->inputFloat("Strength", &uboTessEval.tessStrength, 0.025f, 3)) { + if (overlay->inputFloat("Strength", &uniformData.tessStrength, 0.025f, 3)) { updateUniformBuffers(); } - if (overlay->inputFloat("Level", &uboTessControl.tessLevel, 0.5f, 2)) { + if (overlay->inputFloat("Level", &uniformData.tessLevel, 0.5f, 2)) { updateUniformBuffers(); } if (deviceFeatures.fillModeNonSolid) { diff --git a/shaders/glsl/displacement/base.frag b/shaders/glsl/displacement/base.frag index 4f18178e..1d3cb1ba 100644 --- a/shaders/glsl/displacement/base.frag +++ b/shaders/glsl/displacement/base.frag @@ -1,6 +1,6 @@ #version 450 -layout (binding = 2) uniform sampler2D colorMap; +layout (binding = 1) uniform sampler2D colorMap; layout (location = 0) in vec3 inNormal; layout (location = 1) in vec2 inUV; diff --git a/shaders/glsl/displacement/base.frag.spv b/shaders/glsl/displacement/base.frag.spv index 3d35236f9c9e6408e517879ab907967ae58dea8c..c6e57c8c405d38dc942cd56b2232776201466f8f 100644 GIT binary patch literal 2104 zcmYk7Nl#Q!5Js;y4G5?p0wN9|&LEE9JfI+=fG82y2n}`u-3Ho)D|O-4mA}Zn|HqAq z=e&NEyxXbV`o5a(t-3E=+CSQs(!SK0+S5vEuAa0XCc(94``p6H!o*%Qje(6ljNJRv`*<9rUw6*QE7s{@*Vj3l z_XxW+<;^R$7jlD4|0uiu)+w&QLwNRK(9eARxs#mv#P-f*{Xur~*#rHLvztp^f3dxl z>jR%=A4Xi>vxto!f%mND4EtGh;{#tnw_fzkS!oaKtiy=-4*z5hQ86~ zw#@GySf3E>VS9isF3J?I((^b2m*@WrQ)c%}&ff1XW-azRD`LNwBKG?T>>d0Lir8;J z{E+~7txKm zfJDqCbYnb^G5W|wzsAvhH(&GqT|t+N{!O4;&;DsMhcl9o9M{o(Ymwsyx?I?AqBm#K zmi6lv*qn2SzS^VSBzn}-&w9QAd3ERSyNuiq(ajzB5xQsjmG}8^W;50rZCUT1pj*RU zX!m{p%;!6e?%RHXSkLz*XMX4Z6!8p!pP}pXJ&&J3*GFC--;}*8zNzQn;+wJ$`pCzd zdVwylxIC{jjJeLE>*EUUCAyrx!M(~kW0$$VckqABc>T5e4gbi`zliP~^oblx=<=@M lUZcwuYc1zo@tkjRuEZYo-=dq-9LDHluYJ4P{*m<#@*h`8ZB76H literal 1932 zcmZ9LOH&h35QVRVBnVN0Q4mo{K#2;*7a)SXcQd&i~u zg@-6ExD*cJ@R*IBtu2Mbt~rSoG$v zn51@UWLEr7Y&Ky27jaxTgJ)uxJMeBz59ZB+R~4TdsmXUs24{D?E#L0Q88Hgl;Vs4;`9+zGy%%L@;4{h&_f$p>YUG?Z z_%oWpl6>AD8uIZ5;D}FupUJ4f@Una~-=ptW2q+;Kjao={!M27OYS^IVm5<8+Qg&TPraL+S{ zwFdbcK>q>Ra1{%_Vfv7BtNHCh>!7{4QRMB`!Yp|sWgYN4+1}n_c91m}TCJ=@?l62~ z=(StR>~54cZrbg%zt1)$NIl&CciIoK=0TqQfF1ev)6BQFiZxm7u7i$>8);TCF|VHIz{#) zZpka|Vjmsm<)IqfiMVGf@w`>6=09cTMa**%yWPxpXY;*cqqUj!VxG;|ezVz&`91uO z;O+gw-W%!NuK&ND#9d|WT2JDK^APpFzbo^hIlsnmCtiKkLM9r z_!C{X%ynPfgSPje*h9>szAG^M7gGmjJ+Z+WrY&aA_9dTr?r{cOb#AeKZn1uDv3~Bz z^Nh~SImD&!ywrVvuk@{De7)wMpqlk2s9+84Q{*(zpMSUaVCG;oj3EJtzvTMd#CoIALkjzw!Y_?KzDPy`RDP? z7q_1NWQ9e&m+_Av;a|Xxe!Q&#$Cq*5;!cby(bwD9)^^`JXmiCp$0f8e zar@Huw^B@AXYDZFtHj0;dEY~u+r@^```DgETwZ;D@5HQoy|U%jpGI3#-|u@1?fIhb z+t^~!_iPmtmtWtv5czZ1=0`vC*wz*|U*ES9{d`i{?y;XGv|Rf3vx2st0mSouh8Bx{ zKF2m+Tz>u43NwEV+x+Oq-)?J*o3FoKVb;G_+3wN5kCtEm3R7tx&YDa7FA!(-I;ijT zQN%a;JE-r`-+M9N>7VR4igx`&zOg3|F?qCS*yqfjMSK^&1-ZS0=MZsodDr zz^!jiaJ+!s&+#IdcyPRgJ&6Q|zB$413U)uot6<{6@fx-qz9ak4Hzzn=$L{BN157+P zrm*Gk?a85U&fnZi+>bi$`3ko89R3HDKf_mW#&00by|`yH&l$go7&C9W)ZKR{U);eA zwt2z*5q7=S$CYpI&hH|!fQY-t+5Hp|H)jdGjQCFE@_hQ{M2$Px^%`GPzWeWCe~CD! d;_h)Cze2>#xsU!DarWi1hQ2xfGVxcD{{WN>*~I_= literal 2648 zcmZ{liEbQ45Qcm0-8GPqgT#a*m~qSj?2k zJO(etAtCX7J>9F-BDYmrRex3gRegXPDuf=MZbn@;8J2 z1F}wvWxfu5$oX^shmHEt;K9MD8q^zWCPj=5H1y?*t}S~VOU)DOyW%>6KS)bEdD?umN|J~$e=zHYeI`2Xuk+!1R} z^dx>N_&#K8mR`W<4?YDr4GW-gVa@pLxdJSH~o`*fh7;G`H9^cg}OoJ>m<9L*Fx)^nHi= z)-t{~;h&?L^%kjM4efbyy66INPJz#dBiiEElka&Mznt=)z;>L6#dSUnqkCN-a-K;x zD$dbAi&*m_@u$${i&^s=+MdL%sqftoTi|yd-SD@mm3wb;^}P#n%k@mMbN=)A^61;Y zy}W>UcJ|_a8548?Z?EU*71{1%e^*RZXBf%$Ku<&!_xdkfoq>n)>=i!HGG zSI~KmF(uFQ!)!0kdk1ZyBHYV<#>H95ddT+iX$ML>TUV+H_0ops(VD0cBw!MnW ztMB(f%(~Z;Ew}znv^Diz{|egm<-S+3#d6=bQcPTa{a(WC=QHdTB=_?sSQpua@K&GAlu zh4c`)T%W!`Tk0?88c5U;iS+ zU*vyiD|F7_g9Z-w-1F|abMJe<-*d8se2serg(^@0}p4G(BYMe`LgTpdOqtd2|9+kWEh58j{c-JA?QXK6o0F3bS@1d z8xjreW8jf~9(1OyUc|9O3;#!8Mv19Kdn-Qy%Na703b2a2fXFGR={)G?tiJ|2dL`~4}Gn!x{1-kBQkcWp#%Fr0j!`tjMb?<16(f;@SM}~zNz!i4a66fOFD&D zvVZCuIOmxHI1k^p2~cmr$-D*7M_uo(xcmA$6cwIW;U*v8tfsCjKf(30a4zPo>tW&* F;1Bb7ST6to delta 623 zcmXw#O-lk%6o$`?-kcz5AX>QTb5XR3h#-g}A&C}YEn7#l5nPxH`_f4(?aOq2NQA#E za4Yn@<;?KRJ?A~|J@?#cFAnFkDStU*=2^fS_p;~i&dj3k>ZKnK{cu)Uxq4NoT~toW z6*I>h4RWbX&-3Hs^j93Z)trav(9$OJ9Qflr8l1Y3?`7g*kc&&f{?-nrBZ@MnAjzX~ zzCitfSPhuUly?R{!I{fATSvH#H^Q0xjUp)8^;_MS=L1So4xob!V diff --git a/shaders/hlsl/displacement/base.frag b/shaders/hlsl/displacement/base.frag index c62eec65..78bda883 100644 --- a/shaders/hlsl/displacement/base.frag +++ b/shaders/hlsl/displacement/base.frag @@ -1,7 +1,8 @@ // Copyright 2020 Google LLC +// Copyright 2023 Sascha Willems -Texture2D textureColorMap : register(t2); -SamplerState samplerColorMap : register(s2); +Texture2D textureColorMap : register(t1); +SamplerState samplerColorMap : register(s1); struct DSOutput { diff --git a/shaders/hlsl/displacement/base.frag.spv b/shaders/hlsl/displacement/base.frag.spv index 918714cd3528fd83f0c0f047d890a721896f8381..7c63170bdc8dfa8f5a9b879c6ff96a0b8d1ce31e 100644 GIT binary patch literal 1268 zcmZ9K%}T6oDbn#2%#9(__}68E-I5@Jnq%nUafLGJg7W*`dEK4 z>TK}I!Eey)e2x7%%JF}5LQ0w9}x<8)rMdD?aKN=rPFPFYQxnpsJFii zPX_JH-eGUB-RehuBE=uKy8XlU02=j+?3r{X-d;LKmCvm~WvAZQ-l%bd0#)rV)0U_Whr49VwpkKE0D+Ot`oIp}EnhZZ)HC?92?zGl?GWcG}p#3s$LaUpIkE zZa;EgLT(Ro}j?AiY#ExD^ig}GBR#x4=%`>S8c^u({i zJ!kLsIL~fw^BTXvu3ue#jotg%`y5e=>}8ZCcI{=6a*YBGqZhha>Gtcl?GtIyre#4g8Uy{W;T?fX>y~7P){^a-HF#j*U-uo8tjQSL} zP%8oJ?*je4)lcG`K^gc?CGb7d{C|8`eb#XnE5JF(o&6o)9QHZmyzT;H)ZcMKbKe8% z_Uw9_^>`m!pDSq(u+{7{X%92a`Rvk#IUfPf8?WDg>qpl2Dz?2F^NOiCXSF|MeGdKt Dn?F>Q literal 2420 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 X-+}#(BEMMsKhzs_%m3r{U4s4xqDrw8 literal 2548 zcmY+^iE>m`5C-5&G8tSGFbTL|oDg?3?tmglSPapS3E9NG25VHR3`r#us(dA%%C~T- zvdaIvbB{Hish;k?yH9WDoI5_YaJ;IHRaG@veV>2pWHnZehfmi3L+eyEReSN=?cIOC zZ!E;G6`BaOLkU(r5_&ZBSm^Q4iFny}YD9*M-u@GbLicP)%<=rhyq6>s`8^SN@aukm z@#x-O#N=w#Ix^Kn{GW`xeXSc?yO!Ao{lml6{=@z+k@-x95B=M9{r4X%KI|PVu6H+A zwpO}p@oC4asv7-TcjNZb>f81nulsEDTQ~1s?{+tC#4@z$eeY=S|6sMPUC*T0NuDJ7c(3Zsf8TekNqu3wsx%_UD4d zJ{|j+nh)P0{CtDug3U%g{&UH#f0(RCxD&q@!uimh3GUQ<_-@(fgViw9x9S0rjxv(#Wv(rzf^S8q1qw%Q8bGa+-toiCwFXFrtPG9#77MoDH>2!#9=;L9ZvMUt@cCpibH0`{_%oG% z94?m``*z89Ik;2vVQ;WIawQ}d?2ddA($Ag5HnXdt%OQ)-+?GQ2S#)N1Eo85?o{pXM z_0ZK2fA$jdMr1M7U1HvhEN0P(`DsW@x)O6aviRbtlS#)B477~-L z#QZ$6{ruVK-OJUG9^~Y6C6h8wdh_xIZ-<=sQuerOYau@LzDNAbu^VFJ=MJuiil6Tk zKQ-TJZ2a8KjZpFP{o<#O&BnHr?B32+$UT!+ov@tj-qLo+Jt%fqE_QEgC*&R$J1ocV z$u}GB`!F5)E&kr#7a_iMe~*v)v8RxsPQ1c$;5_yf3pU^YK={3bCo@LipDq v_g;Mcz35w)TGOak|y1x2U3omp*pZY;C6vX!x49QQz6^ zth5ebkM!2vNe>QY8tvU$rXR@muov}fo&9ugr?ZQA6l2}m7SktL4r?1m*R8XZoYZbF zQ`?n#v$m5W_cM)=Ebgby;eI+>KWH~nzpU+Dn{49(Pb{wj1d_VixxzG*|s^ zoVC{XDo<+rm6ht+!umpWIor=VbNzC4b!ldilkDeYJfB>@e(%xUYISusJ7a6`%vy(? zY_kY5#&ZmPF-V)|8@4FG4YhghVT-u;GF#t&?vK8w&}Vb&HhVO@IqpLDZYJ5;%poZ| zXKmg!^SG3q#|7Y-D?0~em$LmUdry?@xoEf7qTT+KV?T2#TZ8eQ{UzWEd7>+3@(6s< zuB<)sd%i`xa@gmo-aGBO+$Bj-XYcMePaWZB|KVc}ovm@s%etM*E5NypBfko@Zgs}L z2Gw7^_Sd1thW!nA?dr9^33c{ie+yo_diT2mHJ3S*-_B+CRDLIy-QyH}RG%iKTJ+BXdwJUo*H-NR@M{AxBfiW(1?)ecg&ZW+Cx(SSRMeN7$#yW?H zy#;S<=#0G$j18T6KLN(tTf|Po8yh-fXMnMx^A6kr_U-y3@8d4Ky=Zek{bqrF<_*7l z@Yb#E*F5%9c;mH2>>RwY=8f2Sc9DftpRL2kkMl;&g+lw>xyBf3pGPiq=hw%68z5?d9ZteQd zP}d~%YvB9#TkiMRI*j=SX#1Tyl)nY;qdt274&J`BRe7cM`91I)h0DCw=oxF@0QwkP z`Fc5_>hy8#1G%*mwKdy@cb3y)ZN8!1*gmKPl_3gb8=#HQ zCTKI%4{d?A;cfg*sF(kYxd%|ozR_Gp@A%mE_2$xIZDGyF zoVV|&cYN$=^7Z<1C$605vB#a&P>%|r0^>#h3O%DtwTHN|{{O7wUb`SztM zwsJ0OYb`auQ=e_mH<^Gn^|7zT=3Je&R((v>w!Qe0`q79>u5I zOZCS6_5;+shXHt}pK>;;k3FB58=GIO-LL098?vq9_3yP;mg*Dp%dLglY<;obXkV+f z%u&vcM%;33v9(ZNLIvNzon%>pzA(-^oo|f2R$CgoQJube>uU9Sp3i$u`1R_|Yn3Us zrNr%f_X)o>d3U^8y*ZKZkv+H%&6ReZEP{-2M*=SfX>)hN77dtCn>!V@h5H}O=2sQCre+B0k7`4KHYmR7JF{(m(ka1w`%R#2YKy>;Q4-Z zE_HQDE>p+7bJo)3{0+?Vz0v0G#k;Ca-JQ}_N;c=MO+9SB=f?Ty>%I&@_NwllsQak9 zAL^b@-JK}f%~iB}|LT#?9@IUH@xB`eA)nAkkR!i+7VYZVBcJj`m**9GtAH6J_Tz*p`vmu{l+Cvj`BC^V zw2Nwwz}3y6{#ep`lfEPA#tw0dexHrePn%pCBd<2U={v}?3qB0_983D{j+)!|AP+;H zS-bjP$S3^wAs6j~1>OAnA^VE>*bjBjbO7=R`!KTS41EOIbM6K`0{2|nJ?CM#Sm5T9 zhSDsx5956hZV%3P55IP!aQ*CCJRWr)V;=8_x$j=Q{3eS(k#Kc;^o&nI_B6=E2i5KY{EFjQ5-A48-(54mVz0`zg4wVLyqiU0nMa zxH}Q{)5zMz&G#JKTGmiMn{;!kKcDo@&h=z3ppOu74z6sCm*Ae!8bjz8;DMRrJi70d zxOye&))?YFo`hRp-8$x+fQv`p+-F~&d znRM&!<6IBnqsjI*+h74|I3IO)%WssAy1V0D ztV_DP;+}=>u9OP8yWlrH>?e^ud+4W;{icWRUHhA04eNQ=e&a*;uKmV`uHA2ZQTH3K zeuhrG|9GF=hmX--gqz!Y_z7e`p}$|yy|;@6y@GtHppPTJob>bL^L@GuS^E`gdk0q% z23y6hCd@O3-T3o!*_BDa^?|xEnzTXOZg68M>bxYaqevu@@_8B zq32N7=6iYr@}AUB!C!%#i@NXOO~`w)rn@u^8RH{n{#&^$(!t!<+mNw7p3C>;4rILk z+9T&zkj)u$G3VXfzJ{6eRmhzBMb57x8?V3i$oVy7b2``P^Xs|1hMDslkU3-i_W4c7 zc>T3o%Xj-*kY})_KF-rU5Lb4mc0v{W8}Oe(+IK^HA!q6gKY+AVn4jO9{GQZY@GNTspjvHt*b3+ z{vO$y`=MgZKcH)intw#L<`5J$|AZ_aHUErkoOsmy5ZSug%;g+Ef}E}OoU^)q_VgzF zFOWSs=cwo1{uR;|J^c;Yo}zE(@OMbuo{aeiWSn^9|0lBfopUk&ztFWs{*RHn=lltn zc;x>S**I~}Y|Vc|*3}j@|AQQJF4p`ETwB!qFLL*s{|6=>HGN@>6OWqfz^tpyT+Xov z**RO!IjieuPZh9UbA8@^3(nIT!P91lJb% zHz9Y=c{7-J_X;W{$16k-zfTSNx!`u3n7fc&od4h?~6_xGK>Is&fe0yy7wQ!^qA;o4Nd696|Ps@t)iN z<6z=de$AZUD6*L3BlBEukVE?u0Q#6e@*YL*&if>oc$L3itaA)m%y@sROHdhdHr}2fH_7WYp5He-FY8JF3$U1uxG)T*wfQs;y*}pJcDc=@z~wxkolMIuJ$;`S!DAKL!Luj-#Ewf$i;KK zhu;fe;&InUz|NtIN8F3Z-Err^#0T-WcjGRgiyP-2y@YH(k=q$v1QUM?AN2~dn6ZIf zLKe4=$Tf}}xjdV?e%9Vjo{41F_I}dCHiIq}f7{$c7W2`6BU~*0&Y4A?fk>I#H^IfU s`+GA7%|PCz@tfgd5no51fqEhB{cy3ce;auQa=*22fs1`c#k0`=0keI%s{jB1