全局光照算法:reflective shadow maps

2023-11-19

1. 技术理解

RSM的全称是reflective shadow maps,受到Instant Radiosity这个离线技术的启发,其思想和ShadowMap的思想近似。在正式介绍和了解这个技术之前,我需要确定RSM用处何在?我想,《RTR4》中对它的分类很正确——Dynamic Diffuse Global Illumination,这是一个处理动态全局漫反射的技术:

  • GI(全局光照):用于二次及以上bounce造成的间接光。
  • Dynamic(动态):可以实时更新,可作用于动态物体。
  • Diffuse(漫反射):更加细致的说,这个技术考虑的是间接光照中的漫反射部分。

RSM和立即辐射度方法一样,都是在直接光照亮的区域,选择采样点作为发光物(虚拟点光源VPL),来计算间接光照。主要分为两个Pass

  1. Pass 1:从光源的角度,对整个场景进行一次渲染。这个过程在引擎中可以直接和ShadowMap的生成放在一块。不过不同的是,除了存储深度之外(这个感觉就是直接使用ShadowMap的结果),我们还需要存储世界空间位置法线辐射通量
  2. Pass 2:在正常的lighting pass中,考虑基于RSM的间接光。

1.1 推导

RSM中,每个像素都被解释为一个间接照亮场景的像素光。通量 ϕ p \phi_p ϕp定义了其亮度

辐射通量 ϕ p \phi_p ϕp:radiant flux,单位是W(瓦特)。描述的是光源的总体能量——每秒的发出的辐射能量。而辐照度E的单位是 W / m 2 W/m^2 W/m2,辐射强度I的单位是 W / s r W/sr W/sr。我们在光照积分中比较常见的是:辐射率L,单位是 W / ( m 2 s r ) W/(m^2sr) W/(m2sr)
注意:当光源的面积无限小时,基本可以将辐射强度I等同于辐射度L

在这里插入图片描述

忽略可见性,我们的光照积分应该时如下形式:
L o ( p , w o ) = ∫ Ω p a c t h L i ( p , w i ) V ( p , w i ) f r 1 ( p , w i , w o ) cos ⁡ θ p d w i = ∫ A p a c t h L i ( p , w i ) f r 1 ( p , w i , w o ) cos ⁡ θ p cos ⁡ θ q ∣ ∣ q − p ∣ ∣ 2 d A L_o(p,w_o)=\int_{\Omega_{pacth}}{L_i(p,w_i)V(p,w_i)f_{r1}(p,w_i,w_o)\cos{\theta_p}dw_i} \\ =\int _{A_{pacth}}L_i(p,w_i)f_{r1}(p,w_i,w_o)\frac{\cos{\theta_p} \cos{\theta_q}}{||q-p||^2} dA \\ Lo(p,wo)=ΩpacthLi(p,wi)V(p,wi)fr1(p,wi,wo)cosθpdwi=ApacthLi(p,wi)fr1(p,wi,wo)qp2cosθpcosθqdA

参考上图,作者假设光源是无限小的,而且 d w = d A cos ⁡ θ q ∣ ∣ x / − x ∣ ∣ 2 dw=\frac{dA\cos{\theta_q}}{||x^/-x||^2} dw=x/x2dAcosθq,我们可以做出如下推导:法线为n表面点p像素光q而产生的辐照度为:
d E ( p ) = L i ( p , w i ) cos ⁡ θ p d w i E ( p ) = ∫ L i cos ⁡ θ p d w i = ∫ A p a t c h L i cos ⁡ θ p cos ⁡ θ q ∣ ∣ q − p ∣ ∣ 2 d A dE(p)=L_i(p,w_i)\cos{\theta_p}dw_i \\ \\ E(p)=\int L_i\cos{\theta_p}dw_i=\int_{A_{patch}}L_i\frac{\cos{\theta_p} \cos{\theta_q}}{||q-p||^2} dA dE(p)=Li(p,wi)cosθpdwiE(p)=Licosθpdwi=ApatchLiqp2cosθpcosθqdA
又因为对于一个diffuse patch来说,所有方向的出射光都是相同的——可以有 L i = f r ⋅ Φ d A L_i=f_r \cdot \frac{\Phi}{dA} Li=frdAΦ(这个公式如何理解?),所以:
E ( p ) = cos ⁡ θ p cos ⁡ θ q ∣ ∣ q − p ∣ ∣ 2 Φ p E(p)=\frac{\cos{\theta_p} \cos{\theta_q}}{||q-p||^2}\Phi_p E(p)=qp2cosθpcosθqΦp

