Posts

解决访问GitHub的Failed to connect to github.com port 443: Operation timed out问题

当碰到以下问题时: 突然电脑无法访问github了。 用科学上网却可以访问到GitHub 科学上网中,使用git时,却出现了以下的问题:Failed to connect to github.com port 443: Operation timed out 不要着急,解决方案如下: 第1步, 打开https://github.com.ipaddress.com/。记录下 Domain Summary下的IP Address,例如是140.82.113.4 第2步, 打开https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfo。记录下 Hostname Summary下的IP Address,例如是199.232.69.194 第3步,打开https://github.com.ipaddress.com/assets-cdn.github.com。记录下FAQ下的IP,通常是四个,例如 186.185.199.108.153 185.199.109.153 185.199.110.153 185.199.111.153 第4步。打开电脑的hosts文件,把下列的地址写在最后,然后保存即可。 140.82.113.4 github.com 199.232.69.194 github.global.ssl.fastly.net 185.199.108.153 assets-cdn.github.com 185.199.109.153 assets-cdn.github.com 185.199.110.153 assets-cdn.github.com 185.199.111.153 assets-cdn.github.com 参考网页 GitHub无法访问、443 Operation timed out的解决办法

《光线跟踪算法技术》代码4.1解释

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 首先上代码: void World::render_scene(void) const { RGBColor pixel_color; Ray ray; float zw = 100.0; int n = (int)sqrt((float)vp.num_samples); Point2D pp; // sample point on a pixel open_window(vp.hres,vp.vres); ray.d = Vector3D(0,0,-1); for (int r = 0; r < vp.vres; r++) // up for (int c = 0; c < vp.hres; c++) { // across pixel_color = black; for (int p = 0; p < n; p++) // up pixel for (int q = 0; q < n; q++) { // across pixel pp.

An Introduction to shader derivative functions(翻译)

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址 Partial difference derivative functions (ddx and ddy in HLSL[a], dFdx and dFdy in GLSL[b]) (in the rest of this article I will use both terms according to the code examples I will provide) are fragment shader instructions wich can be used to compute the rate of variation of any value with respect to the screen-space coordinates. 偏导数函数(在HLSL中为ddx和ddy,GLSL中为dFdx和dFdy)。在本文的其余部分中,我将根据我将提供的代码示例使用这两个术语)都是可以使用的片元着色器指令,可用于计算任何数值相对于 屏幕空间坐标 的变化率。 Derivatives computation During triangles rasterization, GPUs run many instances of a fragment shader at a time organizing them in blocks of 2×2 pixels.

Unity3D Shader的内建multi_compile开关所涵盖的多样体

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com multi_compile_fwdbase 在Unity3D 2018.4.18f1版本下实测到,如果不做其他特别的指定,一个multi_compile_fwdbase编译指令,包含了以下 9 个内建的keyword: DIRECTIONAL DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON LIGHTMAP_ON LIGHTMAP_SHADOW_MIXING LIGHTPROBE_SH SHADOWS_SCREEN SHADOWS_SHADOWMASK VERTEXLIGHT_ON 如果不做特别的指定的话,默认地启用了其中的 4 个内建keyword,分别是:DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN VERTEXLIGHT_ON组成了 8 个多样体,如下: 多样体(变体) DIRECTIONAL DIRECTIONAL LIGHTPROBE_SH DIRECTIONAL SHADOWS_SCREEN DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN DIRECTIONAL VERTEXLIGHT_ON DIRECTIONAL LIGHTPROBE_SH VERTEXLIGHT_ON DIRECTIONAL SHADOWS_SCREEN VERTEXLIGHT_ON DIRECTIONAL LIGHTPROBE_SH SHADOWS_SCREEN VERTEXLIGHT_ON multi_compile_fwdadd 在Unity3D 2018.4.18f1版本下实测到,如果不做其他特别的指定,一个multi_compile_fwdadd编译指令,包含了以下 5 个内建的keyword: DIRECTIONAL DIRECTIONAL_COOKIE POINT POINT_COOKIE SPOT 如果不做特别的指定的话,默认地启用了全部的 5 个内建keyword,组成了 8 个多样体,如下: keyword组成的多样体(变体) DIRECTIONAL DIRECTIONAL_COOKIE POINT POINT_COOKIE SPOT multi_compile_fwdadd_fullshadows 在Unity3D 2018.4.18f1版本下实测到,如果不做其他特别的指定,一个multi_compile_fwdadd_fullshadows编译指令,包含了以下 5 个内建的keyword:

C++的右值和移动构造函数的测试程序说明

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 本文用以测试C++的右值,移动构造函数,以及标准库容器的emplace和push操作的区别。 测试环境是Visual C++ 14.0.25431.01 Update 3版本,未启用任何编译优化操作 代码可以在github中获取。 #include <cstring> #include <cstdlib> #include <map> #include <vector> #include <cstdio> class DemoClassA { public: DemoClassA() :num_(0), name_(nullptr) { std::printf("DemoClassA::DemoClassA()\n"); } ~DemoClassA() { if (name_) { std::printf("DemoClassA::~DemoClassA(%d,%s)\n", num_, name_); delete[] name_; name_ = nullptr; } else { std::printf("DemoClassA::~DemoClassA()\n"); } } DemoClassA(int num, const char* name) { num_ = num; auto len = std::strlen(name) + 1; name_ = new char[len]; memset(name_, 0, len); std::strcpy(name_, name); std::printf("DemoClassA::DemoClassA(%d,%s)\n", num_, name_); } DemoClassA(const DemoClassA& rhs) { num_ = rhs.

The Universal Additional Camera Data component

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com URP版本:8.2.0 源参考网页 通用附加相机数据组件(Universal Addtional Camera Data Component) 是通用渲染管线(URP)用于内部数据存储的组件。通用附加相机数据组件使URP可以扩展和覆盖Unity标准相机组件的功能和外观。 在URP中,具有Camera组件的GameObject还必须具有通用附加摄影机数据组件。如果您的项目使用URP,则在创建Camera GameObject时,Unity会自动添加通用附加相机数据组件。您不能从带有Camera组件的game object中删除通用附加相机数据组件。 如果您使用脚本来控制和自定义URP,则可以通过以下脚本访问摄像机的通用附加摄像机数据组件: var cameraData = camera.GetUniversalAdditionalCameraData(); 有关更多信息,请参见UniversalAdditionalCameraData API文档。如果需要通过脚本频繁访问通用附加摄像机数据组件,则应缓存对其的引用,以避免不必要的CPU工作。

