《Unity Shader入门精要》自学笔记(七)第九章 更复杂的光照 ——光照衰减

2023-11-12

帧调试器FrameDebugger

又是一个好玩的小玩具好用的小工具呢!
可以通过Window → Analysis → Frame Debugger打开
然后点击左上角的Enable,就可以查看了
在这里插入图片描述
点击1打开或关闭Frame Debugger
滑动2一步一步查看渲染过程
点击3切换显示渲染效果和shader中的属性值(对于纹理,可以ctr + 鼠标左键查看大图)
点击4查看每个步骤的状态

目前只要知道这些就可以了,Frame Debugger的更多玩法详情见Unity User Manual (2019.4 LTS)Graphics Optimizing graphics performanceFrame Debugger

Unity中的光源

Unity中光源的属性

Light组件中的3个属性

  1. 颜色(Color)
  2. 强度(Intensity)
  3. 衰减(Attenuation):Unity光源的Inspector面板中,使用该光源可以照亮的半径Range来表示

以及Transform组件中的两个属性

  1. 位置(Position):与衰减、强度参数一起计算到达顶点的光照强度
  2. 方向(Direction):与到达顶点的光照强度、光照颜色等属性计算顶点接受的光照

上面的5个属性用一个可以调节亮度的手电筒来理解就再简单不过了

  1. 颜色:手电筒的灯泡可以是白色,也可以是浅蓝色,还可以是骚气的绿色,它们打在物体上(比如白色的墙面)会有不同的效果
  2. 强度:手电筒可以调节不同的亮度档次,光打在物体上的效果也会不一样
  3. 衰减&位置:拿着手电筒靠近或远离物体,光打在物体上的效果也会不一样
  4. 方向:向左或右迈一大步,但手电筒还是打在之前的位置上,相当于改变了光照的方向,效果也会不一样

Unity中的4种光源类型

  1. 平行光(Directional Light)
    最简单粗暴的光源:对所有点的方向、强度都一样,不受位置、衰减参数的影响
    举例:太阳
    影响属性:颜色、强度、角度
  2. 点光源(Point Light)
    由空间球体定义,由一个点发出的、向所有方向延伸的光,不受角度属性影响
    举例:蜡烛、星星点点的装饰灯
    影响属性:颜色、强度、衰减(Inspector中,使用该光源可以照亮的区域的半径Range来表示)、位置
  3. 聚光灯(Spot Light)
    在点光源的基础上,限制了光线发出的方向范围为一个锥形区域,需要额外计算来判断一个点是否在锥形区域内(是否被照亮)
    举例:手电筒、舞台聚光灯
    影响属性:颜色、强度、衰减、位置、方向、锥形区域打开的角度(Spot Angle)
  4. 面光源(Area Light)
    烘焙光源:只在烘焙时有效

在Unity的前向渲染中获得光源的属性

准备工作

SubShader{
	Tags{"RenderType" = "Opaque"}

	Pass{
		Tags{"LightMode" = "ForwardBase"} // ForwardBase Pass

		CGPROGRAM
		#pragma multi_compile_fwdbase // 正确赋值一些内置变量			
		#pragma vertex vert
		#pragma fragment frag
		#include "Lighting.cginc"
		// ...
		ENDCG
	}

	Pass{
		Tags{"LightMode" = "ForwardAdd"} // ForwardAdd Pass
		Blend One One // 注意开启混合,否则之前的渲染结果会被覆盖
		
		CGPROGRAM
		#pragma multi_compile_fwdadd // 正确赋值一些内置变量
		#pragma vertex vert
		#pragma fragment frag
		#include "Lighting.cginc"
		#include "AutoLight.cginc"
		// ...
		ENDCG
	}
	FallBack "Specular"
}

接下来看之前最常用到的平行光,在ForwardBase Pass中片元着色器的代码

fixed4 frag(v2f i) : SV_Target {
	// 方向(平行光位置参数无效,_WorldSpaceLightPos0.w = 0,_WorldSpaceLightPos0.xyz中存储rotation)
	fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
	fixed3 worldNormal = normalize(i.worldNormal);
	
	fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
	
	// 颜色 & 强度: _LightColor0已经是 颜色*强度 的结果
 	fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));

 	fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
 	fixed3 halfDir = normalize(worldLightDir + viewDir);
 	fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);

	// 衰减:平行光可以认为无衰减
	fixed atten = 1.0;
	
	// 最终结果计算:记得带上衰减的影响
	return fixed4(ambient + (diffuse + specular) * atten, 1.0);
}