实际上: Φ p = Φ l i g h t ⋅ f r q \Phi_p=\Phi_{light}\cdot f_{r_q} Φp=Φlightfrq。最终推导为:
在这里插入图片描述

争议 ∣ ∣ x − x p ∣ ∣ ||x-x_p|| xxp的上标是4,还是2,有所争议。
参考
在这里插入图片描述

2. Pass 1:Generation

2.1 Data

由果推因,最后的计算公式需要世界空间位置、法线、辐射通量,我们就存储它们。但现在,依然存在一个问题,我们存取的通量怎么获得?

如果说,平行光的通量是 Φ \Phi Φ,那么照明这个像素块之后,出射辐射率是: L o = f r ⋅ Φ d A L_o=f_r\cdot \frac{\Phi}{dA} Lo=frdAΦ。而这个像素块此时的辐射通量是:
Φ p = ∫ A r e a ∫ Ω ( L o ) d A d w o = ∫ Ω ( f r ⋅ Φ ) d w i \Phi_p=\int_{Area}\int_{\Omega}(L_o)dAdw_o=\int_{\Omega}(f_r\cdot \Phi) dw_i Φp=AreaΩ(Lo)dAdwo=Ω(frΦ)dwi
由于这个patch是漫反射的,所以 Φ \Phi Φ f r f_r fr都是常量。而 f r = ρ / π f_r=\rho/\pi fr=ρ/π ∫ ( 1 ) d w i = π \int(1) dw_i=\pi (1)dwi=π,最终:
Φ p = ρ ⋅ Φ \Phi_p=\rho\cdot \Phi Φp=ρΦ

2.2 实现

所以,最终,我们在第一个Pass中,这样做:

代码来自:https://github.com/AngelMonica126/GraphicAlgorithm/blob/master/001_Reflective%20shadow%20map/RSMBuffer_FS.glsl

void main()
{
	vec3 TexelColor = texture(u_DiffuseTexture, v2f_TexCoords).rgb;
	//TexelColor = pow(TexelColor, vec3(2.2f));
	vec3 VPLFlux = u_LightColor * TexelColor;
	Flux_ = VPLFlux;
	Normal_ = v2f_Normal;
	Position_ = v2f_FragPosInViewSpace;
}

3.3 点光源

之前我们考虑的都是平行光,如果是点光源,我们或许应该在这里考虑一下光线衰减余弦问题
Φ p = ρ ⋅ Φ ⋅ d o t ( x L − x p , n p ) / ( ∣ ∣ x L − x p ∣ ∣ 2 ) \Phi_p=\rho\cdot \Phi \cdot dot(x_L-x_p,n_p)/(||x_L-x_p||^2) Φp=ρΦdot(xLxp,np)/(xLxp2)

3 Pass 2:Lighting

3.1 基础实现

主要流程,读取上一个pass存的数据,利用下面的公式,计算间接照明。

float3 indirectIllumination = float3(0, 0, 0);
//最远采样半径
float rMax = rsmRMax;

// rsmSampleCount = hight * width(etc. 512*512)
for (uint i = 0; i < rsmSampleCount; ++i)
{
	// 这里就是随机值
	float2 rnd = rsmSamples[i].xy;
	float2 coords = textureSpacePosition.xy + rMax * rnd;
	// 依次读取位置、法线、通量
	float3 vplPositionWS = g_rsmPositionWsMap.Sample(g_clampedSampler, coords.xy).xyz;
	float3 vplNormalWS = g_rsmNormalWsMap.Sample(g_clampedSampler, coords.xy).xyz;
	float3 flux = g_rsmFluxMap.Sample(g_clampedSampler, coords.xy).xyz;
	// 计算当前像素在此RSM像素灯光的影响下,导致的辐照度E
	float3 result = flux
	* ((max(0, dot(vplNormalWS, P – vplPositionWS))
	* max(0, dot(N, vplPositionWS – P)))
	/ pow(length(P – vplPositionWS), 4));
	indirectIllumination += result;
}
indirectIllumination = result / rsmSampleCount;
return saturate(indirectIllumination * rsmIntensity);

