unity 实现水的波纹效果

之前的实现过这个效果,可惜没有记笔记,所以现在有点遗忘,连多个波纹一起在水面上实现的效果都忘记了,所以,查看了下之前实现的代码,现在再记一下笔记。

基础的波纹效果

要实现波纹,首先要知道波纹的中心点,这个位置应该是世界空间坐标系的位置,然后还要知道扩散到了哪里,也需要传入,知道了这两个值以后,就可以实现一个最简易的效果,只需要通过脚本更新这两个值,就可以实现最简单的波纹扩散效果。
波纹中心点我命名为了_HitPos,扩散到了尺寸就命名为HitSize,在片元里面求出世界空间坐标位置和中心点的位置,然后再减去_HitSize,就可以得出一个扩散的圆,调节_HitSize的大小,就可以发现圆会变大变小。

half dis = distance(input.positionWS, _HitPos.xyz);
dis -= _HitSize;

在这里插入图片描述
里面黑外面白,用一下反值
在这里插入图片描述
里面白外面黑,这样我们就找到了散的边界,我们会返现有一片纯黑和纯白的区域,这一片区域就是大于1和小于0的区域,而边缘渐变的部分就是从0-1的渐变。我们做效果,其实就只需要这个0-1的范围即可,将其定义为波纹的宽度。

然后,我们再命名一个_HitSpread作为扩散范围的调整,用边界值去除以这个值,就去修改,但是我为了保证0-1的范围中心处于边缘,我这里使用smoothstep方法,获取了0到-1的区域,然后使用_HitSpread去控制拾取的范围值。0就是刚好对应尺寸的起点。

    half disMask = distance(input.positionWS, _HitPos.xyz);half range = -clamp((disMask - _HitSize) / _HitSpread, -1, 0);

这样保证了区域的设置。
有了这个值以后,美术可以准确的去设置具体的显示范围,然后我们再给一个贴图,可以去拾取一张渐变图,美术也就可以简单的调节具体如何去渐变。
在这里插入图片描述
这里我使用了这张Ramp图片,然后使用上面的值作为采样的x轴,y轴默认0.5,就可以准确拾取过渡值。

    half disMask = distance(input.positionWS, _HitPos.xyz);half range = -clamp((disMask - _HitSize) / _HitSpread, -1, 0);half2 rampUV = half2(range, 0.5);half ramp = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, rampUV).r;

采样出来的效果就是:
在这里插入图片描述
这种方法_HitSpread能准确的控制范围,而且_HitSize也能准确的控制移动的位置

    half noise = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, noiseUV).r;half disMask = distance(input.positionWS, _HitPos.xyz);half range = -clamp((disMask - _HitSize + noise) / _HitSpread, -1, 0);half2 rampUV = half2(range, 0.5);half ramp = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, rampUV).r;

再加上一张扰动图进行偏移,让渐变没有这么的平滑
在这里插入图片描述
接下来实现了基本的效果,然后我们还需要设置一个终点,到终点位置以后,就渐渐的消失的效果,这个效果的实现,首先就是我们需要设置一个渐变消失位置_HitFadeDistance,然后用之前求出的范围值除以它,然后再设置_HitFadePower和这个值相乘,主要是为了防止它的效果太早的变淡。

half hitFade = saturate((1.0 - disMask / _HitFadeDistance) * _HitFadePower); 

在这里插入图片描述
这个效果就是这样
然后用这个求出的值,再乘以之前的ramp,就实现了这个效果限制的显示范围。

在这里插入图片描述
就实现了我们所需要的效果。

实现脚本控制

既然实现了shader,但是位置和渐变的值需要我们手动传入啊。
为了实现这个效果,我们还需要设置全局变量,方便从脚本向shader传入变量。将_HitPos和_HitSize注销,这两个值我们需要从一个全局变量传入。这个全局变量前三个值设置为_HitPos的值,w通道则设置_HitSize的值,这样用一个四维向量就存储了两个值。

