1.Cubemap–反射折射

使用脚本来创建Cubemap
①通过Camera.RenderToCubemap 把任意位置观察到的场景图制作成一张Cubemap之中
②脚本使用自定义编译窗体的命令 – ScriptableWizard
③于特定位置首先渲染好Cubemap
⑤lerp(a,b,w)函数, 根据w返回ab之间的插值,像是中混合

创建cubemap脚本
using UnityEngine;
using UnityEditor;
using System.Collections;public class RenderCubemapWizard : ScriptableWizard {//自定义编辑窗体public Transform renderFromPosition;public Cubemap cubemap;void OnWizardUpdate () {helpString = "Select transform to render from and cubemap to render into";isValid = (renderFromPosition != null) && (cubemap != null);}void OnWizardCreate () {// create temporary camera for renderingGameObject go = new GameObject( "CubemapCamera");go.AddComponent<Camera>();// place it on the objectgo.transform.position = renderFromPosition.position;// render into cubemap     go.GetComponent<Camera>().RenderToCubemap(cubemap);// destroy temporary cameraDestroyImmediate( go );}[MenuItem("GameObject/Render into Cubemap")]static void RenderCubemap () {ScriptableWizard.DisplayWizard<RenderCubemapWizard>("Render cubemap", "Render!");}
}
反射效果

完整代码