然后是ForwardAdd Pass中的点光源和聚光灯:
PS:这段代码信息量有点大,代码注释中基本只解释了每行代码的作用,更具体的作用和意思会单独拿出来说

fixed4 frag(v2f i) : SV_Target {
	// 方向
	#ifdef USING_DIRECTIONAL_LIGHT // 如果该光源是平行光
		// 直接使用平行光的方向即可
		fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
	#else // 如果是点光源或聚光灯
		// 光照方向需要使用 光源位置 - 点坐标 进行计算
		fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz);
	#endif
	
	// 颜色 & 强度: _LightColor0已经是 颜色*强度 的结果
	fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));
	
	fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
	fixed3 halfDir = normalize(worldLightDir + viewDir);
	fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);
	
	// 衰减
	#ifdef USING_DIRECTIONAL_LIGHT // 如果是平行光
		fixed atten = 1.0;		   // 认为无衰减
	#else
		#if defined (POINT) // 点光源
			// 计算该点在光源空间的坐标
	        float3 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1)).xyz;
	        // 纹理采样获得该点的光源衰减
	        fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
	    
	    #elif defined (SPOT) // 聚光灯
	    	// 计算该点在光源空间的坐标
	        float4 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1));
	        fixed atten = // 式子有点长,下面分行写
	        // 物体在聚光灯z轴正方向时会受到光照
	        (lightCoord.z > 0)
	        // _LightTexture0,cookie纹理,聚光灯的投影形态
	        * tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w 
	        // _LightTextureB0,衰减纹理
	        * tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
	    #else
	        fixed atten = 1.0;
	    #endif
	#endif

	// 最终结果计算:记得带上衰减的影响
	return fixed4((diffuse + specular) * atten, 1.0);
}

迷惑点1:mul(unity_WorldToLight, float4(i.worldPos, 1)),为什么要float4(i.worldPos, 1)的“1”?
之前进行的空间变换都是直接与矩阵相乘,这次为什么要多一个1呢?
因为这次是对点进行变换,之前是对向量(w为0,且位置对向量无意义)

迷惑点2:dot(lightCoord, lightCoord).rr是啥东西?

fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;

首先认识一下“最熟悉的陌生人”:.,它是Cg语言中常见的swizzle操作符,可以将一个向量的成员取出组成一个新的向量
比如,float4 a = (0.1, 0.2, 0.3, 1),那a.rgb = a.xyz = (0.1, 0.2, 0.3),a.aa = a.ww = (1, 1)

然后再看,lightCoord是刚刚计算的点在光源空间的坐标
那dot(lightCoord, lightCoord)就是点距离光源中心的距离的平方
那dot(lightCoord, lightCoord).rr就是用这个距离的平方构造了一个xy相等的二维坐标
那tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr就是对_LightTexture0对角线上的纹理进行采样

补充
dot(lightCoord, lightCoord) 是距离的平方,作为采样的纹理坐标,其值域应该是 [0,1],应该怎么理解呢?
 
(目前没有找到更多关于光源空间坐标的信息,以下仅为个人理解)
虽然uv的范围是(0,1),但是纹理也分 clamp 和 repeat 两种
很明显 _LightTextureB0 这里是 clamp 类型,那么距离的平方这里也就很好理解了,当它的范围超过 1 时,会按照(1,1)采样,也就是距离超过了光源可以照亮的最大范围,衰减为 0 了
 
那是不是所有到光源距离超过 1 的点都会衰减到 0 ?
其实不是的,因为准确的说是 “ 光源空间中,到光源距离超过 1 的点的光照都会衰减到 0 ”
也就是说,点的光照是不是会衰减为 0,取决于点转换到光源空间后,它到光源的距离是不是大于 1
 
根据上面说过的两点,其实可以推测出,修改光源的光照范围,其实就是修改光源空间 xyz 三个坐标轴在世界空间的向量表示,导致世界空间和光源空间的转换矩阵被改变,进而改变了点转换到光源空间后到光源的距离,最终改变了这个点的光照衰减值

迷惑点3:纹理采样怎么得到衰减?衰减纹理长什么样?
这里的采样的纹理其实就是一张查找表(Lookup Table,LUT),因为使用数学公式计算衰减往往涉及开根号、除法等计算量较大的操作

