移植代码到64位平台

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com C和C++大量依赖于指针的使用,即包含内存地址的变量。尽管指针类型在概念上与整数类型不同,但其物理地址值 始终是一个整数 。开发人员在C/C ++中大量使用整数类型而不是指针类型,即使在编译器随附的系统头文件中也是如此。在过去的几十年中,大多数计算机处理器都使用32位内存地址,因此开发环境是 围绕地址长度为32位的假设 建立的。C/C++代码中存在着大量 指针和整数之间的隐式和显式转换 。使用指针,或union的重叠内存结构方式(overlapping memory structures),去访问变量,也是司空见惯。 当然,32位架构有其局限性。具体来说,它们将计算机内存限制为4GB。应用程序需求不断增长,迫切需要迁移到更长的地址。经常使用的旧式类型带来了新的含义和价值。最具戏剧性,最明显的的变化,是从32位转向64位指针。 不再适用相同的规则 基本类型的某些大小已更改。其中一些保持不变。但是,突然之间,在C和C++代码库中使用的许多隐式假设不再有效。在32位系统中编写和测试的代码在迁移到64位计算机时不再有效。 幸运的是,已经识别并分类了代码可能易于从32位计算机迁移到64位计算机的大多数区域。一些编译器使用主动检查技术来捕获在迁移期间可能出现的漏洞。静态分析工具的供应商(包括Coverity和Klocwork)可以提供进一步帮助将代码从32位机器平稳迁移到64位机器的机制。尽管这些工具不能直接解决代码迁移问题,但它们提供了便利的可扩展性和API,可以创建与32位到64位迁移相关的自定义检查程序。增强这些工具可以进一步帮助发现并有效解决这些兼容性问题。 本文的目的是帮助您使代码库与体系结构无关,因此可以在32位计算机或64位计算机上构建相同的代码库,并为每台计算机生成可行的代码。此外,如果32位程序通过二进制数据交换(通过文件或套接字)与64位程序进行通信,则有多种方法可以确保二进制结构不受两种体系结构类型之间的迁移的影响。 本文包含详细的分析和建议,以解决与32位到64位迁移有关的众多问题。 为了使您的程序与体系结构无关,有两个目标需要实现。 其中之一是内部一致性,即确保程序中使用的所有类型都是一致的,而不管代码是在32位还是64位计算机上编译的。 让我们看一下两种架构上基本类型的大小(请参见表1)。 此处的显着区别是指针类型和long类型的大小变化。由于大小更改,某些基于隐式依赖关系构建的代码可能无法正确迁移。可能的问题主要与整数与整数之间,或者是整数和指针之间的数据交换有关。 整数大小的差异 在32位系统上,int和long类型都是32位,这意味着程序员可以互换使用这两种类型。此外,C没有严格的输入规则,因此函数中的int参数可以传递long参数而不会出错。尽管这不是一个好的编码实践,但是此代码可能会在数年内完美运行。但是,在64位系统中,在某些编译器中,int和long具有不同的大小,并且代码在迁移后将无法正常工作。将long值分配给int变量可能会导致截断。以下代码在32位系统中可以正常工作,但在64位系统中则极有可能正常工作。 int sum; long val1, val2; sum = val1 + val2; // possible truncation in 64-bit system 以下代码可能会在某些编译器中引起编译器警告,但是此代码(在32位模式下工作)可能将无法在64位模式下工作,因为堆栈上的值大小会发生变化。 int add(int parm1, int parm2); // ..... long val1, val2; long sum = add(val1,val2); // mismatch of parm size on 64-bit machine 可能还会发生其他一些细微的事情,从而影响代码的完整性。例如,编译时函数sizeof()返回类型为size_t的结果,size_t类型的占据的字节大小,则取决于该程序中指针类型变量占据的字节数的大小。将此值分配给整数可能导致被截断。如下代码所示: int mySize = sizeof(MyStructure); // possible size truncation 另一个更细微的错误是位字段的符号扩展。 例如:

解决访问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 原文地址 文档内容总结 1. Shader Derivative Functions 简介 Shader Derivative Functions 是片段着色器中的指令,用于计算任何值相对于屏幕空间坐标的变化率。 在 HLSL 中,这些函数称为 ddx 和 ddy,在 GLSL 中称为 dFdx 和 dFdy。 这些函数在三角形光栅化过程中,通过计算 2x2 像素块中像素值之间的差异来求导数。 2. 导数计算 GPU 在光栅化时,会同时运行多个片段着色器实例,并将它们组织成 2x2 像素块。 dFdx 计算块中左右像素值的差异,dFdy 计算上下像素值的差异。 导数可以用于片段着色器中的任何变量,对于向量和矩阵类型,导数按元素计算。 3. 导数与 Mipmaps Mipmaps 是通过将纹理过滤成更小尺寸的预计算图像序列,用于避免纹理缩小时的锯齿问题。 导数在纹理采样时用于选择最佳的 mipmap 级别,纹理坐标相对于屏幕坐标的变化率越大,选择的 mipmap 级别越高。 4. 面法线计算(Flat Shader) 导数可以用于在片段着色器中计算当前三角形的面法线。 当前片段的世界坐标的水平和垂直导数是位于三角形表面的两个向量,它们的叉积是垂直于表面的向量,其范数为三角形的法线向量。 GLSL 代码示例: normalize(cross(dFdx(pos), dFdy(pos))); 5. 导数与分支 导数计算基于 GPU 硬件上多个着色器实例的并行执行。 在条件分支的情况下,如果核心中的线程没有全部执行相同的分支,则会出现代码执行的分歧,导致导数操作未定义。 为了避免这个问题,着色器编译器可能会展平分支或将纹理读取移到分支控制流之外。 6. 导数块对齐的揭示 通过一个简单的实验揭示了着色器导数的内部块对齐。 实验通过计算步进函数的导数,展示了当步进过渡发生在 2x2 像素块的中间或两个相邻块之间时,导数的不同结果。 7. 参考文献 How a GPU works - Kayvon Fatahalian Computer Graphics: Principles and Practice - Chapter 38.

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 从.