静态变量在 main 函数前执行初始化 on_exit 注册的函数在 main 执行后再执行 void f(int state, void* msg){ cout << "after main exit.\n"; cout << "state: " << state << "\tmessage: " << (char*)msg << endl; } int main() { cout << "Hello World\n"; on_exit(f, (char*)"this is message"); cout << "end of main.\n"; return 0; } 输出:
Hello World end of main. after main exit. state: 0 message: this is message
一、概念 计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着 1 个字节(8 bit)
有些类型的长度是超过 1 个字节的,比如 C/C++ 中,short 类型一般是 2 个字节,int 类型一般 4 个字节等。因此这里就存在如何安排多字节数据中,各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。
大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中(高低低高) 小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中(高高低低) 假如有一个 4 字节的数据为 0x12345678(十进制:305419896,0x12 为高字节,0x78 为低字节),若将其存放于地址 0x4000 8000 中,则有:
内存地址 0x4000 8000(低地址) 0x4000 8001 0x4000 8002 0x4000 8003(高地址) 大端模式 0x12 0x34 0x56 0x78 小端模式 0x78 0x56 0x34 0x12 现状:...
alignof( type-id ) 查询类型的对齐要求,以字节为单位
struct Storage { char a; int b; double c; long long d; }; // struct alignas(alignof(long double)) AlignasStorage { // struct alignas(long double) AlignasStorage { struct alignas(std::max_align_t) AlignasStorage { // max_align_t 相当于 alignof(long double) 内存对齐为 16 字节 // 这三种写法都可以 char a; int b; double c; long long d; }; struct Empty {}; struct alignas(64) Empty64 {}; int main() { std::cout << alignof(Storage) << std::endl; // 8 std::cout << sizeof(Storage) << std::endl; // 24 内存对齐为 8 字节,所以大小为 8 的整数倍 std::cout << alignof(AlignasStorage) << std::endl; // 16 std::cout << sizeof(AlignasStorage) << std::endl; // 32 内存对齐为 16 字节,所以大小为 16 的整数倍 int a = 10; int &b = a; std::cout << alignof(b) << std::endl; // 4 引用类型返回引用类型的对齐要求 int x[10]; std::cout << alignof(x) << std::endl; // 4 数组类型返回元素类型的对齐要求 std::cout << "Alignment of" "\n" "- char : " << alignof(char) << "\n" // 1 "- pointer : " << alignof(int*) << "\n" // 8 "- int : " << alignof(int) << "\n" // 4 "- long long : " << alignof(long long) << "\n" // 8 "- empty class : " << alignof(Empty) << "\n" // 1 "- alignas(64) Empty: " << alignof(Empty64) << "\n"; // 64 return 0; }
Cesium for Unreal 插件的材质被设计成模块化的,所以可以被很容易地添加和删除。
目标 浏览和理解现有的 Cesium for Unreal 3D Tileset 的材质 基于包含在 Cesium for Unreal 插件内的材质实例文件创建自定义材质 修改 tileset 的材质 了解 tileset mesh 的材质限制 Material Instances Cesium for Unreal 通过使用 Material Instances 实现最大的灵活度,每个材质实例通过使用更多的材质图层来应用图像叠加,水,或其他材质效果。
![MaterialInstances](./img/MaterialInstances.jpg)
图层资产:包含将显示在给定层上的材质图层节点 混合资产:包含一个节点,该节点确定该材质图层将如何与下面的图层混合 每个材质图层和材质图层混合都可以像其他材质对象一样在材质编辑器中编辑 创建应用到整个 tileset 的材质 在插件目录找到 MI_CesiumThreeOverlaysAndClipping 材质实例文件,并把它拷贝到项目的内容文件夹中,将其改名为 MI_GroundTint。
在【内容】面板右击,创建一个【材质图层】资产,并将其命名为 ML_GroundTint。
双击 ML_GroundTint,打开材质编辑窗口,点击【SetMaterialAttributes】节点,在【细节】面板中的【属性设置类型】数组中添加两个元素,第一个元素设置为默认值【BaseColor】,第二个元素设置为【Opacity】。
添加一个【Constant3Vector】节点,并右击节点,将其【转换为参数】,并命名为 Color。
添加一个【Constant】节点,,将其【转换为参数】,并命名为 Opacity。
右击 Color 节点,在【细节】面板设置默认颜色,比如红色,设置 Opacity 的默认值为 0....
使用 CesiumCartographicPolygon actor,可以定义一个 tileset 的隐藏区域,或应用其他材质效果。CesiumCartographicPolygon 可以通过 Cesium PolygonRasterOverlay 组件添加到一个或多个 tilesets。
在这里,一个 CesiumCartographicPolygon 被用来隐藏 Cesium World Terrain 和 Cesium OSM Buildings,它们与 Aerometrex Denver Photogrammetry 重叠。
注意:虽然 CesiumCartographicPolygon 有助于基于材质的改变,如 clipping,但它们不影响物理。你仍然可以与 tileset 的隐藏部分发生碰撞。
第一步:添加 CesiumCartographicPolygon actor 可以修改多边形的节点(增加、删除、拖拽节点),修改线的颜色,以及地理位置
第二步:将 CesiumCartographicPolygon 连接到 tileset 数据 选择要将 CesiumCartographicPolygon 应用到的 tileset,比如 Cesium World Terrain,添加组件 CesiumPolygonRasterOverlay
关连 CesiumCartographicPolygon
可以手动刷新 tileset (Refresh Tileset)观看效果
Exclude Tiles Inside: 是专为 clipping 使用。如果这个设置被启用,任何完全位于多边形内部的 tiles 都不会被加载,这可以提高性能。如果你使用这个多边形不是为了 clipping,要禁用这个设置。否则,多边形内的 tiles 将不会被渲染。 Material Layer Key: 将多边形与特定部分的 tileset 的材质连接起来。如果你把这个键换成别的东西,它不会起作用,直到你创建一个使用新键的材质,并将该材质应用到 tileset。