half4 HitParams;

声明一个HitParams,不要写在CBUFFER_START(UnityPerMaterial)里面,因为我们不需要合批,它们只是一个全局变量,然后还需要将Properties里面的值也注销掉,如果哪里设置了值,将会直接传入。
然后在运算前面重新声明它们

    half3 _HitPos = HitParams.xyz;half _HitSize = HitParams.w;half noise = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, noiseUV).r;half disMask = distance(input.positionWS, _HitPos.xyz);half range = -clamp((disMask - _HitSize + noise) / _HitSpread, -1, 0);half2 rampUV = half2(range, 0.5);half ramp = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, rampUV).r;half hitFade = saturate((1.0 - disMask / _HitFadeDistance) * _HitFadePower); half hitResult = hitFade * ramp;

这样,就不用动原来代码,就实现。

接着是脚本,我声明了一个WaterRipple的脚本,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode()] //在编辑模式下也可以运行
public class WaterRipple : MonoBehaviour
{public string triggerTag = "ForceField";private Vector4 HitPos;private float HitSize;private float clickTimer = 0.0f; //防止频繁触发间隔void Start(){}void RayCast(){RaycastHit hitInfo;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //从屏幕点击位置,在相机3D空间中发射一条射线if (Physics.Raycast(ray, out hitInfo, 1000)) //通过射线拾取物体,拾取到返回true{if (hitInfo.transform.CompareTag(triggerTag)) //判断当前拾取到的物体的tag是否正确{Vector3 pos = hitInfo.point;HitPos.x = pos.x;HitPos.y = pos.y;HitPos.z = pos.z;}}}// Update is called once per framevoid Update(){clickTimer += Time.deltaTime;if (Input.GetMouseButtonDown(0)){if (clickTimer > 0.5f){clickTimer = 0.0f;RayCast();}}//设置shader的全局变量HitPos.w = clickTimer;Shader.SetGlobalVector("HitParams", HitPos);}
}

先附上代码,然后讲解里面主要的部分:
在update里面,首先对鼠标是否按下进行了判断,然后用一个数值进行放误触处理,这个值后面也可以设置一个可以修改的变量

clickTimer += Time.deltaTime;
if (Input.GetMouseButtonDown(0))
{if (clickTimer > 0.5f){clickTimer = 0.0f;RayCast();}
}

如果可以触发RayCast函数,那么,将调用此函数

void RayCast()
{RaycastHit hitInfo;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //从屏幕点击位置,在相机3D空间中发射一条射线if (Physics.Raycast(ray, out hitInfo, 1000)) //通过射线拾取物体,拾取到返回true{if (hitInfo.transform.CompareTag(triggerTag)) //判断当前拾取到的物体的tag是否正确{Vector3 pos = hitInfo.point;HitPos.x = pos.x;HitPos.y = pos.y;HitPos.z = pos.z;}}
}

这个函数里面主要是获取了点击在场景中拾取到的位置,而且设置了一个tag判断,主要是防止不需要触发的物体也会触发此事件问题。

        //设置shader的全局变量HitPos.w = clickTimer;Shader.SetGlobalVector("HitParams", HitPos);

最后则是在update函数里面设置全局变量,所有的shader只要声明了HitParams,都可以获取到此变量的值。
只要在平面上面设置一个ForceField的Tag,然后设置好材质,点击即可看到效果。但是这种设置,我们只能实现一个效果的点击,如果点击第二个,那么,第一个的效果将直接消失,接下来,我们将实现多个效果一起播放。

多个波纹的实现

在这里插入图片描述

在实现多个波纹的需求下,我们还需要继续修改Shader,将之前的参数作为数组传入,这样可以处理多个,然后循环计算得到结果。

int HitAmount;
half4 HitParams[20]; //xyz:pos  w:size