根据代码来看,查找表获得的颜色值的UNITY_ATTEN_CHANNEL通道就是衰减值,那么它一定是rgb中的一个颜色,或者a透明度

在场景里只开启一个点光源,放到可以离物体较近且可以较好的照亮物体的地方,打开帧调试器,一步一步找到这个_LightTexture0纹理,它被Unity标记成了“UnityAttenuation”
在这里插入图片描述
从小图标看,大致能猜到这个UNITY_ATTEN_CHANNEL通道就是r通道了
不过这个纹理的尺寸是1024 * 1的,无法正常通过ctr + 鼠标左键打开查看:
在这里插入图片描述
于是从知乎上( UnityShader入门精要笔记12:高级光照B)找到了一个获取衰减纹理的shader,换上这个shader后再打开帧调试器,就能看到这张纹理了:
在这里插入图片描述
可以看到这个纹理的名字是“TempBuffer1713”,尺寸是328 * 322,刚好是当前Game窗口的大小
这是因为现在看到的这张纹理并不是真正的_LightTexture0,而是渲染到Game窗口的最终帧图像
在这里插入图片描述
图中红色框住的是名为TempBuffer1713的普通MainTex(Game窗口尺寸)
蓝色框住的是名为UnityAttenuation的衰减纹理_LightTexture0(还是1024 * 1,查看无果),看阶段的名字也可以明白原因

…扯远了,平面上的纹理对角线的r通道颜色值,就是光照强度随顶点到光源衰减后的值
在这里插入图片描述
要注意把xy轴的方向放对,否则平面的纹理会出现翻转(红边不在左侧)的情况
现在这样就符合从(0,0)到(1,1)光照强度越来越小了

迷惑点4:(lightCoord.z > 0)怎么也可以放到式子里计算?有什么用?
把它改成(lightCoord.z > 0.5),在场景里看一下效果:
在这里插入图片描述
注意观察右侧Transform组件的position的y值,和场景中的光照效果
可以发现,大概是在5的位置,光照效果会在突然出现或消失

代码中写的是0.5,中间差了10倍
找一找就会发现,刚好Range参数的设置是10
在这里插入图片描述
把y值改为4.999,发现光照消失
在这里插入图片描述
再把Range改为20,y值调整为10和9.999进行验证,符合刚刚的结论
在这里插入图片描述
在这里插入图片描述
所以这个(lightCoord.z > 0.5)其实是和Range一起计算,来判断某一点是否会被光照到
它其实也等价于 lightCoord.z > 0 ? 1 : 0;或者lightCoord.z > 0.5 ? 1 : 0;这些

迷惑点5:tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w是什么?
在计算点光源的代码中,_LightTexture0是衰减纹理
与计算聚光灯的代码对比发现,聚光灯的衰减纹理计算使用的纹理是_LightTextureB0,那它的_LightTexture0又是什么?

先分析一下这个代码:

  1. 前面知道lightCoord是点的光照空间坐标
  2. 在线性代数的基础章节可以知道,lightCoord.xy / lightCoord.w的操作其实是将点的齐次坐标转换成了三维空间的坐标(把w分量的值还原为1),再 + 0.5
  3. 接下来再取其xy分量作为纹理坐标,对_LightTexture0进行采样,然后取w通道的值
  4. 最后再用w通道的值乘以衰减纹理(_LightTextureB0)的采样值

对于2中的 + 0.5,之前像素的章节学习过,像素的坐标是它中心点的坐标,所以要 + 0.5

// 物体在聚光灯z轴正方向时会受到光照
(lightCoord.z > 0)
// 
* tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w 
// _LightTextureB0,衰减纹理
* tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;

回忆之前学习过的遮罩纹理和渐变纹理,可以很轻松猜到对_LightTexture0采样的w通道应该就是聚光灯的遮罩通道

再打开帧调试器进行确认:
在这里插入图片描述
_LightTextureB0是一个128*128的纹理,可以打开查看
中间白四角黑,边界有较为平滑的灰色过度,很容易让人联想到遮罩
再联想一下,就会想到聚光灯投射到物体上的光点
在这里插入图片描述

补充:
Spot面板上有一个可以放纹理的地方:Cookie
在这里插入图片描述
随便选一个上去
在这里插入图片描述
聚光灯的光照区域变成了刚刚选择的纹理的灰度图
并且给出了警告:聚光灯的Cookie纹理要设置为Clamp模式,避免出现走样