3.2 改进方法

对于一个典型的阴影图来说,像素的数量是很大的( 512 × 512 512\times 512 512×512),所以上述sum计算是非常昂贵的,在实时情况下不实用。相反,作者必须将总和减少到有限的光源数量,例如400个。作者使用重要性驱动的方法来做到这一点,试图将采样集中到相关像素灯上。

一般来说,可以说x阴影图中的像素光 x p x_p xp之间的距离是它们在世界空间中的距离合理近似值。如果相对于光源的深度值差别很大,世界空间的距离就会大得多,会高估其影响。然而,重要的间接光源总是很接近,这些光源在阴影图中也必须是接近的。
所以作者决定按以下方式获得像素光的样本

  • 首先,作者将x投影到阴影图 ( → ( s , t ) ) (→(s,t)) ((s,t))中。

  • 然后,作者选择 ( s , t ) (s,t) (s,t)周围的像素光,样本密度随着与 ( s , t ) (s,t) (s,t)距离的平方而减少。这可以通过选择相对于 ( s , t ) (s,t) (s,t)的极坐标样本轻松实现,也就是说,如果 ξ 1 ξ_1 ξ1 ξ 2 ξ_2 ξ2均匀分布的随机数,作者选择位置:
    在这里插入图片描述

  • 然后,必须通过用 ξ 1 2 ξ^2_1 ξ12对样本进行加权,来补偿不同的采样密度(以及最后的归一化)。下图显示了一个采样模式的例子

  • 在这里插入图片描述
    实际实现过程中,我们在CPU端通过低差异序列,生成随机数 ( ξ 1 , ξ 2 ) (\xi_1,\xi_2) (ξ1,ξ2)st不用管,就是GPU端像素的UV坐标,我们只需要计算: r m a x ξ 1 sin ⁡ ( 2 π ξ 2 ) r_{max}\xi_1\sin{(2\pi\xi_2)} rmaxξ1sin(2πξ2) r m a x ξ 1 cos ⁡ ( 2 π ξ 2 ) r_{max}\xi_1\cos{(2\pi\xi_2)} rmaxξ1cos(2πξ2) ξ 1 2 \xi_1^2 ξ12。将这三个数据存储四维向量数组,作为uniform data传入GPU

此代码非原创,来自:https://github.com/AngelMonica126/GraphicAlgorithm/blob/master/001_Reflective%20shadow%20map/ShadingWithRSMPass.cpp

std::default_random_engine e;
std::uniform_real_distribution<float> u(0, 1);
for (int i = 0; i < m_VPLNum; ++i)
{
	float xi1 = u(e);
	float xi2 = u(e);
	m_VPLsSampleCoordsAndWeights.push_back({ xi1 * sin(2 * ElayGraphics::PI * xi2), xi1 * cos(2 * ElayGraphics::PI * xi2), xi1 * xi1, 0 });
}

genBuffer(GL_UNIFORM_BUFFER, m_VPLsSampleCoordsAndWeights.size() * 4 * sizeof(GL_FLOAT), m_VPLsSampleCoordsAndWeights.data(), GL_STATIC_DRAW, 1);

然后,在GPU端主要加入的就是这个权重

for (int i = 0; i < u_NumSamples; i++)
{
    vec3 offset    = texelFetch(s_Samples, ivec2(i, 0), 0).rgb;
    vec2 tex_coord = light_coord.xy + offset.xy * u_SampleRadius + (((offset.xy * u_SampleRadius) / 2.0) * dither_offset);

    vec3 vpl_pos    = texture(s_RSMWorldPos, tex_coord).rgb;
    vec3 vpl_normal = normalize(texture(s_RSMNormals, tex_coord).rgb);
    vec3 vpl_flux   = texture(s_RSMFlux, tex_coord).rgb;

    vec3 result = light_attenuation(vpl_pos) * vpl_flux * ((max(0.0, dot(vpl_normal, (P - vpl_pos))) * max(0.0, dot(N, (vpl_pos - P)))) / pow(length(P - vpl_pos), 4.0));
	
	// 权重
    result *= offset.z * offset.z;
    indirect += result;
}