首先声明三个新的变量,HitAmount代表循环次数,HitParams直接作为数组传入,就是可以实现当前的操作,然后将循环修改成一个函数:

half Hit(half hitNoise, half3 positionWS)
{float hitResult;//循环处理多个点的波纹for (int i = 0; i < HitAmount; i++){half disMask = distance(positionWS, HitParams[i].xyz);half range = -clamp((disMask - HitParams[i].w + hitNoise) / _HitSpread, -1, 0);half2 rampUV = half2(range, 0.5);half ramp = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, rampUV).r;half hitFade = saturate((1.0 - disMask / _HitFadeDistance) * _HitFadePower);hitResult += hitFade * ramp;}return saturate(hitResult);
}

用来可以实现多个点的波纹,只是将HitPos和HitSize修改成了数组里面的值,这样就可以实现多个相加,然后最后限制到0-1的范围内即可。
然后是脚本修改,这次使用了粒子系统来模拟,渐变,然后获取到渐变的时间,然后乘以设置的大小,传入即可。
在这里插入图片描述
粒子系统的设置。
在这里插入图片描述
脚本的设置

using System.Collections;
using System.Collections.Generic;
using UnityEngine;// [ExecuteInEditMode()] //在编辑模式下也可以运行
public class WaterRipple : MonoBehaviour
{public ParticleSystem PS;public string triggerTag = "ForceField";public float HitSize = 1;public int HitAmount; //当前粒子可以生成的粒子的个数private Vector4[] HitParams;private float clickTimer = 0.0f; //防止频繁触发间隔private ParticleSystem.Particle[] particles; //用于获取粒子系统里面的粒子void Start(){}void RayCast(){RaycastHit hitInfo;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //从屏幕点击位置,在相机3D空间中发射一条射线if (Physics.Raycast(ray, out hitInfo, 1000)) //通过射线拾取物体,拾取到返回true{if (hitInfo.transform.CompareTag(triggerTag)) //判断当前拾取到的物体的tag是否正确{PS.transform.position = hitInfo.point;PS.Emit(1);}}}// Update is called once per framevoid Update(){clickTimer += Time.deltaTime;if (Input.GetMouseButtonDown(0)){if (clickTimer > 0.2f){clickTimer = 0.0f;RayCast();}}ParticleSystem.MainModule PSmain = PS.main;PSmain.maxParticles = HitAmount; //设置最大粒子数HitParams = new Vector4[HitAmount];particles = new ParticleSystem.Particle[HitAmount];PS.GetParticles(particles);for (int i = 0; i < HitAmount; i++){Vector3 pos = particles[i].position; //位置float size = particles[i].GetCurrentSize(PS) * HitSize; //尺寸HitParams[i].Set(pos.x, pos.y, pos.z, size);}Shader.SetGlobalVectorArray("HitParams", HitParams);Shader.SetGlobalFloat("HitAmount", HitAmount);}
}

脚本代码,会发现,我增加了一个HitAmount用来设置最多显示波浪的个数,然后从粒子系统拿到粒子的信息生成数组信息,传递给Shader的全局变量,其实我们也可以单独的传给Shader,这里我就不修改了。
下面,我列一下Shader的完整代码,基于URP的Unlit修改的:

Shader "Unlit/WaterRipple"
{Properties{[MainTexture] _BaseMap("Texture", 2D) = "white" {}[MainColor] _BaseColor("Color", Color) = (1, 1, 1, 1)_Cutoff("AlphaCutout", Range(0.0, 1.0)) = 0.5_NoiseTex("扰动图", 2D) = "white" {}_RampTex("渐变图", 2D) = "white" {}// _HitPos("点击位置", Vector) = (0, 0, 0, 0)// _HitSize("波纹尺寸", Float) = 0_HitSpread("扩散范围", Float) = 1_HitFadeDistance("范围渐变", Float) = 6_HitFadePower("范围渐变", Float) = 1// BlendMode_Surface("__surface", Float) = 0.0_Blend("__mode", Float) = 0.0_Cull("__cull", Float) = 2.0[ToggleUI] _AlphaClip("__clip", Float) = 0.0[HideInInspector] _BlendOp("__blendop", Float) = 0.0[HideInInspector] _SrcBlend("__src", Float) = 1.0[HideInInspector] _DstBlend("__dst", Float) = 0.0[HideInInspector] _ZWrite("__zw", Float) = 1.0}SubShader{Tags {"RenderType" = "Opaque" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" "ShaderModel"="3.5"}LOD 100Blend [_SrcBlend][_DstBlend]ZWrite [_ZWrite]Cull [_Cull]Pass{Name "Unlit"HLSLPROGRAM#pragma target 3.5#pragma shader_feature_local_fragment _SURFACE_TYPE_TRANSPARENT#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON// -------------------------------------// Unity defined keywords#pragma multi_compile_fog#pragma multi_compile_instancing#pragma multi_compile _ DOTS_INSTANCING_ON#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3#pragma multi_compile _ DEBUG_DISPLAY#pragma vertex UnlitPassVertex#pragma fragment UnlitPassFragment#include "./WaterRippleInput.hlsl"#include "./WaterRippleForwardPass.hlsl"ENDHLSL}Pass{Name "DepthOnly"Tags{"LightMode" = "DepthOnly"}ZWrite OnColorMask 0HLSLPROGRAM#pragma exclude_renderers gles gles3 glcore#pragma target 4.5#pragma vertex DepthOnlyVertex#pragma fragment DepthOnlyFragment// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#pragma multi_compile _ DOTS_INSTANCING_ON#include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"ENDHLSL}Pass{Name "DepthNormalsOnly"Tags{"LightMode" = "DepthNormalsOnly"}ZWrite OnHLSLPROGRAM#pragma exclude_renderers gles gles3 glcore#pragma target 4.5#pragma vertex DepthNormalsVertex#pragma fragment DepthNormalsFragment// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON// -------------------------------------// Unity defined keywords#pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT // forward-only variant//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#pragma multi_compile _ DOTS_INSTANCING_ON#include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl"#include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitDepthNormalsPass.hlsl"ENDHLSL}}FallBack "Hidden/Universal Render Pipeline/FallbackError"// CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.UnlitShader"
}

WaterRippleInput.hlsl

#ifndef UNIVERSAL_WATERRIPPLE_INPUT_INCLUDED
#define UNIVERSAL_WATERRIPPLE_INPUT_INCLUDED#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;
float4 _NoiseTex_ST;
half4 _BaseColor;
half _Cutoff;
half _Surface;
// half4 _HitPos;
// half _HitSize;
half _HitSpread;
half _HitFadeDistance;
half _HitFadePower;
CBUFFER_ENDTEXTURE2D(_NoiseTex);           SAMPLER(sampler_NoiseTex);
TEXTURE2D(_RampTex);           SAMPLER(sampler_RampTex);int HitAmount;
half4 HitParams[20]; //xyz:pos  w:size#endif

WaterRippleForwardPass.hlsl


#ifndef URP_WATERRIPPLE_FORWARD_PASS_INCLUDED
#define URP_WATERRIPPLE_FORWARD_PASS_INCLUDED#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Unlit.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attributes
{float4 positionOS : POSITION;float2 uv : TEXCOORD0;float3 normalOS : NORMAL;float4 tangentOS : TANGENT;UNITY_VERTEX_INPUT_INSTANCE_ID
};struct Varyings
{float4 uv : TEXCOORD0;float fogCoord : TEXCOORD1;float4 positionCS : SV_POSITION;float3 positionWS : TEXCOORD2;float3 normalWS : TEXCOORD3;float3 viewDirWS : TEXCOORD4;UNITY_VERTEX_INPUT_INSTANCE_IDUNITY_VERTEX_OUTPUT_STEREO
};void InitializeInputData(Varyings input, out InputData inputData)
{inputData = (InputData)0;inputData.positionWS = input.positionWS;inputData.normalWS = input.normalWS;inputData.viewDirectionWS = input.viewDirWS;inputData.shadowCoord = 0;inputData.fogCoord = 0;inputData.vertexLighting = half3(0, 0, 0);inputData.bakedGI = half3(0, 0, 0);inputData.normalizedScreenSpaceUV = 0;inputData.shadowMask = half4(1, 1, 1, 1);
}Varyings UnlitPassVertex(Attributes input)
{Varyings output = (Varyings)0;UNITY_SETUP_INSTANCE_ID(input);UNITY_TRANSFER_INSTANCE_ID(input, output);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);output.positionCS = vertexInput.positionCS;output.uv.xy = TRANSFORM_TEX(input.uv, _BaseMap);output.uv.zw = TRANSFORM_TEX(input.uv, _NoiseTex);#if defined(_FOG_FRAGMENT)output.fogCoord = vertexInput.positionVS.z;#elseoutput.fogCoord = ComputeFogFactor(vertexInput.positionCS.z);#endifVertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS);half3 viewDirWS = GetWorldSpaceViewDir(vertexInput.positionWS);// already normalized from normal transform to WS.output.positionWS = vertexInput.positionWS;output.normalWS = normalInput.normalWS;output.viewDirWS = viewDirWS;return output;
}half Hit(half hitNoise, half3 positionWS)
{float hitResult;//循环处理多个点的波纹for (int i = 0; i < HitAmount; i++){half disMask = distance(positionWS, HitParams[i].xyz);half range = -clamp((disMask - HitParams[i].w + hitNoise) / _HitSpread, -1, 0);half2 rampUV = half2(range, 0.5);half ramp = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, rampUV).r;half hitFade = saturate((1.0 - disMask / _HitFadeDistance) * _HitFadePower);hitResult += hitFade * ramp;}return saturate(hitResult);
}half4 UnlitPassFragment(Varyings input) : SV_Target
{UNITY_SETUP_INSTANCE_ID(input);UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);half2 uv = input.uv.xy;half2 noiseUV = input.uv.zw;half4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv);half3 color = texColor.rgb * _BaseColor.rgb;half alpha = texColor.a * _BaseColor.a;AlphaDiscard(alpha, _Cutoff);#if defined(_ALPHAPREMULTIPLY_ON)color *= alpha;#endifInputData inputData;InitializeInputData(input, inputData);SETUP_DEBUG_TEXTURE_DATA(inputData, input.uv, _BaseMap);#ifdef _DBUFFERApplyDecalToBaseColor(input.positionCS, color);#endif#if defined(_FOG_FRAGMENT)#if (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2))float viewZ = -input.fogCoord;float nearToFarZ = max(viewZ - _ProjectionParams.y, 0);half fogFactor = ComputeFogFactorZ0ToFar(nearToFarZ);#elsehalf fogFactor = 0;#endif#elsehalf fogFactor = input.fogCoord;#endifhalf4 finalColor = UniversalFragmentUnlit(inputData, color, alpha);half noise = SAMPLE_TEXTURE2D(_NoiseTex, sampler_NoiseTex, noiseUV).r;// half disMask = distance(input.positionWS, _HitPos.xyz);// half range = -clamp((disMask - _HitSize + noise) / _HitSpread, -1, 0);// half2 rampUV = half2(range, 0.5);// half ramp = SAMPLE_TEXTURE2D(_RampTex, sampler_RampTex, rampUV).r;// half hitFade = saturate((1.0 - disMask / _HitFadeDistance) * _HitFadePower);// half hitResult = hitFade * ramp;half hitResult = Hit(noise, input.positionWS);finalColor.rgb += hitResult;finalColor.rgb = MixFog(finalColor.rgb, fogFactor);// finalColor.rgb = hitFade;return finalColor;
}#endif