同时打开帧调试器,发现原先的白色圆圈已经变成了刚刚的蓝色法线纹理,也证明了这个LightTexture0就是刚刚的Cookie纹理
在这里插入图片描述
至此这三行代码终于都明白了

// 物体在聚光灯z轴正方向时会受到光照
(lightCoord.z > 0)
// _LightTexture0,cookie纹理,聚光灯的投影形态
* tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w 
// _LightTextureB0,衰减纹理
* tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;

总结
这一部分感受最深的是,帧调试器真好用!玩多了甚至有点上瘾
之前复习过的比较基础的线代知识也真的很有用,果然基础很重要

另外,乐乐大佬的这本书编排顺序真的很适合小白学习啊,还好当时没有跳着看

参考资料
UnityShader入门精要笔记12:高级光照B这篇文章帮我解决了很多问题,也提供了很多思路,表示感谢~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Unity Shader入门精要》自学笔记(七)第九章 更复杂的光照 ——光照衰减 的相关文章

  • 混沌神经网络的实际应用,进化算法优化神经网络

    人工神经网络的发展趋势 人工神经网络特有的非线性适应性信息处理能力 克服了传统人工智能方法对于直觉 如模式 语音识别 非结构化信息处理方面的缺陷 使之在神经专家系统 模式识别 智能控制 组合优化 预测等领域得到成功应用 人工神经网络与其它传
  • QFileDialog.getOpenFileName获取打开的文件路径

    前段时间要做一个打开文件并上传的功能 在不多加一个窗口的情况下选中那个打开的文件 def addButtonClicked self index try file name QFileDialog getOpenFileName self
  • Ubuntu20.04下编译测试RocksDB以及遇到的问题记录

    rockdb编译 git clone https github com facebook rocksdb git 如果上面的命令报错无法连接 则换成下面这句 git clone git github com facebook rocksdb
  • 大数据简历要点与模拟面试和项目介绍模板二

    15 模拟面试和项目介绍模板10 一 自我介绍 目前不知道怎么做 您好 我叫xxx 毕业于xxx学校 因为在大学里学过javase mysql web 数据结构与算法等计算机基础知识 在一份软件测试的实习中接触到数据仓库 用户画像 推荐系统
  • Mybatis如何实现多表查询

    一 按照配置文件的方式 在Java端mybatis框架里写联查sql语句 通过orm模型解析 这里需要考虑一对一以及一对多的关系 按student和score表举例 student对于score是一对多的关系 score对于student来
  • 访谈录:中国的软件业需要悟道

    1 记者 目前 随着中国IT业的发展 国外IT企业对中国IT业也越来越重视 能否简单介绍一下目前中国外包情况 陆其明 近几年 中国IT业的发展确实比较快 特别是软件行业 你可以看到 全国各地都在建软件园 各级政府对软件企业也都有政策倾斜 软
  • Three.js - 从 PLY 模型中创建粒子系统

    PLY全称 Polygon or Stanford Triangle Format 多边形或三角形格式 可以有效地保存和加载简单 静态的3D内容 支持二进制和ascii格式 可以存储顶点位置 颜色 法线和uv坐标 不能保存纹理 示例 htt
  • 登录模块丨前端uniapp微信小程序项目

    小兔鲜儿 微信登录 涉及知识点 微信授权登录 文件上传 Store 状态管理等 微信登录 微信小程序的开放能力 允许开发者获取微信用户的基本信息 昵称 性别 手机号码等 开发者常用来实现注册 登录的功能 登录方式 常见登录 注册方式 用户名
  • 9.java程序员必知必会类库之加密库

    前言 密码学在计算机领域源远流长 应用广泛 当前每时每刻 每一个连接到互联网的终端 手机 电脑 iPad都会和互联网有无数次的数据交互 如果这些数据都是明文传输那将是难以想象的 为了保护用户隐私 防止重要数据被窃取 篡改 我们需要对我们的数
  • 使用迭代器(iterator)遍历vector、map等

    所涉及方法 添加元素 array push back 正向迭代器 vector iterator 迭代器变量名 反向迭代器 vector reverse iterator 迭代器变量名 在不知道所包含数据个数的情况下用以遍历元素 vecto
  • [初学Python] IndentationError:unexpected indent

    在用Python实现求100以内的质数的编译程序或者说解释程序时出现了以下错误 根据编译后 解释后 的错误提示 说是num的 n 是一个IndentationError unexpected indent 什么意思呢 indentation
  • mac本工具使用配置

    1 CotEditor 文本编辑器 文本换行或者不换行设置 格式 换行 文本分栏展示 方便对比 显示 分栏显示 隐藏元素可见模式 格式 隐藏不可见元素
  • 解决Eclipse创建Android项目时出现No resource found that matches the given name ‘Theme.AppCompat.Light’的问题

    首先 对于该问题的详细分析大家可以查看Theme AppCompat Light问题的深入分析一文 里面详细介绍了该问题出现的原因 简单来讲 就是新的eclipse默认模版主题UI需要使用比较高版本api 如果需要支持低版本 需要导入app
  • 华为OD机试 - 九宫格按键输入(Java)

    题目描述 九宫格按键输入 输出显示内容 有英文和数字两个模式 默认是数字模式 数字模式直接输出数字 英文模式连续按同一个按键会依次出现这个按键上的字母 如果输入 或者其他字符 则循环中断 字符对应关系如图 要求输入一串按键 输出屏幕显示 输
  • ad原理图怎么导出pdf_如何把PDF导出为图片?方法很简单!

    很多人想将PDF文件转换成JPG文件 却不知道怎么转 或者通过网上一些方法 导出来的图片分辨率却很低 那我们怎么让PDF文件转换成JPG文件相对应的分辨率 今天小编给大家分享PDF快速导出JPG的技巧 PDF转jpg图片方法一 另存为法 另
  • TOP 100值得读的图神经网络----自监督学习与预训练

    清华大学的Top 100 GNN papers 其中分了十个方向 每个方向10篇 此篇为自监督学习与预训练方向的阅读笔记 Top100值得一读的图神经网络 大家好 我是蘑菇先生 今天带来Top100 GNN Papers盘点文 此外 公众号
  • C语言经典编程题---交换两个数

    1 给定两个整形变量的值 将两个值的内容进行交换 include
  • 正确解决vs运行的输出框闪退问题

    如果是想看见下面这样的输出框 很简单 要在调试停止时自动关闭控制台 请启用 工具 gt 选项 gt 调试 gt 调试停止时自动关闭控制台 截图如下

