From 10505c616f80cb69a6450e5a9c155bd40fb53417 Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Mon, 27 Oct 2025 21:48:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E5=8D=95=E7=BA=B9?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E5=9C=A8android=E4=B8=8A=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E9=80=9A=E8=BF=87=EF=BC=8Capk=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/shaders/texture.frag | 41 +----- app/src/main/assets/shaders/texture.frag.spv | Bin 1732 -> 732 bytes .../main/assets/shaders/texture_thick.frag | 56 ++++++++ .../assets/shaders/texture_thick.frag.spv | Bin 0 -> 1732 bytes compile_shader.bat | 3 + example/build.gradle | 2 +- .../base_makeup/press2/direction/test0.png | Bin 0 -> 15207 bytes .../java/com/hmwl/example/MainActivity.java | 2 +- example/src/main/res/values/strings.xml | 2 +- vulkan/FaceApp.cpp | 131 +++++++++++++----- vulkan/FaceApp.h | 1 + vulkan/main.cpp | 2 +- 12 files changed, 158 insertions(+), 82 deletions(-) create mode 100644 app/src/main/assets/shaders/texture_thick.frag create mode 100644 app/src/main/assets/shaders/texture_thick.frag.spv create mode 100644 example/src/main/assets/bottom_makeup/base_makeup/press2/direction/test0.png diff --git a/app/src/main/assets/shaders/texture.frag b/app/src/main/assets/shaders/texture.frag index d703133..79cefca 100644 --- a/app/src/main/assets/shaders/texture.frag +++ b/app/src/main/assets/shaders/texture.frag @@ -1,7 +1,6 @@ #version 450 layout (binding = 1) uniform sampler2D samplerColor; -layout (binding = 2) uniform sampler2D samplerColor_ex; layout (location = 0) in vec2 inUV; layout (location = 1) in vec3 inNormal; @@ -12,45 +11,7 @@ layout (location = 0) out vec4 outFragColor; void main() { vec4 color = texture(samplerColor, inUV); - vec4 color_ex = texture(samplerColor_ex, inUV); - vec3 N = normalize(inNormal); + outFragColor = color; - // 计算与 (0,0,1) 的点乘 - float ndot = dot(N, vec3(0.0, 0.0, -1.0)); - - // 保证结果 >= 0 - ndot = max(ndot, 0.0); - - // 重新映射ndot值,让中间2/3部分进行融合 - // 当ndot在[0.166, 0.833]范围内时进行混合,两端保持不变 - float blendFactor; - if (ndot < 0.0) { - blendFactor = 0.0; // 完全使用color_ex - } else if (ndot > 0.1) { - blendFactor = 1.0; // 完全使用color - } else { - // 在中间2/3部分进行平滑过渡 - blendFactor = (ndot - 0.0) / (1 - 0); - } - - // 使用smoothstep创建中间2/3的融合区域 - // 参数说明:smoothstep(edge0, edge1, x) - // 当x < edge0时返回0,当x > edge1时返回1,在中间时平滑过渡 - //float blendFactor = smoothstep(0.166, 0.833, ndot); - - - // vec4 blendedColor = mix(color_ex, color, ndot); - - // outFragColor = blendedColor; - - if (ndot < 0.3){ - outFragColor = color_ex; - } - else - { - outFragColor = color; - } - -// outFragColor = vec4(1, 0, 0, 1); } \ No newline at end of file diff --git a/app/src/main/assets/shaders/texture.frag.spv b/app/src/main/assets/shaders/texture.frag.spv index 22d7eaec0c2e87b16b84290a273d2fe20f4dd268..023edc11ea515c1a8e3be93abd56ab8e1017dcfc 100644 GIT binary patch delta 218 zcmX@Ydxw>mnMs+Qfq{{Mn}LHtY9g;Ut0)5lgXF~6R5dmR5Hr8D#H}bX-8nxezX-@> zUs4=3P2GNAdeY{f%Y(1L-`=1 zL1N-SzBrI(gYrS@C4g*3upC4^h!3)oadIlN{^TpnE(#!%#DJI+i0y#pfJ_7N{{r<{ G05Jei92b}X literal 1732 zcmZ9M%T7~K6o$7z5v6hw1QC@2-a)(pq6kz`m=GpL9hwS_At|jXHE~Gd#0PMKPhy;y zIL7Dkl9>2?=bUX$Jjr6M|6kX=_Ac#hlSe~161qcIcpTENKeWLFxXwhcZ#>K6N z0=-w+eN(G8S2H@vv;I!~*>e=Q5C+jn-plH{l`u56GE6;pE_Tl){&u0|lo7Ul9IfB_ z`7h#8>UHBV&irB)B)6Dh&+KQvUbOX`%lJODwd9Q#y92qH@0tC~A3>Y%>oWfgI-NDe zXTjzgXTI1S$r)cl$1_iXtu=}GMSLMa`(LN=TIV8SjG}Ll>93(<{4MP7hlfiM&w)eO zUx|1T^y%PW+5Rio&h8A(CoUs$^Sm7Q;$8U3{e&r?jrDGP|1nqWyN=jh_;w>MVUPcZ zeXIJHsOKH^Al{GIJ2;8B{}*&MZU8Yxewm5vFBkKNu)Uv{Ka8EvKMgiU-hAhkGv3|$ zcD+@b? zo?Ohkif!I!`lR5`}v$V&TtjBF^ zIp35$X3>83(02!!N35eAd-&$;VZ1(LVvoDn_IRJ|YXMu%xjtmvJ#2aF#F}#Xn%2&r z!}G)*_p$T4dH|O5?R$=8w4dkDw}d=GoK@R8zPE>nZ^RkO8MdeS#+nmjSFwGMF;<+9 LHRlgEy@31$n?-cE diff --git a/app/src/main/assets/shaders/texture_thick.frag b/app/src/main/assets/shaders/texture_thick.frag new file mode 100644 index 0000000..d703133 --- /dev/null +++ b/app/src/main/assets/shaders/texture_thick.frag @@ -0,0 +1,56 @@ +#version 450 + +layout (binding = 1) uniform sampler2D samplerColor; +layout (binding = 2) uniform sampler2D samplerColor_ex; + +layout (location = 0) in vec2 inUV; +layout (location = 1) in vec3 inNormal; + + +layout (location = 0) out vec4 outFragColor; + +void main() +{ + vec4 color = texture(samplerColor, inUV); + vec4 color_ex = texture(samplerColor_ex, inUV); + + vec3 N = normalize(inNormal); + + // 计算与 (0,0,1) 的点乘 + float ndot = dot(N, vec3(0.0, 0.0, -1.0)); + + // 保证结果 >= 0 + ndot = max(ndot, 0.0); + + // 重新映射ndot值,让中间2/3部分进行融合 + // 当ndot在[0.166, 0.833]范围内时进行混合,两端保持不变 + float blendFactor; + if (ndot < 0.0) { + blendFactor = 0.0; // 完全使用color_ex + } else if (ndot > 0.1) { + blendFactor = 1.0; // 完全使用color + } else { + // 在中间2/3部分进行平滑过渡 + blendFactor = (ndot - 0.0) / (1 - 0); + } + + // 使用smoothstep创建中间2/3的融合区域 + // 参数说明:smoothstep(edge0, edge1, x) + // 当x < edge0时返回0,当x > edge1时返回1,在中间时平滑过渡 + //float blendFactor = smoothstep(0.166, 0.833, ndot); + + + // vec4 blendedColor = mix(color_ex, color, ndot); + + // outFragColor = blendedColor; + + if (ndot < 0.3){ + outFragColor = color_ex; + } + else + { + outFragColor = color; + } + +// outFragColor = vec4(1, 0, 0, 1); +} \ No newline at end of file diff --git a/app/src/main/assets/shaders/texture_thick.frag.spv b/app/src/main/assets/shaders/texture_thick.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..22d7eaec0c2e87b16b84290a273d2fe20f4dd268 GIT binary patch literal 1732 zcmZ9M%T7~K6o$7z5v6hw1QC@2-a)(pq6kz`m=GpL9hwS_At|jXHE~Gd#0PMKPhy;y zIL7Dkl9>2?=bUX$Jjr6M|6kX=_Ac#hlSe~161qcIcpTENKeWLFxXwhcZ#>K6N z0=-w+eN(G8S2H@vv;I!~*>e=Q5C+jn-plH{l`u56GE6;pE_Tl){&u0|lo7Ul9IfB_ z`7h#8>UHBV&irB)B)6Dh&+KQvUbOX`%lJODwd9Q#y92qH@0tC~A3>Y%>oWfgI-NDe zXTjzgXTI1S$r)cl$1_iXtu=}GMSLMa`(LN=TIV8SjG}Ll>93(<{4MP7hlfiM&w)eO zUx|1T^y%PW+5Rio&h8A(CoUs$^Sm7Q;$8U3{e&r?jrDGP|1nqWyN=jh_;w>MVUPcZ zeXIJHsOKH^Al{GIJ2;8B{}*&MZU8Yxewm5vFBkKNu)Uv{Ka8EvKMgiU-hAhkGv3|$ zcD+@b? zo?Ohkif!I!`lR5`}v$V&TtjBF^ zIp35$X3>83(02!!N35eAd-&$;VZ1(LVvoDn_IRJ|YXMu%xjtmvJ#2aF#F}#Xn%2&r z!}G)*_p$T4dH|O5?R$=8w4dkDw}d=GoK@R8zPE>nZ^RkO8MdeS#+nmjSFwGMF;<+9 LHRlgEy@31$n?-cE literal 0 HcmV?d00001 diff --git a/compile_shader.bat b/compile_shader.bat index 3ea63b7..4093d63 100644 --- a/compile_shader.bat +++ b/compile_shader.bat @@ -4,5 +4,8 @@ glslangValidator -V app/src/main/assets/shaders/bg.vert -o app/src/main/assets/s glslangValidator -V app/src/main/assets/shaders/texture.frag -o app/src/main/assets/shaders/texture.frag.spv glslangValidator -V app/src/main/assets/shaders/texture.vert -o app/src/main/assets/shaders/texture.vert.spv +glslangValidator -V app/src/main/assets/shaders/texture_thick.frag -o app/src/main/assets/shaders/texture_thick.frag.spv +glslangValidator -V app/src/main/assets/shaders/texture_thick.vert -o app/src/main/assets/shaders/texture_thick.vert.spv + glslangValidator -V app/src/main/assets/shaders/simple_shader.frag -o app/src/main/assets/shaders/simple_shader.frag.spv glslangValidator -V app/src/main/assets/shaders/simple_shader.vert -o app/src/main/assets/shaders/simple_shader.vert.spv \ No newline at end of file diff --git a/example/build.gradle b/example/build.gradle index d2068a6..fba46c6 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -7,7 +7,7 @@ android { compileSdk 36 defaultConfig { - applicationId "com.hmwl.example" + applicationId "com.hmwl.f20251028" minSdk 30 targetSdk 36 versionCode 1 diff --git a/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/test0.png b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/test0.png new file mode 100644 index 0000000000000000000000000000000000000000..acbb2d28ffb18c17bb91b261b9a41e1f2d4bc35a GIT binary patch literal 15207 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 - example + f20251028 \ No newline at end of file diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index 2955d65..a4b8378 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -360,9 +360,20 @@ void FaceApp::create_face_pipelines() viewportState.scissorCount = 1; viewportState.pScissors = &scissor; + std::vector vertShaderCode; + std::vector fragShaderCode; + if (kThick) + { + vertShaderCode = readFile("shaders/texture_thick.vert.spv"); + fragShaderCode = readFile("shaders/texture_thick.frag.spv"); + } + else + { + vertShaderCode = readFile("shaders/texture.vert.spv"); + fragShaderCode = readFile("shaders/texture.frag.spv"); + } - auto vertShaderCode = readFile("shaders/texture.vert.spv"); - auto fragShaderCode = readFile("shaders/texture.frag.spv"); + VkShaderModule vertShaderModule = createShaderModule(this->device, vertShaderCode); VkShaderModule fragShaderModule = createShaderModule(this->device, fragShaderCode); @@ -492,22 +503,38 @@ void FaceApp::setup_descriptor_set_layout() set_layout_binding_fragment.binding = 1; set_layout_binding_fragment.descriptorCount = 1; - // 添加第二个纹理绑定点 - VkDescriptorSetLayoutBinding set_layout_binding_fragment1{}; - set_layout_binding_fragment1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - set_layout_binding_fragment1.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - set_layout_binding_fragment1.binding = 2; - set_layout_binding_fragment1.descriptorCount = 1; + if (kThick) + { + // 添加第二个纹理绑定点 + VkDescriptorSetLayoutBinding set_layout_binding_fragment1{}; + set_layout_binding_fragment1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + set_layout_binding_fragment1.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + set_layout_binding_fragment1.binding = 2; + set_layout_binding_fragment1.descriptorCount = 1; - std::vector set_layout_bindings{ set_layout_binding_vertex , set_layout_binding_fragment, set_layout_binding_fragment1 }; + std::vector set_layout_bindings{ set_layout_binding_vertex , set_layout_binding_fragment, set_layout_binding_fragment1 }; - VkDescriptorSetLayoutCreateInfo descriptor_layout{}; - descriptor_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptor_layout.pBindings = set_layout_bindings.data(); - descriptor_layout.bindingCount = static_cast(set_layout_bindings.size()); + VkDescriptorSetLayoutCreateInfo descriptor_layout{}; + descriptor_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptor_layout.pBindings = set_layout_bindings.data(); + descriptor_layout.bindingCount = static_cast(set_layout_bindings.size()); - VK_CHECK(vkCreateDescriptorSetLayout(device, &descriptor_layout, nullptr, &m_descriptorSetLayout)); + VK_CHECK(vkCreateDescriptorSetLayout(device, &descriptor_layout, nullptr, &m_descriptorSetLayout)); + } + else + { + + std::vector set_layout_bindings{ set_layout_binding_vertex , set_layout_binding_fragment }; + + + VkDescriptorSetLayoutCreateInfo descriptor_layout{}; + descriptor_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptor_layout.pBindings = set_layout_bindings.data(); + descriptor_layout.bindingCount = static_cast(set_layout_bindings.size()); + + VK_CHECK(vkCreateDescriptorSetLayout(device, &descriptor_layout, nullptr, &m_descriptorSetLayout)); + } VkPipelineLayoutCreateInfo pipeline_layout_create_info{}; @@ -550,12 +577,6 @@ void FaceApp::setup_descriptor_set() image_descriptor.sampler = m_texs[i].sampler; image_descriptor.imageLayout = m_texs[i].image_layout; - // 第二个纹理描述符 - 假设你的第二个纹理变量名为 tex_demo1 - VkDescriptorImageInfo image_descriptor1; - image_descriptor1.imageView = m_texs_ex[i].view; - image_descriptor1.sampler = m_texs_ex[i].sampler; - image_descriptor1.imageLayout = m_texs_ex[i].image_layout; - VkWriteDescriptorSet write_descriptor_set_uniform{}; write_descriptor_set_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write_descriptor_set_uniform.dstSet = m_descriptor_sets[i]; @@ -573,23 +594,51 @@ void FaceApp::setup_descriptor_set() write_descriptor_set_image.pImageInfo = &image_descriptor; write_descriptor_set_image.descriptorCount = 1; - // 添加第二个纹理的写入描述符 - VkWriteDescriptorSet write_descriptor_set_image1{}; - write_descriptor_set_image1.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_descriptor_set_image1.dstSet = m_descriptor_sets[i]; - write_descriptor_set_image1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - write_descriptor_set_image1.dstBinding = 2; // 绑定到位置2 - write_descriptor_set_image1.pImageInfo = &image_descriptor1; - write_descriptor_set_image1.descriptorCount = 1; - - std::vector write_descriptor_sets = + if (kThick) { - write_descriptor_set_uniform, - write_descriptor_set_image, - write_descriptor_set_image1, // 添加第二个纹理 - }; + // 第二个纹理描述符 - 假设你的第二个纹理变量名为 tex_demo1 + VkDescriptorImageInfo image_descriptor1; + image_descriptor1.imageView = m_texs_ex[i].view; + image_descriptor1.sampler = m_texs_ex[i].sampler; + image_descriptor1.imageLayout = m_texs_ex[i].image_layout; - vkUpdateDescriptorSets(device, static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL); + // 添加第二个纹理的写入描述符 + VkWriteDescriptorSet write_descriptor_set_image1{}; + write_descriptor_set_image1.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + write_descriptor_set_image1.dstSet = m_descriptor_sets[i]; + write_descriptor_set_image1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + write_descriptor_set_image1.dstBinding = 2; // 绑定到位置2 + write_descriptor_set_image1.pImageInfo = &image_descriptor1; + write_descriptor_set_image1.descriptorCount = 1; + + std::vector write_descriptor_sets = + { + write_descriptor_set_uniform, + write_descriptor_set_image, + write_descriptor_set_image1, // 添加第二个纹理 + }; + + vkUpdateDescriptorSets(device, static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL); + } + else + { + std::vector write_descriptor_sets = + { + write_descriptor_set_uniform, + write_descriptor_set_image, + }; + + vkUpdateDescriptorSets(device, static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL); + } + + + + + + + + + } @@ -1099,13 +1148,19 @@ void FaceApp::changeMotion(Motion& motion) { string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type; string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png"; - string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png"; #ifdef _WIN32 loadTextureExample(path_name, m_texs[i], true); - loadTextureExample(path_name_ex, m_texs_ex[i], true); + if (kThick) + { + string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png"; + loadTextureExample(path_name_ex, m_texs_ex[i], true); + } #else loadTexture(path_name, m_texs[i], true); - loadTexture(path_name, m_texs_ex[i], true); + if (kThick) + { + loadTexture(path_name, m_texs_ex[i], true); + } #endif // _WIN32 diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h index 47b9021..bff2b65 100644 --- a/vulkan/FaceApp.h +++ b/vulkan/FaceApp.h @@ -83,6 +83,7 @@ private: void setup_descriptor_pool(); void setup_descriptor_set_layout(); void setup_descriptor_set(); + const bool kThick = false; void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); VkCommandBuffer beginSingleTimeCommands(); diff --git a/vulkan/main.cpp b/vulkan/main.cpp index ee04497..10edb1d 100644 --- a/vulkan/main.cpp +++ b/vulkan/main.cpp @@ -9,7 +9,7 @@ int main() { motion.technique = "base_makeup"; motion.step = "press2"; motion.show_type = "direction"; - motion.png_name = "demo"; + motion.png_name = "test"; motion.png_num = 1; #