Unity引擎制作玻璃的反射和折射效果

Unity引擎制作玻璃球+玻璃杯

  大家好,我是阿赵。
  之前做海面效果的时候,没做反射和折射的效果,因为我觉得过于复杂的效果没有太大的实际作用。这方面的效果,我就做了现在这个例子来补充一下。
在这里插入图片描述

  在这个demo场景里面,我建了一个面片,然后贴了一张室内场景的贴图。然后建了一个球放在面片前面。

一、 反射

  首先我要给这个球加一个反射的效果。熟悉我的朋友应该都知道,我出于性能的考虑,是不会做真反射的。而我选择的反射方案,一般就是Matcap。
  Matcap之前我已经专门写了2篇文章介绍过,有兴趣的朋友可以往前翻一下。这里简略的说一下就算了。Matcap的原理简单,就是用物体的世界法线方向转到View坐标系,然后把这个当做UV去采样一张Matcap贴图。所以Matcap实际上比采样CubeMap消耗还小,而且效果也比较的逼真。
  Matcap的实现很简单,在ASE里面的连线是这样的:
在这里插入图片描述

  把这个Matcap的颜色输出:
在这里插入图片描述

  我赋予了一张Matcap贴图,然后稍微调了一点强度,看看效果:
在这里插入图片描述
在这里插入图片描述

  可以看出,现在球体上已经有一些反射的效果了。

二、 折射

  折射,有多种做法,比较常见的一种,是用CubeMap做一个假环境,然后通过对CubeMap的采样过程进行扭曲,做到折射的效果。
  但我这次并不打算这样做折射,因为CubeMap折射的是假的环境,是不会变化的,我这里做一个稍微真实折射,通过GrabTexture,捕捉屏幕图像,然后再通过对GrabTexture的采样UV进行扭曲,达到折射的效果。
  在ASE里面的连线大概是这样的:
在这里插入图片描述

  需要注意的有以下这些点:
1、 GrabTexture一定要自定义贴图名称
  GrabTexture的获取有2种方式,一种是不指定贴图名称,另一种是指定贴图名称。
这两种方式从结果看,效果是一模一样的。但如果不指定贴图名称,如果同一帧里面有多个材质球需要采样,就会捕捉多次屏幕,造成巨大的性能消耗。
  如果指定了贴图名称,那么就可以大量的减少采样的次数了。GrabTexture捕捉屏幕画面,本身就是一个比较大的消耗,其实能不用最好是不用的。不过一些自带扭曲的效果,如果要实现,要么用后处理的方式做,要么用GrabTexture做,实际上后处理是把一帧的渲染结果当做RenderTexture拿到,再对这张RenderTexture进行处理,消耗也同样不小的。

2、 获取屏幕坐标的方法
  由于dx和OpenGL的UV坐标方向不一样,所以要获得GrabTexture对应顶点的屏幕坐标,是需要分别处理的,ASE里面的GrabScreenPosition节点,已经做了这样的处理:

	inline float4 ASE_ComputeGrabScreenPos( float4 pos ){#if UNITY_UV_STARTS_AT_TOPfloat scale = -1.0;#elsefloat scale = 1.0;#endiffloat4 o = pos;o.y = pos.w * 0.5f;o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y;return o;

}

  如果不想自己判断是不是UNITY_UV_STARTS_AT_TOP,也可以直接用UnityCG.cginc内置的方法ComputeScreenPos来获取这个坐标。
3、 通过Lerp来过渡
  首先来明确一个问题,我们现在不是根据折射率来计算真实的折射,而是通过采样一帧的画面,进行扭曲模拟的折射效果。而我们能使用的扭曲画面的参数,我这里是使用了法线方向。根据法线方向的变化,对GrabTexture的采样UV进行偏移。
  既然是这样,那么我们要获得一个世界空间的法线方向和视角的关系,来确定扭曲的强度。这个东西之前我们用过很多了,就是NDotV了:
在这里插入图片描述

  根据这个的变化,来采样GrabTexture,然后再和正常的GrabTexture屏幕坐标,通过一个强度值,做一个Lerp的变化:
