diff --git a/app/src/main/assets/shaders/bg.vert b/app/src/main/assets/shaders/bg.vert index da07cd8..4d90fb5 100644 --- a/app/src/main/assets/shaders/bg.vert +++ b/app/src/main/assets/shaders/bg.vert @@ -45,6 +45,8 @@ layout(push_constant) uniform PushConstants { float radius; float ux; float uy; + float offset_x; + float offset_y; } pushConstants; @@ -55,6 +57,8 @@ void main() { // 获取顶点位置 vec2 position = positions[gl_VertexIndex]; position = position * pushConstants.zoom; + position.x = position.x + (pushConstants.offset_x/480); + position.y = position.y + (pushConstants.offset_y/480); // 设置输出位置(Vulkan使用不同的坐标系) gl_Position = vec4(position, 0.0, 1.0); diff --git a/app/src/main/assets/shaders/bg.vert.spv b/app/src/main/assets/shaders/bg.vert.spv index c90eedd..d26a9d5 100644 Binary files a/app/src/main/assets/shaders/bg.vert.spv and b/app/src/main/assets/shaders/bg.vert.spv differ diff --git a/app/src/main/assets/shaders/texture.vert b/app/src/main/assets/shaders/texture.vert index fe8b0ac..92a3ec8 100644 --- a/app/src/main/assets/shaders/texture.vert +++ b/app/src/main/assets/shaders/texture.vert @@ -24,6 +24,8 @@ layout(push_constant) uniform PushConstants { float radius; float ux; float uy; + float offset_x; + float offset_y; } pushConstants; out gl_PerVertex @@ -37,6 +39,8 @@ void main() vec2 position = vec2(inPos.xy*2 -1); position = position * pushConstants.zoom; + position.x = position.x + (pushConstants.offset_x/480); + position.y = position.y + (pushConstants.offset_y/480); gl_Position = vec4(position, 0.5, 1.0); vec4 pos = ubo.model * vec4(inPos, 1.0); diff --git a/app/src/main/assets/shaders/texture.vert.spv b/app/src/main/assets/shaders/texture.vert.spv index 2084859..357e47a 100644 Binary files a/app/src/main/assets/shaders/texture.vert.spv and b/app/src/main/assets/shaders/texture.vert.spv differ diff --git a/app/src/main/java/com/hmwl/face_sdk/InitArg.java b/app/src/main/java/com/hmwl/face_sdk/InitArg.java index ac6f41d..634c0b1 100644 --- a/app/src/main/java/com/hmwl/face_sdk/InitArg.java +++ b/app/src/main/java/com/hmwl/face_sdk/InitArg.java @@ -8,7 +8,8 @@ public class InitArg { public float g; public float b; public float radius; - + public float offset_x; + public float offset_y; public String toJson() { try { JSONObject jsonObject = new JSONObject(); @@ -18,6 +19,8 @@ public class InitArg { jsonObject.put("g", g); jsonObject.put("b", b); jsonObject.put("radius", radius); + jsonObject.put("offset_x", offset_x); + jsonObject.put("offset_y", offset_y); return jsonObject.toString(); } catch (Exception e) { e.printStackTrace(); diff --git a/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt b/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt index 87217eb..b94d2c9 100644 --- a/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt +++ b/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt @@ -19,7 +19,7 @@ class MakeupActivity : FaceActivity() lateinit var motionMgr: MotionManager private var updateJob: Job? = null override fun onCreate(savedInstanceState: Bundle?) { - motionMgr = MotionManager(this, 10, 1.5f, 0f,0f,1f,240f) + motionMgr = MotionManager(this, 10, 1.5f, 0f,0f,1f,240f, 200f, -200f) super.onCreate(savedInstanceState) // 启动一个生命周期感知的协程, 每10ms 调用一次,可以通过update 来处理业务的逻辑 updateJob = lifecycleScope.launch { diff --git a/example/src/main/java/com/inewme/uvmirror/MotionManager.kt b/example/src/main/java/com/inewme/uvmirror/MotionManager.kt index 56a68c4..3036b60 100644 --- a/example/src/main/java/com/inewme/uvmirror/MotionManager.kt +++ b/example/src/main/java/com/inewme/uvmirror/MotionManager.kt @@ -16,7 +16,7 @@ import java.io.InputStreamReader class MotionManager { var faceActivity:FaceActivity - constructor(activity: FaceActivity, fps: Int, z: Float, r: Float, g: Float, b: Float, radius: Float) { + constructor(activity: FaceActivity, fps: Int, z: Float, r: Float, g: Float, b: Float, radius: Float, offset_x:Float, offset_y: Float) { faceActivity = activity val initArg = InitArg().apply { action_fps = fps @@ -25,6 +25,8 @@ class MotionManager { this.g = g this.b = b this.radius = radius + this.offset_x = offset_x; + this.offset_y = offset_y; } activity.SetInitArg(initArg.toJson()) existMotions = readMotionsFromAssets(activity, "pic/motion_data_ex.json") diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index dbf54e3..0f58589 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -1377,6 +1377,8 @@ void FaceApp::SetInitArg(const char* arg) pushConstants.g = _initArg.g; pushConstants.b = _initArg.b; pushConstants.radius = _initArg.radius; + pushConstants.offset_x = _initArg.offset_x; + pushConstants.offset_y = _initArg.offset_y; } void FaceApp::drawFrame(long long frameTime) diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h index da49e53..266b8cd 100644 --- a/vulkan/FaceApp.h +++ b/vulkan/FaceApp.h @@ -42,8 +42,10 @@ struct InitArg float g; float b; float radius; + float offset_x; + float offset_y; //Motion motion; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(InitArg, action_fps, zoom, r, g, b, radius); + NLOHMANN_DEFINE_TYPE_INTRUSIVE(InitArg, action_fps, zoom, r, g, b, radius, offset_x, offset_y); }; @@ -55,6 +57,8 @@ struct PushConstants { float radius = 240; float ux = 0; float uy = 0; + float offset_x = 0; + float offset_y = 0; }; using Callback = std::function; diff --git a/vulkan/main.cpp b/vulkan/main.cpp index 602e03b..c9a0400 100644 --- a/vulkan/main.cpp +++ b/vulkan/main.cpp @@ -154,6 +154,8 @@ int main() { init_arg.g = 0; init_arg.b = 0; init_arg.radius = 240; + init_arg.offset_x = 100; + init_arg.offset_y = -100; string json_str = json(init_arg).dump();