如果有问题,请及时联系我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android水波纹效果

日常的Android开发中可能大家都见过类似这种水波纹展开的效果&#xff0c;比如加载一张图片的时候使用水波纹加载&#xff0c;其实这种实现非常简单。因为Google已经为我们提供了一个非常方便地工具类 ViewAnimationUtils 它的实现非常简单&#xff0c;就这个类&#xff0c;其…

自定义view实现水波纹效果

我正在参加 CSDN 2015博客之星评选 感恩分享活动&#xff0c;如果觉得文章还不错&#xff0c;请投个票鼓励下吧&#xff1a;http://vote.blog.csdn.net/blogstar2015/candidate?usernametianjian4592 在实际的开发中&#xff0c;很多时候还会遇到相对比较复杂的需求&#xf…

Android L中水波纹点击效果的实现

博主参加了2014 CSDN博客之星评选&#xff0c;帮我投一票吧。 点击给我投票 前言 前段时间android L&#xff08;android 5.0&#xff09;出来了&#xff0c;界面上做了一些改动&#xff0c;主要是添加了若干动画和一些新的控件&#xff0c;相信大家对view的点击效果-水波纹很…

科技云报道:垂直大模型竞争,能突破数据“卡点”吗?

科技云报道原创。 AI大模型火遍全球&#xff0c;中国产业也激发了对人工智能应用的新热情。 随着各大厂商参与竞逐&#xff0c;市场正在分化为通用与垂直两大路径&#xff0c;两者在参数级别、应用场景、商业模式等方面差异已逐步显现。 企业涌入垂直大模型赛道 通用AI大模型…