Universal Render Pipeline

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 1 URP的常见问题回答 URP和HDRP(High Definition Render Pipeline)不能混用。 可以从内建render pipeline转到URP。可以用升级器(upgrade)升级内建shader到URP shader。如果自定义的shader的话,需要手动去upgrade。 不能在运行期换pipeline asset。 URP和HDRP之间不能换用。 通过Package Manager获取URP的package 在URP Asset的【Player Setting】界面上可以找到Dynamic Batching的checkbox 选中材质球时,在Inspector面板中,找到Render Face选项,选择Both选项,即可开启Double Sided Global Illumination。 URP适用于各种平台,包括PC和mobile 在Built-in RP和URP功能对照表中,标识为Not Supported的功能,表示没有且不会在后续版本中实现。 如果在build URP工程时很慢,检查以下shader stripping是否设置对,要strip掉可以strip掉的shader。 缺省地,URP是在linear space中工作,可以在Player Setting中将其设置为在gamma space中工作。 通过创建ScriptableRendererFeature脚本,使用scriptable render pass可以扩展URP的功能。 2 URP Asset URP版本:8.2.0 源网页 要使用URP asset,需要创建一个URP asset,并在【Graphic settings】界面将其赋值使用。URP asset控制图形渲染的功能,设置图形渲染的质量等级。URP asset本身是一个scriptable object。它继承自RenderPipelineAsset类。在一个工程中可以使用多个URP asset,并且可以在它们之间切换使用,比如有个URP asset是启用了阴影,另一个URP asset关闭了阴影。 URP有以下几大类的控制选项,如下: General Quality Lighting Shadows Post-processing Advanced 下面的图显示了这几个控制选项的UI: 2.1 General 这是一些用于控制管道渲染框架的核心部分常规设置 属性名 描述 对应的编辑器变量名称 Depth Texture 当在一个摄像机对象的inspector界面上启用此项时,URP将会在shader中创建一个深度纹理_CameraDepthTexture。缺省地URP将把这个深度纹理交给你场景中的所有的摄像机去使用之。 m_RequireDepthTextureProp Opaque Texture 当在一个摄像机对象的inspector界面上启用此项时,URP将会在shader中创建一个不透明的深度纹理_CameraOpaqueTexture。缺省地,URP将这个深度纹理交给你场景中的所有的摄像机使用。这个深度纹理起的作用,就很类似于built-in render pipeline中的GrabPass。在URP渲染任意的透明状网格(transparent mesh)时,该纹理将会提供一个当前场景的一个快照(snapshot) m_RequireOpaqueTextureProp Opaque Downsampling 设置Opaque Texture属性的降采样方式,有None(不采样)、2倍线性过滤(2x Bilinear),、4倍线性过滤(4x Bilinear),、4倍盒状过滤(4x Bilinear),其中4倍盒状过滤产生一种轻柔羽化的效果 m_OpaqueDownsamplingProp Terrain Holes 禁用此项的话,在build包的时候,URP将会移出所有的Terrain hole shader变体,将会减少build包的时间 – 2.

Unity的multi_compile和shader_feature编译指示符、shader variant和asset bundle

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com multi_compile编译指示符 multi_compile编译指示符的文档在这里。假如有以下的shader示例语句: #pragma multi_compile _USE_SEMITRANSPARENT _USE_OPAQUE #pragma multi_compile _MULTI_RED _MULTI_GREEN _MULTI_BLU ... fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); #if _MULTI_RED col = col * fixed4(1,0,0,1); #elif _MULTI_GREEN col = col * fixed4(0,1,0,1); #elif _MULTI_BLUE col = col * fixed4(0,0,1,1); #endif #if _USE_SEMITRANSPARENT col.a = 0.5; #elif _USE_OPAQUE col.a = 1.0; #endif return col; } 那么根据排列组合,就会有 $ 2 \times 3 = 6 $ 种代码段的组合,即分别是 _USE_SEMITRANSPARENT与_MULTI_RED , _USE_SEMITRANSPARENT与_MULTI_GREEN , _USE_SEMITRANSPARENT与_MULTI_BLUE , _USE_OPAQUE与_MULTI_RED , _USE_OPAQUE与_MULTI_GREEN , _USE_OPAQUE与_MULTI_BLUE。总得来说,就是各种排列组合对应编译生成的变体, $\color{#FF0000}{无论有没有被使用上,都会被编译打包到游戏包或者资源包中}$ 。所以 在运行时 ,可以使用 Material.

Unity3D的Model Import Settings window - Model tab

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 1 Model tab 当选中模型文件时,Inspector窗口就会显现出Import Settings窗口,且定位到Model页。可以通过在此页中调整参数控制模型导入的细节。 Model页上的各种属性可以分为三个区,分别是: 分区 细节 (A) Scene 和关卡场景相关的,比如光源和摄像机的导入,还有scale factor的设置 (B) Meshes. 和网格导入相关的属性 (C) Geometry 和网格拓扑相关的户型,比如的顶点的纹理UV,法线等等 2 Scene分区的属性描述表格 属性 功能 Scale Factor 在导入的原始模型文件的比例值,不适合项目中的预期比例时,设置此值,可作为一个全局的对原始模型的缩放比例值。 Unity的物理系统,期望游戏世界中的1米,就对应于原始模型文件的1个单位。 Convert Units 启用此选项,可将导入的原始模型文件的比例值。转换为Unity的比例。导入BlendShapes时,启用此属性可允许Unity导入网格物体的混合形状。 Import BlendShapes Enable this property to allow Unity to import blend shapes with your Mesh. See Importing blend shapes below for details.Note: Importing blend shape normals requires smoothing groups in the FBX file Import Visibility 导入FBX设置,这些设置将会确定是否启用MeshRenderer组件,当启用时改mesh可见 Import Cameras 从.FBX文件中导入在这些文件中定义的camera Import Lights 从.