随机推荐

  • 【OS】【期末选择题】【2023春】【仅供参考】

    文章目录 题型 一 选择 第一章 10 第二章 19 第三章 23 第四章 32 第五章 15 第六章 15 二 填空题 三 简答题 1 信号量 2 调度算法 3 页面置换 4 虚拟地址到物理地址的映射 Reference 题型 题型 题量
  • C语言---Unix套接字用于本地通信

    1 作用 用于本地间通信 2 使用 创建套接字的时候使用本地协议通信 AF UNIX 或者AF LOCAL 分为流式套接字和用户数据报套接字 unix socket socket AF LOCAL SOCK STREAM 0 unix so
  • 如何将python2/3修改为默认版本

    基于update alternatives命令 此方法为系统级修改 直接执行下面两个命令即可 sudo update alternatives install usr bin python python usr bin python2 10
  • WSL安装cuda输入nvidia-smi遇到报错

    打算在WSL安装Cuda 但是安装成功后发现输入nvidia smi一直报错 查了很多文章都没法解决 本来都准备放弃了 随手查看了下WSL版本 发现WSL一直是 1 改成 2 之后再次安装CUDA WSL驱动直接成功 1 在powershe
  • SQL SERVER表字段与关键字冲突的解决

    办法很简单 建表的时候 该字段用 包含起来即可 例如 create table test reqid varchar 20 IDENTITY int
  • 使用Tesseract和OpenCV构建自动收据扫描仪

    使用Tesseract和OpenCV构建自动收据扫描仪 这篇博客将介绍如何使用Tesseract和OpenCV构建自动收据扫描仪 将使用OpenCV构建系统的实际图像处理组件 包括 检测图像中的收据 边缘检测 轮廓检测 基于弧长和近似的轮廓
  • 操作系统(一):什么是操作系统

    1内核 1 1概念 操作系统主要关注操作系统的内核 1 2特征 1 2 1并发 计算机系统中同时存在多个运行的程序 需要OS管理调度 并发与并行 并发 一段时间内有多个程序运行 并行 一个时间点上有多个程序可以同时执行 要求系统存在多个CP
  • Python为什么叫爬虫?

    因为python的脚本特性和易于配置 对字符的处理也非常灵活 加上python有丰富的网络抓取模块 所以叫爬虫 1 网络爬虫是指一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 另外一些不常使用的名字还有蚂蚁 自动索引 模拟程序或者蠕
  • Excel分类统计数量

    Excel分类统计数量 方法一 1 打开需要分类的excel表格 2 选中 事项类型 的列表信息 对其进行排序 升序 降序 3 排序结束后 选择需要进行分计数的列 点击 数据 分类汇总 4 选择需要的 分类字段 汇总方式 汇总项 5 选择后
  • Mac平面设计师必备软件,懂word就会设计,内置海量模板。

    Swift Publisher是Mac平面设计师必备软件 内置了丰富的彩色传单 折页 海报 画册 展架等模版 点击即可直接编辑并快速完稿 相比于其他的设计软件 Swift Publisher更简单 不需要花时间去学习软件就可以独立完成一些定
  • 声音合成与克隆——制作用于训练的声音数据集

    前言 1 PaddleSpeech 是一个简单易用的all in one 的语音工具箱 支持语音处理的相关操作 如语音知别 语音合成 声纹识别 声音分类 语音翻译 语音唤醒等多个方向的应用开发 这里只使用到语音合成与声音克隆 主要由文本前端
  • 计算机网络数据吞吐量,计算机网络的性能指标

    计算机网络的性能一般是指它的几个重要的性能指标 但除了这些重要的性能指标外 还有一些非性能特征 nonperformance characteristics 也对计算机网络的性能有很大的影响 一 计算机网络性能指标 1 速率 比特 bit
  • 每日一问—01如何在指定目录下的文件名前面加上“0”+序号

    import os path C i 1 for filename in os listdir path try new name 0 str i filename os rename os path join path filename
  • 基于opencv下的双目视觉三维重建与重投影残差计算

    一 重投影残差 1 1基本概念 重投影残差 按照字面意思解释就是在第二次重新投影的二维像素点与第一次投影得到的像素点之间的残差 欧式距离 大小 残差的大小反映的就是测量仪器的精度以及外界因素对测量结果的干扰 即测量误差的大小 如下图所示 假
  • HikariCP连接池

    什么是HikariCP HikariCP是由日本程序员开源的一个数据库连接池组件 代码非常轻量 并且速度非常的快 根据官方提供的数据 在i7 开启32个线程32个连接的情况下 进行随机数据库读写操作 HikariCP的速度是现在常用的C3P
  • "[WinError 10061] 由于目标计算机积极拒绝,无法连接"错误解决办法

    爬虫的时候会经常出现 WinError 10061 由于目标计算机积极拒绝 无法连接 错误这种情况 有可能是LAN口设置不正确 我是在爬取全国天气情况的时候出现的这种错误 后面调了以后可以了 1 控制面板 网络和 Internet Inte
  • 蓝桥杯小白必看 —— Python

    蓝桥杯小白必看 Python 文章目录 蓝桥杯小白必看 Python 一 Python比赛规则 二 Python3 8 6的IDLE环境 1 官网下载地址 2 让编译器显示行数 3 设置自动保存 4 设置页面字体大小 5 快捷键的使用 三
  • 操作系统王道考研复习——第二章(进程管理) 上

    操作系统王道考研复习 第二章 进程管理 上 2 进程管理 2 1 程序执行 2 1 1 程序顺序执行的特征 2 1 2 程序并行执行的特征 2 2 进程与线程 2 2 1 进程的概念和特征 1 程序和进程的区别 2 进程的组成 PCB 程序
  • java删除指定路径下的全部内容

    1 使用过程当中有时会用到清空文件夹的操作 首先传入指定文件夹地址 利用递归的方式清空该文件夹下的全部文件 以及子文件夹 public static void deleteFile File file 判断文件不为null或文件目录存在 i
  • 《Unity Shader入门精要》自学笔记(七)第九章 更复杂的光照 ——光照衰减

    帧调试器FrameDebugger 又是一个好玩的小玩具好用的小工具呢 可以通过Window Analysis Frame Debugger打开 然后点击左上角的Enable 就可以查看了 点击1打开或关闭Frame Debugger 滑动