【人工智能】论未来人工智能的大模型生态:重塑技术前景与应用

目录 未来人工智能大模型生态:重塑技术前景与应用 引言 OpenAI 的 AGI 愿景

创造之境:Stable Diffusion + chatGPT下的自动绘图探索

什么是Stable Diffusion Stable Diffusion 是在2022年发布的深度学习文本到图像生成模型。它主要用于根据文字的描述生成详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如内插绘制、外插绘制&#xff0c;以及在提示词&#xff08;英语&#xff09;指导下生成图生…

工具 | ChatPDF:与PDF对话!

工具 | ChatPDF&#xff1a;与PDF对话&#xff01; 本文首发微信公众号&#xff1a;全副武装的大师兄 ChatPDF是什么&#xff1f; 它是一个在不到一周时间里&#xff0c;就让10万份PDF学会了聊天的应用&#xff01;无需注册&#xff0c;登录&#xff0c;通过上传PDF文件到Ch…

微信公众号 接口配置

1、登录微信公众平台-->设置与开发-->基本配置页面&#xff0c;打开服务器配置 2、在网站后台添加两个接口get请求验证和post请求消息转发&#xff0c;url为上图填写的url&#xff0c; RestController RequestMapping("/officialAccount/") public class Offic…

亚马逊评论和销量的关系都有哪些呢?

评论和销量的关系非常密切。当然不是评论越多越好&#xff0c;更合理的评论对产品的关键词排名帮助更大。就连亚马逊也会推荐一些资源&#xff0c;所以推荐和曝光越多&#xff0c;销量也会增加越多。这也是为什么卖家都在努力增加Review数量&#xff0c;甚至花钱找人做评测还免…

亚马逊评论的类型有哪些?都该怎么操作呢?

亚马逊评论对于亚马逊卖家店铺来说很重要的&#xff0c;评论又多又好的产品自然更受欢迎&#xff0c;但是评论肯定不只一种&#xff0c;那么亚马逊评论的类型有哪些&#xff1f;都该怎么操作呢&#xff1f; 亚马逊评论分为以下几种&#xff1a; 1、直评 直评是买家可以不用购…

视频会议解决方案-最新全套文件