在这里插入图片描述

  这样就能获得一个反射的颜色,如果单独输出这个反射颜色
在这里插入图片描述

球的效果会是这样的:
在这里插入图片描述

  如果叠加上Matcap的反射效果:
在这里插入图片描述

  球体的效果会变成这样:
在这里插入图片描述

三、 边缘

  从模拟的效果看,现在的球体已经有一定的玻璃的特征了,但似乎并没有什么厚度,更像是一个肥皂泡泡。
  为了解决这个问题,我尝试给他加一个边缘光。边缘光的算法其实就是之前做海面效果的菲涅尔了。
在这里插入图片描述

  然后把这个边缘光也叠加上去:
在这里插入图片描述

  调整一下菲涅尔的最大最小值,可以得到这样的效果:
在这里插入图片描述

四、 整体颜色

  现在的玻璃默认是白色的,因为我们叠加的效果都是反射折射和边缘光,还没有给固有色指定。所以我添加一个mainColor作为固有色。也可以通过贴图采样作为固有色,都可以,这里就简单给一个颜色算了。
在这里插入图片描述

  所以调整一下颜色,就可以得到:
在这里插入图片描述

或者:
在这里插入图片描述

五、 应用于其他的模型

  在球体上面实现了这个效果了,接下来把它应用到别的形状的模型,看看效果对不对:
在这里插入图片描述

  这里做了个酒杯,里面有半杯液体。
  由于这个杯子整体来看每个面的法线方向都不一样,可以看出,整体的折射的模拟效果还是比较的正确的。然后由于不同的材质球可以调不同的折射强度,所以液体的折射和被子的折射可以调成不一样,看起来效果会更真实一点。

六、 源码

  由于这个Shader是用ASE编的,所以我也提供一下生成的代码,各位有兴趣可以去ASE里面看看连线的情况:

// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X 
Shader "ballRefract"
{Properties{_mainColor("mainColor", Color) = (1,1,1,1)_matcapTex("matcapTex", 2D) = "white" {}_matcapStrength("matcapStrength", Range( 0 , 1)) = 0_refractStrength("refractStrength", Range( 0 , 1)) = 0_fresnelVal("fresnelVal", Range( 0 , 1)) = 1_fresnelMax("fresnelMax", Range( 0 , 1)) = 1_fresnelMin("fresnelMin", Range( 0 , 1)) = 0}SubShader{Tags { "RenderType"="Opaque" "Queue"="Transparent" }LOD 100CGINCLUDE#pragma target 3.0ENDCGBlend OffAlphaToMask OffCull BackColorMask RGBAZWrite OnZTest LEqualOffset 0 , 0GrabPass{ }Pass{Name "Unlit"Tags { "LightMode"="ForwardBase" }CGPROGRAM#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)#define ASE_DECLARE_SCREENSPACE_TEXTURE(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex);#else#define ASE_DECLARE_SCREENSPACE_TEXTURE(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)#endif#ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX//only defining to not throw compilation error over Unity 5.5#define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)#endif#pragma vertex vert#pragma fragment frag#pragma multi_compile_instancing#include "UnityCG.cginc"#include "UnityShaderVariables.cginc"#define ASE_NEEDS_FRAG_WORLD_POSITIONstruct appdata{float4 vertex : POSITION;float4 color : COLOR;float3 ase_normal : NORMAL;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex : SV_POSITION;#ifdef ASE_NEEDS_FRAG_WORLD_POSITIONfloat3 worldPos : TEXCOORD0;#endiffloat4 ase_texcoord1 : TEXCOORD1;float4 ase_texcoord2 : TEXCOORD2;UNITY_VERTEX_INPUT_INSTANCE_IDUNITY_VERTEX_OUTPUT_STEREO};uniform float4 _mainColor;uniform sampler2D _matcapTex;uniform float _matcapStrength;ASE_DECLARE_SCREENSPACE_TEXTURE( _GrabTexture )uniform float _refractStrength;uniform float _fresnelMin;uniform float _fresnelMax;uniform float _fresnelVal;inline float4 ASE_ComputeGrabScreenPos( float4 pos ){#if UNITY_UV_STARTS_AT_TOPfloat scale = -1.0;#elsefloat scale = 1.0;#endiffloat4 o = pos;o.y = pos.w * 0.5f;o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y;return o;}v2f vert ( appdata v ){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);UNITY_TRANSFER_INSTANCE_ID(v, o);float3 ase_worldNormal = UnityObjectToWorldNormal(v.ase_normal);o.ase_texcoord1.xyz = ase_worldNormal;float4 ase_clipPos = UnityObjectToClipPos(v.vertex);float4 screenPos = ComputeScreenPos(ase_clipPos);o.ase_texcoord2 = screenPos;//setting value to unused interpolator channels and avoid initialization warningso.ase_texcoord1.w = 0;float3 vertexValue = float3(0, 0, 0);#if ASE_ABSOLUTE_VERTEX_POSvertexValue = v.vertex.xyz;#endifvertexValue = vertexValue;#if ASE_ABSOLUTE_VERTEX_POSv.vertex.xyz = vertexValue;#elsev.vertex.xyz += vertexValue;#endifo.vertex = UnityObjectToClipPos(v.vertex);#ifdef ASE_NEEDS_FRAG_WORLD_POSITIONo.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;#endifreturn o;}fixed4 frag (v2f i ) : SV_Target{UNITY_SETUP_INSTANCE_ID(i);UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);fixed4 finalColor;#ifdef ASE_NEEDS_FRAG_WORLD_POSITIONfloat3 WorldPosition = i.worldPos;#endiffloat3 ase_worldNormal = i.ase_texcoord1.xyz;float4 matcap24 = ( tex2D( _matcapTex, (mul( float4( ase_worldNormal , 0.0 ), UNITY_MATRIX_V ).xyz*0.5 + 0.5).xy ) * _matcapStrength );float4 screenPos = i.ase_texcoord2;float4 ase_grabScreenPos = ASE_ComputeGrabScreenPos( screenPos );float4 ase_grabScreenPosNorm = ase_grabScreenPos / ase_grabScreenPos.w;float2 appendResult3 = (float2(ase_grabScreenPosNorm.r , ase_grabScreenPosNorm.g));float3 ase_worldViewDir = UnityWorldSpaceViewDir(WorldPosition);ase_worldViewDir = normalize(ase_worldViewDir);float dotResult8 = dot( ase_worldNormal , ase_worldViewDir );float NDotV25 = dotResult8;float2 temp_cast_3 = (NDotV25).xx;float2 lerpResult5 = lerp( appendResult3 , temp_cast_3 , _refractStrength);float4 screenColor1 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_GrabTexture,lerpResult5);float4 refract32 = screenColor1;float smoothstepResult9 = smoothstep( _fresnelMin , _fresnelMax , NDotV25);float Fresnel29 = ( ( 1.0 - smoothstepResult9 ) * _fresnelVal );finalColor = ( _mainColor * ( matcap24 + refract32 + Fresnel29 ) );return finalColor;}ENDCG}}CustomEditor "ASEMaterialInspector"}
/*ASEBEGIN
Version=18500
1920;0;1920;1019;3260.221;1877.513;3.859619;True;True
Node;AmplifyShaderEditor.CommentaryNode;28;-2376.601,15.2;Inherit;False;754.8627;439;Comment;4;7;6;8;25;NDotV;1,1,1,1;0;0
Node;AmplifyShaderEditor.ViewDirInputsCoordNode;7;-2312.601,266.2;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.WorldNormalVector;6;-2326.601,65.2;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.CommentaryNode;16;-1784.797,-866.7996;Inherit;False;1347.15;473.2724;Comment;9;24;23;22;20;21;19;38;18;17;matcap;1,1,1,1;0;0
Node;AmplifyShaderEditor.DotProductOpNode;8;-2038.601,175.2;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0
Node;AmplifyShaderEditor.WorldNormalVector;18;-1734.797,-816.7996;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.RegisterLocalVarNode;25;-1845.738,162.044;Inherit;True;NDotV;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.CommentaryNode;34;-3346.037,-815.1047;Inherit;False;1148.658;457.9377;Comment;7;2;3;26;4;5;1;32;refract;1,1,1,1;0;0
Node;AmplifyShaderEditor.CommentaryNode;30;-2542.042,578.4539;Inherit;False;1269.011;491.3077;Comment;8;10;11;27;9;13;12;14;29;Fresnel;1,1,1,1;0;0
Node;AmplifyShaderEditor.ViewMatrixNode;17;-1690.02,-599.9698;Inherit;False;0;1;FLOAT4x4;0
Node;AmplifyShaderEditor.RangedFloatNode;10;-2492.042,755.5684;Inherit;False;Property;_fresnelMin;fresnelMin;6;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;11;-2488.042,888.5684;Inherit;False;Property;_fresnelMax;fresnelMax;5;0;Create;True;0;0;False;0;False;1;1;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;27;-2354.074,628.4539;Inherit;False;25;NDotV;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;19;-1543.883,-676.3995;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT4x4;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GrabScreenPosition;2;-3296.037,-765.1047;Inherit;False;0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.RangedFloatNode;38;-1598.579,-491.8766;Inherit;False;Constant;_Float0;Float 0;7;0;Create;True;0;0;False;0;False;0.5;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SmoothstepOpNode;9;-2123.853,749.8372;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.DynamicAppendNode;3;-3002.037,-729.1048;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;4;-3170.409,-473.167;Inherit;False;Property;_refractStrength;refractStrength;3;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.ScaleAndOffsetNode;20;-1404.423,-612.3016;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT;0.5;False;2;FLOAT;0.5;False;1;FLOAT3;0
Node;AmplifyShaderEditor.GetLocalVarNode;26;-3093.938,-599.0139;Inherit;False;25;NDotV;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;21;-1140.799,-747.8926;Inherit;True;Property;_matcapTex;matcapTex;1;0;Create;True;0;0;False;0;False;-1;None;461d573efcdd854449e8d60d7851cb85;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.OneMinusNode;12;-1908.118,772.1724;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;13;-2110.825,953.7616;Inherit;False;Property;_fresnelVal;fresnelVal;4;0;Create;True;0;0;False;0;False;1;1;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.LerpOp;5;-2821.126,-595.4236;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;1;FLOAT2;0
Node;AmplifyShaderEditor.RangedFloatNode;22;-1188.587,-525.996;Inherit;False;Property;_matcapStrength;matcapStrength;2;0;Create;True;0;0;False;0;False;0;0.484;0;1;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;23;-799.8513,-661.761;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;14;-1726.323,856.4717;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.ScreenColorNode;1;-2640.674,-692.4675;Inherit;False;Global;_GrabScreen0;Grab Screen 0;0;0;Create;True;0;0;False;0;False;Object;-1;False;False;1;0;FLOAT2;0,0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.RegisterLocalVarNode;29;-1497.031,822.4349;Inherit;True;Fresnel;-1;True;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;32;-2421.379,-648.5054;Inherit;False;refract;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.RegisterLocalVarNode;24;-642.5197,-647.4543;Inherit;False;matcap;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;31;-388.149,69.38911;Inherit;False;29;Fresnel;1;0;OBJECT;;False;1;FLOAT;0
Node;AmplifyShaderEditor.GetLocalVarNode;33;-369.1212,4.012573;Inherit;False;32;refract;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.GetLocalVarNode;35;-369.3356,-79.31943;Inherit;False;24;matcap;1;0;OBJECT;;False;1;COLOR;0
Node;AmplifyShaderEditor.ColorNode;36;-334.0762,-270.2781;Inherit;False;Property;_mainColor;mainColor;0;0;Create;True;0;0;False;0;False;1,1,1,1;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleAddOpNode;15;-140.1225,-8.462204;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;37;-13.75513,-124.8451;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;0;173.9,-159.1;Float;False;True;-1;2;ASEMaterialInspector;100;1;ballRefract;0770190933193b94aaa3065e307002fa;True;Unlit;0;0;Unlit;2;True;0;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;True;0;False;-1;0;False;-1;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;True;True;True;True;True;0;False;-1;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;2;RenderType=Opaque=RenderType;Queue=Transparent=Queue=0;True;2;0;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;1;LightMode=ForwardBase;False;0;;0;0;Standard;1;Vertex Position,InvertActionOnDeselection;1;0;1;True;False;;False;0
WireConnection;8;0;6;0
WireConnection;8;1;7;0
WireConnection;25;0;8;0
WireConnection;19;0;18;0
WireConnection;19;1;17;0
WireConnection;9;0;27;0
WireConnection;9;1;10;0
WireConnection;9;2;11;0
WireConnection;3;0;2;1
WireConnection;3;1;2;2
WireConnection;20;0;19;0
WireConnection;20;1;38;0
WireConnection;20;2;38;0
WireConnection;21;1;20;0
WireConnection;12;0;9;0
WireConnection;5;0;3;0
WireConnection;5;1;26;0
WireConnection;5;2;4;0
WireConnection;23;0;21;0
WireConnection;23;1;22;0
WireConnection;14;0;12;0
WireConnection;14;1;13;0
WireConnection;1;0;5;0
WireConnection;29;0;14;0
WireConnection;32;0;1;0
WireConnection;24;0;23;0
WireConnection;15;0;35;0
WireConnection;15;1;33;0
WireConnection;15;2;31;0
WireConnection;37;0;36;0
WireConnection;37;1;15;0
WireConnection;0;0;37;0
ASEEND*/
//CHKSM=B4E7B803ED14C858BF513B4EAA46C6658043AB88

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

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

相关文章

社交媒体数据分析:赋能企业营销策略的利器

一、数据:未来的石油与导航仪 在数字化转型的大潮中,数据已成为推动企业发展的新燃料。它不仅是决策的依据,更是预见未来的水晶球。特别是在社交媒体这片广袤的海洋里,每一条帖子、每一次点赞、评论都蕴藏着消费者的偏好、市场的…

thinkphp8框架源码精讲

前言 很开心你能看到这个笔记,相信你对thinkphp是有一定兴趣的,正好大家都是志同道合的人。 thinkphp是我入门学习的第一个框架,经过这么多年了,还没好好的研究它,今年利用了空闲的时间狠狠的深入源码学习了一把&…

Proteus + Keil单片机仿真教程(五)多位LED数码管的静态显示

Proteus + Keil单片机仿真教程(五)多位LED数码管 上一章节讲解了单个数码管的静态和动态显示,这一章节将对多个数码管的静态显示进行学习,本章节主要难点: 1.锁存器的理解和使用; 2.多个数码管的接线封装方式; 3.Proteus 快速接头的使用。 第一个多位数码管示例 元件…

Qt学生管理系统(付源码)

Qt学生管理系统 一、前言1.1 项目介绍1.2 项目目标 2、需求说明2.1 功能性说明2.2 非功能性说明 三、UX设计3.1 登录界面3.2 学生数据展示3.3 信息插入和更新 三、架构说明3.1 客户端结构如下3.2 数据流程图3.2.1 数据管理3.2.2 管理员登录 四、 设计说明3.1 数据库设计3.2 结构…

嵌入式要卷成下一个Java了吗?

嵌入式系统与Java的关系在技术发展和市场需求的影响下在逐步演变,但尚未达到完全替代的阶段。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&…

system V共享内存【Linux】

文章目录 原理shmgetftokshmat(share memory attach)shmdt,去关联(share memory delete attach)shmctl ,删除共享内存共享内存与管道 原理 共享内存本质让不同进程看到同一份资源。 申请共享内存: 1、操作系统在物理内存当中申请…

【鸿蒙学习笔记】通过用户首选项实现数据持久化

官方文档:通过用户首选项实现数据持久化 目录标题 使用场景第1步:源码第2步:启动模拟器第3步:启动entry第6步:操作样例2 使用场景 Preferences会将该数据缓存在内存中,当用户读取的时候,能够快…

从2024上半年《人工智能现状报告》看GPU前世今生

前不久,全球领先的低代码平台Retool发布了最新的2024上半年《人工智能现状报告》,这份报告收集了约750名技术人员的意见,包括开发者、数据团队和各行业的领导者。报告通过调研人们对AI产生的情绪变化、AI应用现状、AI使用率等等几个方面总结了…

上海慕尼黑电子展开展,启明智显携物联网前沿方案亮相

随着科技创新的浪潮不断涌来,上海慕尼黑电子展在万众瞩目中盛大开幕。本次展会汇聚了全球顶尖的电子产品与技术解决方案,成为业界瞩目的焦点。启明智显作为物联网彩屏显示领域的佼佼者携产品亮相展会,为参展者带来了RTOS、LINUX全系列方案及A…

HTML 基础

文章目录 HTML 结构认识 HTML 标签HTML 文件基本结构快速生成代码框架 HTML 常见标签注释标签标题标签: h1-h6段落标签: p换行标签: br格式化标签图片标签: img超链接标签: a表格标签列表标签表单标签form 标签input 标签 label 标签select 标签textarea 标签无语义标签: div &…

浏览器书签助手mTab

本文软件由网友 P家单推人 推荐 什么是 mTab ? mTab 是免费无广告的浏览器书签助手,多端同步、美观易用的在线导航和书签工具,可以用 mTab 书签收藏并自定义常用网站的图标样式,帮助您高效管理网页和应用,提升在线体验。 官方提供…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行,可能是因为DNS不稳定吧,因为yum安装时会从三个”repo源“(base,extras,updates)随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时,比…

【开源项目的机遇与挑战】探索、贡献与应对

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 目录 引言 一:开源项目的发展趋势 🍃开源项目的蓬勃发展现状 🍃开…

ubuntu16.04安装低版本cmake(安装cmake安装)

文章目录 ubuntu16.04安装低版本cmake(安装cmake安装)1. **下载并解压CMake压缩文件**:- 首先,你需要从CMake的官方网站或其他可靠来源下载cmake-2.8.9-Linux-i386.tar.gz文件。- 然后在终端中使用以下命令解压文件: 2…

C++相关概念和易错语法(18)(array、模板)

1.array (1)普通数组的劣势 当我们直接越界修改值时,一般会在编译时就被拦截 但是越界访问,只要访问距离不算特别大,那么也可以越界访问 当我们不直接越界修改或访问,间接去访问和修改能越界非常远 这里的…

FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试

目录 创建工程创建 HDL 代码仿真添加管脚约束添加时序约束生成 bit 文件下载ILA 在线调试 创建工程 型号选择:以 AXU9EG 开发板为例,芯片选择 xczu9eg-ffvb1156-2-i 创建 HDL 代码 注意:由于输入时钟为 200MHz 的差分时钟,因此…

嵌入式开发过程中,常见报错以及解决方法

编写不易,仅供学习,参考谢谢,还望理解。 #常见报错 文件最后一行没有新行 翻译:文件的最后一行结束时没有新行 解决方法:定位到,提示报错的 .h 文件 报错行 ,加上一个新行 函数定义时与官方提…

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现,包括文档编辑器、在线思维导图、在线流程图等,前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文,分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…

Python酷库之旅-第三方库Pandas(017)

目录 一、用法精讲 41、pandas.melt函数 41-1、语法 41-2、参数 41-3、功能 41-4、返回值 41-5、说明 41-5-1、宽格式数据(Wide Format) 41-5-2、长格式数据(Long Format) 41-6、用法 41-6-1、数据准备 41-6-2、代码示例 41-6-3、结果输出 42、pandas.pivot函数 …

休息时间c++

题目描述 小杨计划在某个时刻开始学习,并决定在学习k秒后开始休息。 小杨想知道自己开始休息的时刻是多少。 输入 前三行每行包含一个整数,分别表示小杨开始学习时刻的时h、分m、秒s(h,m,s的值符合1≤h≤12,0≤m≤59,0≤s≤59)…