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 22d7eae..023edc1 100644
Binary files a/app/src/main/assets/shaders/texture.frag.spv and b/app/src/main/assets/shaders/texture.frag.spv differ
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 0000000..22d7eae
Binary files /dev/null and b/app/src/main/assets/shaders/texture_thick.frag.spv differ
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 0000000..acbb2d2
Binary files /dev/null and b/example/src/main/assets/bottom_makeup/base_makeup/press2/direction/test0.png differ
diff --git a/example/src/main/java/com/hmwl/example/MainActivity.java b/example/src/main/java/com/hmwl/example/MainActivity.java
index 5b9820c..121cfcf 100644
--- a/example/src/main/java/com/hmwl/example/MainActivity.java
+++ b/example/src/main/java/com/hmwl/example/MainActivity.java
@@ -7,7 +7,7 @@ public class MainActivity extends FaceActivity{
@Override
protected void onCreate(Bundle savedInstanceState)
{
- SetInitArg("{\"action_fps\":3,\"motion\":{\"png_name\":\"demo\",\"png_num\":1,\"show_type\":\"direction\",\"step\":\"press2\",\"technique\":\"base_makeup\",\"type\":\"bottom_makeup\"},\"zoom\":1.5}");
+ SetInitArg("{\"action_fps\":3,\"motion\":{\"png_name\":\"test\",\"png_num\":1,\"show_type\":\"direction\",\"step\":\"press2\",\"technique\":\"base_makeup\",\"type\":\"bottom_makeup\"},\"zoom\":1.5}");
super.onCreate(savedInstanceState);
//这个是设置接口的参数,采用json传递,可以保证接口灵活性
diff --git a/example/src/main/res/values/strings.xml b/example/src/main/res/values/strings.xml
index e16a3ca..37e4589 100644
--- a/example/src/main/res/values/strings.xml
+++ b/example/src/main/res/values/strings.xml
@@ -1,3 +1,3 @@
- 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;
#