视频会议解决方案-最新全套文件 一、建设背景二、建设思路业务挑战 三、建设方案四、获取 - 视频会议全套最新解决方案合集 一、建设背景 随着中国经济的迅速发展&#xff0c;很多企业的发展也进入快车道&#xff0c;分支机构越来越多&#xff0c;形成了遍布全国范围甚至全球范…

微软:明年 7 月之前,所有会议线上举行

By 超神经 内容提要&#xff1a;这场疫情对科技行业带来了重大影响。自 2 月以来&#xff0c;被迫取消或转至线上的科技峰会已经数不胜数。现在&#xff0c;微软已经决定&#xff0c;将明年下半年之前的所有活动转至线上&#xff0c;科技会议或许就此迎来变革&#xff1f; 关键…

智能会议纪要生成,从音视频到一键生成会议特征数据

★★★ 本文源自AI Studio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 零.项目背景 目标&#xff1a;针对会议场景的长视频或者长语音&#xff0c;自动生成会议记录并通过摘要生成技术形成会议摘要。 一.技术流程 1.通过moviepy 提取视频中的音频&am…

本地电脑腾讯会议PPT演讲者模式

在腾讯会议中进行PPT汇报的时候&#xff0c;有些情况我们是想要看到备注的&#xff0c;即如何实现对自己是演讲者模式&#xff0c;而对其他人展示的是报告全屏内容呢&#xff1f; 不同操作系统的电脑实现方式还不同&#xff0c;下面分别介绍&#xff1a; 对于mac系统&#xf…

会中切换网络总掉线?腾讯会议用这种方案让你好好开会

&#x1f449;腾小云导读 也许你有这样的体验&#xff1a;当你加入腾讯会议开会&#xff0c;老板正在发布重要任务时&#xff0c;你恰好要进电梯时 wifi 切换成了 cellular&#xff0c;画面开始「转菊花」&#xff0c;网络断开重连却需要好久&#xff0c;最终老板的指示你一个字…

腾讯会议的各种使用办法

如何关闭某一成员突然打开的麦克风 1.点击管理成员 2.点击关闭麦克风或者关闭视频即可 如何更换背景 1.点击设置 2.点击虚拟背景和美颜 3.选择已有背景或者点击支持图片/视频从本地进行上传 调整声音 1.点击设置 2.点击音频 3.点击音量调节

Zoom会议使用指南

一、使用手册 1、加入会议 1.1 下载ZOOM 下载ZOOM客户端&#xff1a;https://ruanshi1.8686c.com/prod/4.4.55389.0716/ZoomInstaller.exe 1.2 点击加入会议 1.3 点击会议URL或输入会议ID https://cnegroup.zoom.us/j/768131602 1.4 开始会议 2、召开会议 2.1登录Zoom 2.…

使用 Microsoft Teams 开会到底有多少途径——建会

疫情原因公司开始远程办公&#xff0c;过程不赘述&#xff0c;最终选择了 Microsoft Teams 作为开会的工具。 通过这几个月的摸索&#xff0c;终于算是上手了&#xff0c;开始时被 Teams 开会整懵圈了&#xff0c;每天收到各种工单&#xff0c;问怎么开会。后来发现 Teams 开会…

使用 Microsoft Teams 开会到底有多少途径——参会

上一篇关于Teams建会的文章发完之后&#xff0c;总想着把参会的赶紧写了&#xff0c;结果发现两个月就这么过去了&#xff0c;趁着最近不忙&#xff0c;赶紧更新 接前文 使用 Microsoft Teams 开会到底有多少途径——建会添加链接描述 和建会一样&#xff0c;参会也是条条大路…

油猴脚本尝试

现在是这样的&#xff0c;我这边有个运维系统&#xff0c;里面有个日志&#xff0c;我们经常要复制&#xff0c;然后我们复制的时候需要打开内容&#xff0c;然后去选中复制。 类似于这种&#xff0c;我觉得这个时候&#xff0c;去选中复制就很麻烦&#xff0c;右边这里不是有…