Update、FixedUpdate、LateUpdate函数,定时器和帧速率

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 1 Update、LateUpdate、FixedUpdate函数 Unity将每帧调用一次 Update() 函数。这意味着,如果你以60fps的速度运行,那意味着每秒调用60次 Update() 函数。如果以50fps的速度运行,则每秒调用50次Update函数。这也就是说。每两次执行update函数之间的时间间隔,其实是变化不定的。正是由于这一点,使用 Update() 函数的最大问题是它可能与物理引擎不同步。调用行为可以改变,因为它可以结束更快或更慢,这取决于您的图形在渲染的硬件上放置了多少负载,使用物理更新可能会导致完全错误的反应。 Unity确实会尝试以项目所指定的速率调用FixedUpdate()函数。但是,这些调用也需要根据当前实际的帧速率去确定。这意味着虽然任何给定帧上可能有零次,一次甚至超过100次对FixedUpdate()函数的调用,但Unity会动态调整到实际帧速率。通过深入挖掘,我们逐渐意识到,这也意味着对FixedUpdate()的所有调用都不一定在指定的时间间隔内。下面举例说明下这种情况: 默认情况下 FixedUpdate() 函数的更新频率是50FPS(0.02s),如果当游戏的更新频率为60FPS时,那么FixedUpdate有固定的更新速率是很好理解的,因为这种绝对可以保证到,每执行一次 FixedUpdate() 函数,就至少执行了一帧,但是如果游戏本身的更新频率就很低,例如为30FPS时,每一帧的时间间隔明显大于0.02秒的,那么这时候在每两次 Update() 函数的调用之间。 FixedUpdate() 函数就被调用了多次。 通常 FixedUpdate() 函数比 Update() 函数更频繁地被调用。 FixedUpdate() 函数可以在一帧内被调用多次,如果帧速率很低,则根本不能在帧之间调用。 如果帧速率很高,也可能不会调用 FixedUpdate() 。 在 FixedUpdate() 函数被调用之后立即进行所有物理计算和更新。 作用力,扭矩或其他与物理相关的函数时,应使用FixedUpdate函数。 FixedUpdate() 函数由一个准确可信的计时器调用,而与实际的帧速率无关,因此在 FixedUpdate() 中应用移动计算时,您不需要将您的值乘以Time.deltaTime。 Update() 函数是每一帧中执行更新操作的主要(入口)函数。 Update() 函数中用来移动非物理系统驱动的物体。 Update() 函数用来接受用户输入。 Update() 函数可用来实现简单的计时器。 由于 Update() 的执行方式,与物理引擎的执行步调不同,即可能在一帧中, FixedUpdate() 函数执行了多次,而Update函数则只执行了一次。这取决于渲染器在渲染图形时的负载量,以及所耗费的CPU时间。如果在 Update() 函数中执行物理运算时,会导致未知的结果。同时也可以看到: 函数的执行间隔,未必就是TimeManager界面中Fixed TimeStep项中所指定的值。 LateUpdate() 函数每帧会被调用一次,在 Update() 函数结束后调用 所有在 Update() 函数中执行的计算,将会在 LateUpdate() 函数调用之前完成执行。 如果实现一个跟随式的第三视角摄像机,则摄像机的状态更新放在 LateUpdate() 函数中执行是一个通用的做法。 因为你的角色是在 Update() 函数里面执行移动和转向的操作。所以在 LateUpdate() 函数执行摄像机的位置和旋转度计算,可以确保在计算时,角色已经全部完成了位置计算,摄像机可以正确地跟踪到角色的正确位置。