From 60b40bfd5fdd07c944ee5468fe5e2558def4800c Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Thu, 8 Jan 2026 21:19:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=86=E5=BF=83=E9=81=AE?= =?UTF-8?q?=E7=BD=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/shaders/bg.frag | 30 +++++++++++++++++-- app/src/main/assets/shaders/bg.frag.spv | Bin 564 -> 1760 bytes app/src/main/assets/shaders/bg.vert | 10 +++++-- app/src/main/assets/shaders/bg.vert.spv | Bin 1764 -> 2008 bytes app/src/main/assets/shaders/texture.frag | 29 ++++++++++++++---- app/src/main/assets/shaders/texture.frag.spv | Bin 1544 -> 2468 bytes app/src/main/assets/shaders/texture.vert | 8 +++-- app/src/main/assets/shaders/texture.vert.spv | Bin 2376 -> 2540 bytes vulkan/FaceApp.cpp | 20 ++++++++----- vulkan/FaceApp.h | 17 +++++++++-- vulkan/main.cpp | 4 +++ 11 files changed, 96 insertions(+), 22 deletions(-) diff --git a/app/src/main/assets/shaders/bg.frag b/app/src/main/assets/shaders/bg.frag index ee29b3d..52a3257 100644 --- a/app/src/main/assets/shaders/bg.frag +++ b/app/src/main/assets/shaders/bg.frag @@ -9,7 +9,33 @@ layout(location = 0) out vec4 outColor; // 纹理采样器 layout(binding = 0) uniform sampler2D texSampler; +layout(push_constant) uniform PushConstants { + float zoom; + float r; + float g; + float b; + float radius; + float ux; + float uy; +} pushConstants; + void main() { - // 采样纹理 - outColor = texture(texSampler, inTexCoord); + // outFragColor = color; + // 获取当前片元的屏幕坐标(左下角为原点) + vec2 fragCoord = gl_FragCoord.xy; + + // 屏幕中心(480x480 的中心是 (240, 240)) + vec2 center = vec2(240.0, 240.0); + + // 计算到中心的距离(欧氏距离,单位:像素) + float dist = length(fragCoord - center); + + // 判断是否在半径之外 + if (dist > pushConstants.radius) { + // 使用 push constant 中的 RGB 颜色(注意 alpha 设为 1.0) + outColor = vec4(pushConstants.r, pushConstants.g, pushConstants.b, 1.0); + } else { + // 采样纹理 + outColor = texture(texSampler, inTexCoord); + } } \ No newline at end of file diff --git a/app/src/main/assets/shaders/bg.frag.spv b/app/src/main/assets/shaders/bg.frag.spv index 8642dc5704b508f079a488ae44f9ab3ac07cefba..dcb02d294b87bcef7a25c023132402dac7ab52f4 100644 GIT binary patch literal 1760 zcmZ{jTTc^V5QZ0OD++RulZavq3Mz=GfFK^CO~eZlNigx!R9mqLbV&~hdS&9j^3p%$ zAu;iJw)@G(#4nkAGw;m2-^}c6u6OQq6!k>?QD5{h>YkCP7bF5JB=`2t-p+EXU0q&X zTQOoV$|Zru43T$=TRE)M8#)G%d1MnACRQJhpygnWqHiSTL9;n|kTdw+H!J()IBr(a z^Sm$D{=u8)892!u0)JO)v}?^S*C=+i-fD9tc~jiGoz{nP+-S8cjdlyWfJfZ(DUJ`l z3sfOyFHrrpt#dzP+wt4P?s8arvr?^hAPyXPu+H&`UC{p6t!Enj=%0G***V3Xb~!$X zeI6tqt#h|)$9t8-ql0dL`DB*$#;e+KI-G6lb~gQpv)E>~_F>&GGJVcrdje*kV%8rp zbHw^GnEi_RMu;;$iUW&a4L!-%4%!6kEhL)*ks{$Z?)K zygS3@I(zf}C+1wl?~WVmyV~xB*f{nj?jjQE(7ud>x}Ax!zA;9(C2o1Iap#cGkM?|u z*^fL6NS5~|w(|=9Tj+9x{#VeW=<|~)Uc86qo91Uvu&2pf#bKQFtffI>_NnbR_vqi? zHrM&-*Y=x>tut@yvS*Jq{Qz;#jP=_(gOIE3{s-IdGMd_th<7IE5WnwBqKq3%F>#OY zKISEP^{LD0H4Du z#GUZFhnOO|_*Y^|+_Q*zMdUl2SGhgE;MC{8cNcMP>Vf+@y4(v$;J$$_9%2^Jjd4Fh z%o4hIh*?HA#+?Z0RC}#2E3wCzj=t_cxQ@K>h&JR%PY@ literal 564 zcmY+AO-n*y5QQi0s%80+QA7}0dvQ?_L~UHSac9t4(1oDhup9XM`c-X$p68}y19Rs+ z=RI@YnOiK}lq2?{8kIPW-)KewCg4hW9Sldq?t3=r-rn_8)S{RR)zqUL`&4r=o-MsN zAe&?Zojeb4D&iXPNmBy5t50C;Nk6iFI!{*|VUjqeX4Ca(ym*^WVdeClEnlYVewwZ( z5d)m;y&?^Q> z(;QOOv+BRt;!BiOZq(^_v{A|FCw2$J_v=*soKt;+s+YWau{+7#^N-XytKm#vFbVYu f);DUT{$f2&Nc&$=xl@Z&BmazpyUBg?!UOpOM^znV diff --git a/app/src/main/assets/shaders/bg.vert b/app/src/main/assets/shaders/bg.vert index 5ff8f1b..da07cd8 100644 --- a/app/src/main/assets/shaders/bg.vert +++ b/app/src/main/assets/shaders/bg.vert @@ -38,7 +38,13 @@ const vec2 texCoords[6] = vec2[6]( // 定义 Push Constant,只有一个 float layout(push_constant) uniform PushConstants { - float myValue; + float zoom; + float r; + float g; + float b; + float radius; + float ux; + float uy; } pushConstants; @@ -48,7 +54,7 @@ layout(location = 0) out vec2 outTexCoord; void main() { // 获取顶点位置 vec2 position = positions[gl_VertexIndex]; - position = position * pushConstants.myValue; + position = position * pushConstants.zoom; // 设置输出位置(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 f2616950c8816ebb4ddf2f07fcb4c6a68718c940..c90eeddfae2f360861477f806ed17c42664c177e 100644 GIT binary patch delta 303 zcmaFDdxL+%gZirc{9FbgU}IomkO$I?KwN~xX9BX*k@(C&b`qG+3RceoWEUl-WR?~q z%wPqIl~y45Y#@Fm0|P727DXVtptLx{IX|zsBr$K|@3-|HKna-D%0Ow5kuWik^&l}0 zBr%W^Kw>;dVjw*rF##kokTXDHB1mE&r+~yHfY_aZnL&$zVe@;&(~Q!bU?+g2G4STS H%<9YltV|r6 delta 33 pcmcb?|AcqK1NPj?u*96w)Xm pushConstants.radius) { + // 使用 push constant 中的 RGB 颜色(注意 alpha 设为 1.0) + outFragColor = vec4(pushConstants.r, pushConstants.g, pushConstants.b, 1.0); + } else { + vec2 pos = vec2(pushConstants.ux/4096.f, pushConstants.uy/2048.f); + vec2 uv = pos + vec2(inUV.x/8.f, inUV.y/4.f); + vec4 color = texture(samplerColor, uv); + outFragColor = color; + } } \ 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 c9188ac42a7ae14c59173591f17f69378c2a4ee1..0c4f42b49ddb09ab3924102ada602fb2f8d8b7a0 100644 GIT binary patch literal 2468 zcmZ{kYj0Fl6o$79Q$dgd zrQ2F=W?6R;xlRq{TVDD3N`=m2hv6SDb^1%)BG(A|V!PL8$>a90E)06VHnUEz-|F;x z=tEfK{hnsos_PI{$k`96{?)B>xuViJo;JJ+-BYHP*VSz?{-Cg3b*+0!}L_ZQ$8+~ht0*6ED)13z_VP}S{u6j+;f^@G4q-Fv9N_7OU?-qHLv7X9u* zcFzXbjlXwQUB3ppeaQ*!@3CsPAMMW2-128j-M;0HqU&qVoM`hHvo+5)AScYRoi+B| z&r5Lr#{D0R`4GErMql?;_nyh^ME{7j0iq7|eIV*~Ci=R^4!Rv>HSZ^^H4y!%kC&YN znCB3v<~@S$yuyAQ*&NaT3FMU4E{1&)&9e{tSDMq>OxV9hv#zk8)11l9-(k?t_&cSOob{{c51Q5c^%JZ4oS**pSPdA#ojfN#Wi5IzlL z`Iq>NvK|D+HNaow{Fv466*;wyfiHk_R*u}CBAfdVh}?&f<-_MFvOd0-@HvJoA3hVv z`uK*z=QCva1*YZ9KL_SER-5n3{>NFh{X=cmZH?9%xlbaSdlE$MQ^@i!=--*026Dd1 zh&zL9obNK?&LYc4+<9a<-|9knZWoZvr_K7jTXN>`+^2w?`}i)e0MFC+8vD$aeC+cL zy4)OyxNnh-y9y$19$7x(t|QC&mZQEK$mY}btgLwfc?xK=X79h8d403@z}-@}hwp(t i_lWmwe#qs5H{SOmXT0_wfn1!IdiA_Kx7Xb4)8GvdZIf;Q literal 1544 zcmZ9LSx-|@6h@D95Jee8Kt!=nXS7a$C~6=C>jN<)Mtp9RXp^?L>0smy-~3(vDql=o z>-L`H#*^&q{e62pcb{7rtDX(vOqdAc;Z+!&nJ@+u;L544AAC5d^#@;S>l=@am<)w9 z(3mOmifEn44C-TkkY{jM7GeKdpUG5%L zot(&d4>`Y0p{}Jz!@Hm^!?0cUc+`Sea`GR rm9wsUe}=g8c!zatV?L4Z-Zv0qna>nc5Lge)MHpG9~_!jaH^Qctz diff --git a/app/src/main/assets/shaders/texture.vert b/app/src/main/assets/shaders/texture.vert index 1cd1180..fe8b0ac 100644 --- a/app/src/main/assets/shaders/texture.vert +++ b/app/src/main/assets/shaders/texture.vert @@ -17,7 +17,11 @@ layout (location = 0) out vec2 outUV; layout (location = 1) out vec3 outNormal; layout(push_constant) uniform PushConstants { - float myValue; + float zoom; + float r; + float g; + float b; + float radius; float ux; float uy; } pushConstants; @@ -32,7 +36,7 @@ void main() outUV = inUV; vec2 position = vec2(inPos.xy*2 -1); - position = position * pushConstants.myValue; + position = position * pushConstants.zoom; 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 63c5499c724fcdd1175f8022fdfe0725b213565c..20848598559527f688d64a31e34c733401a5c5b7 100644 GIT binary patch delta 221 zcmX>h^hS8Xht#V4{9FbgU}IomkOI<-KwN~xX9BX*k@(C&b`qG+3RceoWEUl-WR?~q z%wPqIl~y45Y?}ociy3`A7$90eMkoU@4-mt|K*oT?1dzl)#(=~`ki^)aViKDhnQk%) QbAsIf5`^Q;u`I7y0Gp)~ivR!s delta 59 zcmaDOd_ri#2gTgVu*96wR0cK%76vH>1_nkTF0EjI^O-h>G8Qv#mSDcd$jr(hwV9Fi GH46Z(N(_Pk diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index 0ccb824..dbf54e3 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -546,7 +546,7 @@ void FaceApp::setup_descriptor_set_layout() VkPushConstantRange pushConstantRanges[1]; pushConstantRanges[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT| VK_SHADER_STAGE_FRAGMENT_BIT; pushConstantRanges[0].offset = 0; - pushConstantRanges[0].size = sizeof(float)*3; + pushConstantRanges[0].size = sizeof(PushConstants); //pushConstantRanges[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; //pushConstantRanges[1].offset = sizeof(float); @@ -691,7 +691,7 @@ void FaceApp::render(VkCommandBuffer commandBuffer, long long frameTime) vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout_bg, 0, 1, &m_descriptor_set_bg, 0, NULL); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline_bg); - vkCmdPushConstants(commandBuffer, m_pipelineLayout_bg, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue); + vkCmdPushConstants(commandBuffer, m_pipelineLayout_bg, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(pushConstants), &pushConstants); @@ -713,21 +713,21 @@ void FaceApp::render(VkCommandBuffer commandBuffer, long long frameTime) // vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_sets_right[_curMotionIndex], 0, NULL); //} - float fsValues[3] = { myFloatValue, 0 , 0}; + //float fsValues[3] = { myFloatValue, 0 , 0}; if (_curMotionIndex < _curMotions.size()) { if (_curFrameIndex < _curMotions[_curMotionIndex].frames.size()) { float ux = _curMotions[_curMotionIndex].frames[_curFrameIndex].x; float uy = _curMotions[_curMotionIndex].frames[_curFrameIndex].y; - fsValues[1] = ux; - fsValues[2] = uy; + pushConstants.ux = ux; + pushConstants.uy = uy; } } //fsValues[1] = 0; //fsValues[2] = 360; - vkCmdPushConstants(commandBuffer, m_pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT| VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(fsValues), &fsValues); + vkCmdPushConstants(commandBuffer, m_pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT| VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(pushConstants), &pushConstants); //vkCmdPushConstants(commandBuffer, m_pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(fsValues), fsValues); @@ -1169,7 +1169,7 @@ void FaceApp::setup_descriptor_set_layout_bg() VkPushConstantRange pushConstantRanges[1]; pushConstantRanges[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; pushConstantRanges[0].offset = 0; - pushConstantRanges[0].size = sizeof(float); + pushConstantRanges[0].size = sizeof(PushConstants); pipeline_layout_create_info.pushConstantRangeCount = 1; pipeline_layout_create_info.pPushConstantRanges = &pushConstantRanges[0]; @@ -1372,7 +1372,11 @@ void FaceApp::cleanup() void FaceApp::SetInitArg(const char* arg) { _initArg = json::parse(arg); - + pushConstants.zoom = _initArg.zoom; + pushConstants.r = _initArg.r; + pushConstants.g = _initArg.g; + pushConstants.b = _initArg.b; + pushConstants.radius = _initArg.radius; } void FaceApp::drawFrame(long long frameTime) diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h index 8ee3ff8..da49e53 100644 --- a/vulkan/FaceApp.h +++ b/vulkan/FaceApp.h @@ -38,13 +38,23 @@ struct InitArg { int action_fps; float zoom; + float r; + float g; + float b; + float radius; //Motion motion; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(InitArg, action_fps, zoom); + NLOHMANN_DEFINE_TYPE_INTRUSIVE(InitArg, action_fps, zoom, r, g, b, radius); }; struct PushConstants { - float myValue; + float zoom = 0.5f; + float r = 0; + float g = 0; + float b = 0; + float radius = 240; + float ux = 0; + float uy = 0; }; using Callback = std::function; @@ -149,7 +159,8 @@ private: - float myFloatValue = 1.5f; + //float myFloatValue = 1.5f; + PushConstants pushConstants; diff --git a/vulkan/main.cpp b/vulkan/main.cpp index cdc5d42..602e03b 100644 --- a/vulkan/main.cpp +++ b/vulkan/main.cpp @@ -150,6 +150,10 @@ int main() { init_arg.action_fps = 10; init_arg.zoom = 1.5f; + init_arg.r = 1; + init_arg.g = 0; + init_arg.b = 0; + init_arg.radius = 240; string json_str = json(init_arg).dump();