3.3 关于最后的结果是否要乘上albedo

鄙人认为,最后得到的 E p E_p Ep,不是当前像素本身产生辐照度(对眼睛生效),而是其他像素灯对此像素产生的辐照度,或者推导上可以看看:

L o ( p , w o ) = ∫ A p a c t h L i ( p , w i ) f r 1 ( p , w i , w o ) cos ⁡ θ p cos ⁡ θ q ∣ ∣ q − p ∣ ∣ 2 d A L_o(p,w_o) =\int _{A_{pacth}}L_i(p,w_i)f_{r1}(p,w_i,w_o)\frac{\cos{\theta_p} \cos{\theta_q}}{||q-p||^2} dA \\ Lo(p,wo)=ApacthLi(p,wi)fr1(p,wi,wo)qp2cosθpcosθqdA

E ( p ) = ∫ L i cos ⁡ θ p d w i = ∫ A p a t c h L i cos ⁡ θ p cos ⁡ θ q ∣ ∣ q − p ∣ ∣ 2 d A E(p)=\int L_i\cos{\theta_p}dw_i=\int_{A_{patch}}L_i\frac{\cos{\theta_p} \cos{\theta_q}}{||q-p||^2} dA E(p)=Licosθpdwi=ApatchLiqp2cosθpcosθqdA

f r f_r fr又和面积没有关系,所以:
L o ( p , w o ) = E ( p ) ∗ f r 1 L_o(p,w_o)=E(p)*f_{r1} Lo(p,wo)=E(p)fr1
也就是说,我认为,最终的间接光照结果,应该是:

indirect = indirect * albedo / PI;
indirect = indirect / VPL_NUM;
light_result = directLight + indirect;

4 其他

ToDo

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