Shader "Unlit/Reflection"
{Properties{_Color ("Color Tint",Color) =(1,1,1,1)_ReflectionColor ("Reflection Color",Color) =(1,1,1,1)_ReflectionAmount ("Reflection Amount", Range(0,1)) = 1 //反射强度初始为最大_Cubemap ("Reflection Cubemap",Cube) = "_Skybox"{}//不同于其他的纹理材质,这里的初始值是默认的天空盒子}SubShader{Tags { "RenderType"="Opaque" "Queue"="Geometry" }//后面的这个自己写的时候忘记加上了}Pass{Tags {"LigheMode"= "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase//#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"struct appdata{float4 vertex : POSITION;// float2 uv : TEXCOORD0;没有用这个float3 Normal :NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldPos :TEXCOORD0;float3 worldNormal :TEXCOORD1  ;float3 worldRefl :TEXCOORD2 ;//忘记写视角方向float3 worldViewDir :TEXCOORD3 ;SHADOW_COORDS(4)};fixed4 _Color;fixed4 _ReflectionColor;fixed _ReflectionAmount;samplerCUBE _Cubemap; //用的是samplerCUBE,且没有偏移的那一堆v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//在顶点着色器中计算o.worldPos =mul(unity_ObjectToWorld,v.vertex).xyz; //不需要w分量的数据?应该是这样o.worldNormal = UnityObjectToWorldNormal(v.Normal);o.worldViewDir =UnityWorldSpaceViewDir(o.worldPos);o.worldRefl =reflect(-o.worldViewDir, o.worldNormal); //使用reflec函数输入视角方向和法线方向TRANSFER_SHADOW(o);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal =normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 worldViewDir =normalize (i.worldViewDir);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _Color.rgb * _ReflectionColor.rgb;fixed3 reflection = texCUBE(_Cubemap,i.worldRefl).rgb * _ReflectionColor.rgb;//通过反射方向对立方体进行采样UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);fixed3 color = ambient +lerp(diffuse,reflection,_ReflectionAmount) *atten;return fixed4(color,1.0);}ENDCG}}
}
折射效果

o.worldRefr = refract(-normalize(o.worldViewDir) , normalize(o.worldNormal) , _RefractRatio);//折射函数,第一个参数是入射光线的方向,第二个是表面法线,第三个是空气和玻璃折射率的比值1/1.5//其中第一第二个参数都需要归一化

完整:

Shader "Unlit/Refraction"
{Properties{_Color("Color Tint",Color) =(1,1,1,1)_RefractColor("Refraction Color",Color) =(1,1,1,1)_RefractAmount("Refraction Amount",Range(0,1)) = 1_RefractRatio("Refraction Ratio",Range(0.1,1)) = 0.5  //需要该属性来得到不同介质的透射比,初始化值是0.5,是空气和玻璃折射率的比值的近似值_Cubemap("Refraction Cubemap",Cube) = "_Skybox"{}   //使用默认的天空盒子}SubShader{Tags { "RenderType"="Opaque"  "Queue"="Geometry"}Pass{Tags {"LightMode"= "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "Lighting.cginc"#include "AutoLight.cginc"struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0 ;float3 worldPos :TEXCOORD1  ;float3 worldViewDir :TEXCOORD2 ;float3 worldRefr : TEXCOORD3 ;SHADOW_COORDS(4) };fixed4 _Color;fixed4 _RefractColor;fixed  _RefractAmount;fixed  _RefractRatio;samplerCUBE _Cubemap;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);o.worldRefr = refract(-normalize(o.worldViewDir) , normalize(o.worldNormal) , _RefractRatio);//折射函数,第一个参数是入射光线的方向,第二个是表面法线,第三个是空气和玻璃折射率的比值1/1.5//其中第一第二个参数都需要归一化TRANSFER_SHADOW(o);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir =normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 worldViewDir =normalize(i.worldViewDir);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _Color.rgb  * saturate(dot(worldNormal,worldLightDir));fixed3 refraction = texCUBE(_Cubemap,i.worldRefr).rgb * _RefractColor.rgb;UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);fixed3 color = ambient + lerp(diffuse,refraction,_RefractAmount)* atten;return fixed4(color,1.0); }ENDCG}}
}
菲涅尔反射(Fresnel Reflection)
使用Schlick 菲涅尔近似式来模拟

完整代码

Shader "Unlit/Fresnel-Schlick"
{Properties{_Color("Color Tinr",Color) = (1,1,1,1)_FresnelScale("Fresnel Scale",Range(0,1)) =0.5_Cubemap("Reflection Cubemap",Cube) = "_Skybox"{}}SubShader{Tags { "RenderType"="Opaque" "Queue"= "Geometry"}Pass{Tags{"LigheMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "Lighting.cginc"#include "AutoLight.cginc"struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal :TEXCOORD0 ;float3 worldPos :TEXCOORD1;float3 worldViewDir :TEXCOORD2 ;float3 worldRefl :TEXCOORD3 ;SHADOW_COORDS(4) };fixed4 _Color;fixed _FresnelScale;samplerCUBE _Cubemap;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);TRANSFER_SHADOW(o);return o;}fixed4 frag (v2f i) : SV_Target{//在片元着色器中计算菲涅尔反射fixed3 worldNormal =normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 worldViewDir = normalize(i.worldViewDir);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 reflection =texCUBE(_Cubemap,i.worldRefl).rgb;fixed fresnel = _FresnelScale + (1-  _FresnelScale)* pow(1-dot(worldViewDir,worldNormal),5);fixed3 diffuse = _LightColor0.rgb * _Color.rgb *  saturate(dot(worldNormal,worldLightDir));UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);fixed3 color = ambient +lerp (diffuse,reflection,saturate(fresnel))* atten;return fixed4(color,1.0);}ENDCG}}
}

2.渲染纹理

镜子效果

①用一个摄像机,将场景渲染到一张渲染纹理中
②创建一个渲染纹理(Render Texture)
③将创建的渲染纹理拖拽到摄像机的Target Texture 中
④使用渲染纹理作为输入属性,并在水平方向上翻转,直接显示到预先建立的Quad之上

完整代码

Shader "Unlit/Mirror_shader"
{Properties{_MainTex ("Texture", 2D) = "white" {}//镜子实现通过 一个渲染纹理作为输入属性,并把该渲染纹理在水平方向上翻转后直接显示到物体上即可}SubShader{Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass{//Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag//#pragma multi_compile_fwdbase//#include "Lighting.cginc"sampler2D _MainTex;//不需要偏移struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;};v2f vert (appdata v){v2f o;o.pos =UnityObjectToClipPos(v.vertex);o.uv = v.uv;//镜子效果需要翻转x轴o.uv.x = 1-o.uv.x;return o;}fixed4 frag (v2f i) : SV_Target{return tex2D(_MainTex,i.uv);//直接返回}ENDCG}}FallBack Off
}
玻璃效果

①通过GrabPass获取屏幕图像
②注意渲染的顺序,在所有不透明物体之后渲染
③需要转换获取的屏幕坐标

完整代码

Shader "Unlit/Glass"
{Properties{_MainTex ("Texture", 2D) = "white" {}_BumpMap ("Normal Map",2D) ="bump"{}_Cubemap ("Environment Cube",Cube) ="_Skybox"{} _Distortion ("Distortion",Range(0,100)) =10 //用于控制模拟折射时图像的扭曲程度_RefractionAmount("Refraction Amount",Range(0.0,1.0)) =1.0//用于控制折射程度,在制作折射的shader中也有用到//值为0时,该玻璃只包含反射效果,当为1时,只为折射效果}SubShader{Tags {"Queue"="Transparent" "RenderType"="Opaque" }//为保证不透明物体先于玻璃渲染,把渲染队列改成透明物体GrabPass{ "_RefractionTex" }//通过GrabPass定义了一个抓取屏幕图像的pass,这个pass 定义了一个字符串//字符串内部的名称决定了抓取到的屏幕图像存储于哪个纹理之中-- _RefractionTex//实际上可以不声明字符串,声明可以获取更高的性能Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpMap;float4 _BumpMap_ST;samplerCUBE _Cubemap;float _Distortion;fixed _RefractionAmount;sampler2D _RefractionTex;float4 _RefractionTex_TexelSize;//TexelSize可以让我们得到该纹理的纹素大小//如它是256x512的,他的纹素大小为(1/256,1/512),需要偏移时使用该变量struct appdata{float4 vertex : POSITION;float2 texcoord : TEXCOORD0;float3 normal :NORMAL;float4 tangent :TANGENT;};struct v2f{float4 pos : SV_POSITION;float4 scrPos:TEXCOORD0 ; //float3 worldNormal :TEXCOORD1;//float3 worldTangent:TEXCOORD2 ;//float3 worldBinormal:TEXCOORD3 ;顶点着色器中使用这些来构建转换矩阵,后面无需float4 uv : TEXCOORD1 ;float4 TtoW0:TEXCOORD2 ;float4 TtoW1:TEXCOORD3 ;float4 TtoW2:TEXCOORD4 ; };v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.scrPos = ComputeGrabScreenPos(o.pos);//通过此函数来得到对应的被抓取的屏幕图像的坐标o.uv.xy =TRANSFORM_TEX(v.texcoord, _MainTex);o.uv.zw =TRANSFORM_TEX(v.texcoord, _BumpMap);float3 worldPos = mul (unity_ObjectToWorld,v.vertex).xyz;float3 worldNormal = UnityObjectToWorldNormal(v.normal);float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);float3 worldBinormal = cross (worldNormal,worldTangent) * v.tangent.w; //由于使用到法线纹理,我们需要模型的法线信息//当我们通过Grabpass获取了屏幕图像之后//就使用切线空间下的法线对屏幕纹理坐标进行偏移o.TtoW0= float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);o.TtoW1= float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);o.TtoW2= float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);return o;}fixed4 frag (v2f i) : SV_Target{float3 worldPos =float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));fixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));   //反映射法线纹理float2 offset = bump.xy * _Distortion * _RefractionTex_TexelSize.xy;//在切线空间中计算偏移量,第二个是扭曲程度,第三个是纹素大小//之所以在切线空间下计算偏移量,是因为该空间下的法线可以反映顶点局部空间下的法线方向i.scrPos.xy = offset * i.scrPos.z + i.scrPos.xy;//书上写的是  i.scrPos.xy = offset  + i.scrPos.xy; ??fixed3 refrCol = tex2D( _RefractionTex , i.scrPos.xy / i.scrPos.w ).rgb;//简言之ComputeGrabScreenPos得到的屏幕空间坐标并不是真正的空间坐标//它是包含了插值之后的结果,必须除以w分量,还原出真正的视口坐标//原理是通过透视除法,得出真正的屏幕坐标//通过这样来得到反射的颜色也就是空间中所有已经渲染的不透明物体,都已经在一张贴图中bump = normalize (half3(dot(i.TtoW0.xyz,  bump),   dot(i.TtoW1.xyz,bump),  dot(i.TtoW2.xyz, bump)));//把法线转换到世界空间fixed3 reflDir = reflect(-worldViewDir, bump);//反射方向通过 光源方向,和法线方向 计算fixed4 texColor = tex2D(_MainTex, i.uv.xy);//主纹理颜色fixed3 reflCol  = texCUBE(_Cubemap,reflDir).rgb * texColor.rgb ;fixed3 finalCol = reflCol * (1 - _RefractionAmount) + refrCol * _RefractionAmount;return fixed4(finalCol,1);}ENDCG}}FallBack "Diffuse"
}

结论是:GrabPass的实现比渲染纹理简单,但从效率上说渲染纹理更好于GrabPass ,GrabPass可能会对性能产生影响

3.程序纹理

①使用脚本创建材质和纹理
②可以在Inspector面板更改参数,并实时调整贴图
③使用SetProperty插件实现↑

关于如何使用SetProperty插件

Setproperty


c#代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[ExecuteInEditMode]
public class procedural_tex : MonoBehaviour {public Material material = null ;  //一个材质private Texture2D m_generatedTexture =null; //一个纹理#region Material properties[SerializeField, SetProperty("textureWidth")]private int m_textureWidth=512;public int textureWidth{get{return m_textureWidth;}set{m_textureWidth = value;_UpdateMaterial();}}[SerializeField, SetProperty("BackgroundColor")]private Color m_backgroundColor = Color.white;public Color backgroundColor{get{return m_backgroundColor;}set{m_backgroundColor =value;_UpdateMaterial();}}[SerializeField, SetProperty("circleColor")]private Color m_circleColor = Color.yellow;public Color circleColor{get{return m_circleColor;}set{m_circleColor =value;_UpdateMaterial();}}[SerializeField, SetProperty("blurFactor")]private float m_blurFactor =2.0f;public float blurFactor {get{return m_blurFactor;}set{m_blurFactor =value;_UpdateMaterial();}}#endregion// Use this for initializationvoid Start () {if(material == null){Renderer renderer = gameObject.GetComponent<Renderer>();if (renderer == null){Debug.LogWarning("Can not find a renderer.");return;}material = renderer.sharedMaterial;}_UpdateMaterial();}// Update is called once per frameprivate void _UpdateMaterial () {if(material != null){m_generatedTexture = _GenerateProceduralTexture();material.SetTexture("_MainTex", m_generatedTexture);}//确保material 不为空,然后调用_GenerateProceduralTexture函数 生成一张程序纹理,并赋予给 m_generatedTexture 变量//之后material.SetTexture函数把纹理赋予给材质 ,材质material中需要一个名为_MainTex的纹理属性}//混合颜色的函数private Color _MixColor(Color color0, Color color1, float mixFactor){Color mixColor = Color.white;mixColor.r = Mathf.Lerp(color0.r, color1.r, mixFactor);mixColor.g = Mathf.Lerp(color0.g, color1.g, mixFactor);mixColor.b = Mathf.Lerp(color0.b, color1.b, mixFactor);mixColor.a = Mathf.Lerp(color0.a, color1.a, mixFactor);return mixColor;}private Texture2D _GenerateProceduralTexture()  //产生贴图{Texture2D proceduralTexture = new Texture2D(textureWidth, textureWidth);  //初始化了一张二维的纹理//在材质属性中定义了贴图的大小float circleInterval = textureWidth / 4.0f;  //圆与圆之间的距离float radius = textureWidth / 10.0f; //半径  float edgeBlur = 1.0f / blurFactor;  //定义模糊系数for(int w =0; w < textureWidth; w++) {for(int h= 0; h < textureWidth; h++){Color pixel = backgroundColor; //初始化背景颜色为白色for (int i = 0; i<3; i++){for(int j = 0; j<3; j++){Vector2 circleCenter = new Vector2(circleInterval * (i + 1), circleInterval * (j + 1));  //圆心位置Vector2(x,y)float dist = Vector2.Distance(new Vector2(w, h), circleCenter) - radius;//计算当前像素与圆心的距离//static function Distance (a : Vector2, b : Vector2) : float //返回a和b 之间的距离Color color = _MixColor(circleColor, new Color(pixel.r, pixel.g, pixel.b, 0.0f), Mathf.SmoothStep(0f, 1.0f, dist * edgeBlur));//模糊圆的边界pixel = _MixColor(pixel, color, color.a);}}proceduralTexture.SetPixel(w, h, pixel);}}proceduralTexture.Apply();return proceduralTexture;}
}

以上啾咪

Unity shader Note :高级纹理(CubeMap反射折射菲涅尔,Rendermap镜子玻璃,程序纹理)相关推荐

  1. Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)

    综合效果 经过各元素叠加 和 程序的审美调参 后的综合效果 交互的水波与边缘浪花的合并需要优化一下 反射 两种方案: cubeMap 以水面对称设一个摄像机 cubeMap 实现:反射探针生成Cube ...

  2. (十七)unity shader之——————高级纹理之程序纹理

    程序纹理指的是由那些计算机生成的图像,我们通常使用一些特定的算法来创建个性化图案或非常真实的自然元素,例如木头.石子等.使用程序纹理的好处在于我们可以使用各种参数来控制纹理的外观,而这些属性不仅仅是那 ...

  3. 【unity shader】高级光照 --- 薄膜干涉

    -光照模型是shader编程的核心与基础. 一般的光照模型–不管是lambert还是phong–其实都是对现实光照的模拟. 但是现实中的光照效果要复杂得多.但就光的反射而言, 薄膜干涉就是一种非常常见 ...

  4. Unity Shader:实现菲涅尔+色散效果的环境映射以及相关原理解析

    文章目录 1,色散在光学中的原理 2,反射的数学计算方法以及用它实现环境映射 3,折射的原理以及色散的实现 4,菲涅尔效果 5,拥有菲涅尔与色散效果的环境映射 1,色散在光学中的原理 复色光 --现实 ...

  5. Unity Shader:实现菲涅尔+色散效果以及相关原理解析

    1,色散在光学中的原理  2,反射的原理以及环境映射的实现  3,折射的原理以及色散的实现  4,菲涅尔效果  5,将菲涅尔与色散效果增加到环境映射中 1,色散在光学中的原理 复色光  --现实生活中 ...

  6. shader 反射 水面_UnityShader-菲涅尔反射(Fresnel Reflection)

    菲涅耳公式(或菲涅耳方程),由奥古斯丁·让·菲涅耳导出.用来描述光在不同折射率的介质之间的行为.由公式推导出的光的反射称之为"菲涅尔反射".菲涅尔公式是光学中的重要公式,用它能解释 ...

  7. unity shader 菲涅尔效果

    老样子,还是先上效果图: 菲涅尔效果的原理大家可以自己去百度看看,网上有很多,这里就不多说了,我们直接看如何实现这个效果 实现思路: 1.求得视角方向,法线方向(世界空间下) 2.根据菲涅尔效果的公式 ...

  8. Physics CG:菲涅尔(fresnel)反射

    这一篇是物理学CG的开篇,其实我多开了一个分类也是心理无奈的,自身水平有限,而很多物理图形学知识积累太少,有些甚至根本没学过.然而高级图形学知识中,或者说高级图形着色效果中,很大一部分是基于" ...

  9. Shader学习21——基于菲涅尔透明的扫描线

    看到人家这样的一个效果,于是想自己也复制一个 Mar-26-2021 17-16-26.gif 想了一下思路,应该是菲涅尔的做的一个透明效果(单纯的菲涅尔透明可以看这篇),再去做了一个线的效果,线应该 ...

最新文章

  1. 安装EBS前期检查工具 - RDA - Health Check / Validation Engine Guide
  2. MySQL根据用户的接单量统计用户的排名
  3. setNeedsDisplay看我就懂!
  4. 机器学习顶刊文献_人工智能顶刊TPAMI2019最新《多模态机器学习综述》
  5. mysql profiling_MySQL Profiling 的使用
  6. VS2010_x86_编译错误
  7. 【ZOJ 4053】【青岛网络赛主席树+启发式合并】
  8. 计算机10大经典算法
  9. 简短的爬虫程序,14行Python代码轻松实现爬取网站视频
  10. 《ERP原理》期末复习——第四章 基础数据
  11. u盘盘符不显示 win10_Win10不显示U盘的盘符怎么办丨Win10不显示U盘的盘符解决方法...
  12. 计算机英语四六级考试时间,2019年12月英语四六级考试时间
  13. Angular 三目运算符
  14. matplotlib绘制图表
  15. 笔记本电脑f11功能键_电脑的键盘上的F1至F12的功能分别是什么
  16. 如何使用WordPress建立一个博客、网站和论坛
  17. 2017蓝桥杯java本科模拟赛
  18. 深圳大学 (2020) 研究生基础综合英语口语测试
  19. 解密翻译:爱的摩斯密码
  20. ChatGPT检测器(Detector)

热门文章

  1. 头脑风暴与德尔菲技术的介绍与区别
  2. 使用Eclipse UML 插件 Papyrus由Java代码反向生成类图
  3. Python3 基础语法
  4. 多传感器融合算法,雷视融合算法
  5. 三维GIS、BIM、倾斜摄影、实时视频流 进行融合,建立CIM环境,搭建数字孪生、元宇宙平台 免费下载 开发C++源代码 点卯-魔镜系列
  6. pytorch中常用对张量shape的操作
  7. 能量原理与变分法笔记08: 虚功原理的推导
  8. c和java哪个难_为什么说 C 语言比 Java 难?
  9. 检讨书生成微信小程序工具源码
  10. android 禁用模拟器,如何禁用android模拟器键盘弹出