全局光照算法:reflective shadow maps 的相关文章

  • unity 停止调用InvokeRepeating()的方法

    可以使用CancelInvoke 函数来停止InvokeRepeating 的调用 示例如下 声明一个float类型的变量用来存储调用Invokerepeating 的时间间隔 public float repeatTime 2 0f vo
  • HLSL 偏导数 ddx / ddy

    HLSL ddx ddy 在光栅化的时刻 GPUs会在同一时刻并行运行很多Fragment Shader 但是并不是一个pixel一个pixel去执行的 而是将其组织在2x2的一组pixels分块中 去并行执行 偏导数就正好是计算的这一块像
  • Unity --- Vector3类的API讲解

    1 Vector3中的静态变量是相对于世界坐标系的还是相对于自身坐标系呢 我们创建的Vector3类对象同理 答 这取决我们将创建的Vector3类对象 通过Vector3调用的静态变量传给了哪一个引用 如果是传给了positon的话 则该
  • 【unity3D】创建TextMeshPro(TMP)中文字体(解决输入中文乱码问题)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇是unity的TMP中文输入显示乱码的解决方式 创建 TextMeshPro 中文字体 遇到的问题描述 解决方式 Font Asset Creator 面板扩展
  • unity期末作业-插针游戏

    unity期末作业 插针游戏 附下载链接 鼠标控制针的发射 圆盘可以显示接住的针数目 若两根针碰到则界面变红 游戏结束 详细情况如下动态图 点我下载 https download csdn net download weixin 43474
  • Ray Tracing in One Weekend01无法查看ppm的问题及一个C++字符缓冲传参引发的bug

    最近在学习光线追踪的经典教程 lt
  • Unity卡死情况

    今天遇到了Unity点击播放后卡死 用任务管理器强行关闭后重开 打不开项目的情况 解决方案 检查USB接口设备 有些设备可能会影响Unity工程启动 比如VR头盔
  • C#软件开发实例.私人订制自己的屏幕截图工具(一)功能概览

    本实例全部文章目录 一 功能概览 二 创建项目 注册热键 显示截图主窗口 三 托盘图标及菜单的实现 四 基本截图功能实现 五 针对拖拽时闪烁卡顿现象的优化 六 添加配置管理功能 七 添加放大镜的功能 八 添加键盘操作截图的功能 九 使用自定
  • Unity MRTK使用详解(Htc vive+LeapMotion)

    MRTK Unity是一个由Microsoft驱动的开源项目 提供了多种组件和功能 用于加速Unity中的跨平台MR应用程序开发 以下是其一些功能 提供跨平台输入系统和用于空间交互和UI组件 启用快速原型通过在编辑器中的模拟 让你马上看到变
  • Unity项目资源加载管理简易框架(Resource)

    文章目录 一 背景 二 思路概述 三 具体实现代码及其思路梳理 1 资源路径 2 资源管理 3 资源加载 4 资源管理 四 说明 一 背景 在Unity的轻量型项目中如果对优化没有特别搞得要求 如果需要用到Resource Load这个接口
  • 【Unity2d】带你制作一款类似于金山打字的小游戏

    博主大概08年开始接触电脑游戏 当时玩的是我哥的电脑 那时候家里没网 只可以玩电脑上自带的单机游戏 比如扫雷 蜘蛛纸牌等等 当然还有红色警戒 冰封王座 星际争霸 帝国崛起等等 这些大概是我哥当时在大学下载的 也是那个时候对游戏充满了兴趣 记
  • 游戏引擎:打造梦幻游戏世界的秘密武器

    介绍 游戏引擎是游戏开发中不可或缺的工具 它为开发者提供了构建游戏世界所需的各种功能和工具 本文将介绍游戏引擎的概念 使用方法以及一个完整的游戏项目示例 游戏引擎的概念 游戏引擎是一种软件框架 它提供了游戏开发所需的各种功能和工具 包括图形
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜

随机推荐

  • Android智能下拉刷新框架—SmartRefreshLayout的使用

    转载请注明出处 http blog csdn net jarchie520 article details 78193387 上个月因为自己太懒了 加上又发生了一点小事 就没能及时更新博客 下了班回家面壁思过去吧 今天这篇文章主要是介绍一下
  • 帮程序员减压放松的10个良心网站

    同学们工作之余 不妨放下微博跟朋友圈 来这10个网站感受一下看着就醉了的情境 念完往上一推音乐键 我往后一靠 潮乎乎的软皮耳机里头 音乐排山倒海 今天推荐的网站 利用代入感强的图片与音频 迅速帮你抹平焦虑 获得平和心态 特别献需求改千遍的程
  • LeetCode-3. 无重复字符的最长子串 -- Python解

    原题描述 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解释 因为无
  • 2011年中的macmini 系统安装,简直作死

    不想再爱mac了 再不要爱了 完结 这几天真的时间就耗在这系统上了 之前一直用的是win10系统 直接把苹果系统整个的推掉了 由于是真的不知道能直接U盘装10 13版本 索性理所当然的直接一步到位到10 14最新版 所以花了半天时间找镜像d
  • HTML中Form表单的使用

    1 form表单标记 表单标记以
  • 金融圈:Hoping Club华英会将重金注资收购REVA

    近期 金融圈有消息传出 华英会或将注资收购REVA提高其所持有的股份 来获取REVA中国大陆区ArtStreet质押平台的运营权 这一消息受到了很多业内人士的关注 一旦此次收购坐实成功也就意味着华英会将获得 中国大陆REVA质押平台的运营权
  • Mybatis-plusMybatis 通过获取sqlSession执行原生sql(执行程序代码中sql字符串)

    Mybatis plus Mybatis通过获取sqlSession执行原生jdbc执行sql 此处demo只写了执行查询sql 有需要可以执行增删改查都可 与原生jdbc调用方式一样 Component Slf4j public clas
  • 178、锐捷交换机恢复出厂和各种基本配置

    锐捷最详细的基础命令 一 锐捷交换机配置原理 我们来看下锐捷的日常配置命令原理 1 进入特权模式 Ruijie gt enable 进入特权模式 2 查看设备flash当前文件列表 Ruijie dir 查看flash当前文件列表 3 将配
  • faster RCNN 的细节理解

    1 anchors不同的大小但是采用了ROI pooling一样的策略 都映射到3 3的卷积核上 最后通过1 1的卷积核 相当与全连接分成了18类 9个anchors的话 2 分类的时候 reshape 两次 第一次为了softmax分类
  • Go的并发的退出

    有时候我们需要通知goroutine停止它正在干的事情 比如一个正在执行计算的web服务 然而它的客户端已经断开了和服务端的连接 Go语言并没有提供在一个goroutine中终止另一个goroutine的方法 由于这样会导致goroutin
  • #452. 序列操作

    序列操作 题目 Daimayuan Online Judge 问题描述 思路 首先想的是第二次操作的y可以将前面所以操作进行抵消 只需要第二次操作的最大值即可 但是发现 对于第一个操作 它是单点修改 每修改一次对于第二次操作都是有影响的 导
  • 最简单的区块链实现,不到50行代码!(一)

    什么是区块链 Blockchain 一个电子记账本 以比特币和其他密码加密货币进行的交易公开地 按照日期顺序记录其中 总的来说 它是一个公开的数据库 新的数据存储在一个称为区块的容器中 并且附加到一个 不可变 的链条 即区块链 上 链条上还
  • 《基于Python的大数据分析基础及实战》第二章

    第二章 个人信息 kwd info kwd info kwd info ipynb等文件下载 https wwm lanzouf com iklXf023qeef 对数据进行分析首先得对数据进行处理 本章主要介绍P thon在数据处理方面的
  • 5.2 主机扫描:主机探测

    目录 一 预备知识 主机扫描方法 二 实验环境 三 实验步骤 一 预备知识 主机扫描方法 主机扫描 Host Scan 是指通过对目标网络 一般为一个或多个IP网段 中主机IP地址的扫描 以确定目标网络中有哪些主机处于运行状态 主机扫描的实
  • Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

    1 打开新立得包管理器 搜索JDK 选择openjdk 6 jdk安装 2 打开Ubuntu软件中心 搜索Eclipse 选择Eclipse集成开发环境 安装 3 打开Eclipse File gt New gt Java Project
  • 剑指Offer 22. 链表中倒数第k个节点(Easy)/ 19. 删除链表的倒数第 N 个结点(Medium)/ ListNode调用!!!

    LeetCode 19 删除链表的倒数第 N 个结点 Medium 题目链接 题解 链表中倒数第 k 个节点 双指针 清晰图解 思路 代码 Definition for singly linked list class ListNode d
  • Unity 音频卡顿 静帧 等待等问题的解决方案

    是否遇到过在Unity中加载音频文件卡顿 也就是画面卡住 的现象 特别是加载外部音频文件时 虽然时间很短 但这终归不是什么好现象 尤其是打游戏的话 影响很大 但是一些有牌面的Boss也不能不配音乐 当然也可以通过其它方式解决 比如特定条件统
  • 《人工智能导论》 第7章 机器学习

    机器学习 机器学习的基本概念 机器学习 Machine learning 使计算机能模拟人的学习行为 自动地通过学习来获取知识和技能 不断改善性能 实现自我完善 机器学习主要研究以下三个问题 学习机理 人类获取知识 技能和抽象概念的天赋能力
  • win7安装PS2019CC启动时报d3dcompiler_47.dll的问题解决

    原先安装的PS2017太卡顿了 有些功能用的也不习惯 卸载准备重装一下PS2019 在安装时发现报错 具体如下图所示 因此在网上下载了D3DCOMPILER 47 dll程序 放到了指定文件夹还是不行 百度参考这个解决了 WIN7缺少D3D
  • 全局光照算法:reflective shadow maps

    1 技术理解 RSM的全称是reflective shadow maps 受到Instant Radiosity这个离线技术的启发 其思想和ShadowMap的思想近似 在正式介绍和了解这个技术之前 我需要确定RSM用处何在 我想 RTR4