Camera.culling mask
2015-11-26 09:22
204 查看
1.关于Camera.cullingMask:This is used to render parts of the scene selectively.,先码下专业翻译:有选择性的渲染部分场景。即通过勾选不同的层,来选择渲染
2.代码中cullingMask为一个Int类型的值,32位,怎么在代码中改变它的值,达到控制相机选择渲染的效果。
3.开始网上搜索了下,都是粗略的解释,如:开启第一层,cullingMask = 1<<2。
4.解释下:1<<index,1的二进制是00000000 00000001,1<<index就是左移index位,如1<<2,就是00000000 00000100
5.下面开始详细说cullingMask,当相机什么都不渲染时,cullingMask等于0,即32个0,当相机渲染everything时,cullingMask为-1,即32个1;
官方文档对CullingMask的注释只是说了通过位移运算符,可以添加选中层。 假设要摄像机只显示第10层,11层,12层。写成:
camera.cullingMask = 1<<10 + 1<<11 + 1<<12; +号可能有点问题或者写成 Camera.main.cullingMask = (1 << 0) | (1 << 9);
但是为什么要这样觉得很奇怪。于是研究了一下。
通过print发现,随便一个层,它前面所有层的和,不会大于它自身的值。 这样的话,可以只用一个int变量保存多个类似布尔型的数据,节省内存。
然后我写了一个读取CullingMask值的函数。智商拙技。如果用二进制去做更快 传入值是CullingMask的值,输出的int数组是同时选中了哪几个层。
最近又发现2个LayerMask的”隐藏方法“,帮助文档里应该没有: public static extern string LayerToName (int layer); public static extern int NameToLayer (string layerName); 可以在层名和层序号之间互相转换,都是静态方法直接用类名调用。
当cullingMask为Nothing时,值是0。 当cullingMask设置为everything时,值是-1。这时如果有层要关闭,就减去这个层的值。 比如第8层的值是 256。那关闭第8层后的值是 -257[-1-(1<<9)]因为设置everything时的数值比较特别,和算法没关系。所以代码我就不做修改了。如果要使用负数可以自己转换一下。
2.代码中cullingMask为一个Int类型的值,32位,怎么在代码中改变它的值,达到控制相机选择渲染的效果。
3.开始网上搜索了下,都是粗略的解释,如:开启第一层,cullingMask = 1<<2。
4.解释下:1<<index,1的二进制是00000000 00000001,1<<index就是左移index位,如1<<2,就是00000000 00000100
5.下面开始详细说cullingMask,当相机什么都不渲染时,cullingMask等于0,即32个0,当相机渲染everything时,cullingMask为-1,即32个1;
官方文档对CullingMask的注释只是说了通过位移运算符,可以添加选中层。 假设要摄像机只显示第10层,11层,12层。写成:
camera.cullingMask = 1<<10 + 1<<11 + 1<<12; +号可能有点问题或者写成 Camera.main.cullingMask = (1 << 0) | (1 << 9);
但是为什么要这样觉得很奇怪。于是研究了一下。
通过print发现,随便一个层,它前面所有层的和,不会大于它自身的值。 这样的话,可以只用一个int变量保存多个类似布尔型的数据,节省内存。
然后我写了一个读取CullingMask值的函数。智商拙技。如果用二进制去做更快 传入值是CullingMask的值,输出的int数组是同时选中了哪几个层。
最近又发现2个LayerMask的”隐藏方法“,帮助文档里应该没有: public static extern string LayerToName (int layer); public static extern int NameToLayer (string layerName); 可以在层名和层序号之间互相转换,都是静态方法直接用类名调用。
当cullingMask为Nothing时,值是0。 当cullingMask设置为everything时,值是-1。这时如果有层要关闭,就减去这个层的值。 比如第8层的值是 256。那关闭第8层后的值是 -257[-1-(1<<9)]因为设置everything时的数值比较特别,和算法没关系。所以代码我就不做修改了。如果要使用负数可以自己转换一下。
public int[] calcMask(int val) { int[] result = null; int flag1 = 0; int flag2 = 0; List<int> tmpLayers = new List<int>(); List<int> resultLayers = new List<int>(); for(int i=1; i<=val; i*=2) { tmpLayers.Add(i); }//把val和首个层之间的层添加入数组.数组元素从小到大顺序 tmpLayers.Add(tmpLayers[tmpLayers.Count-1]*2); //使用递归计算选中的层 recursiveCalcMask(val, tmpLayers, ref resultLayers); for(int i=0; i< resultLayers.Count; i++) { resultLayers[i] = (int)Mathf.Log(resultLayers[i], 2); //用Mathf.Log以2为底数。去求图层编号。 } result = new int[resultLayers.Count]; resultLayers.CopyTo(result); return result; } public void recursiveCalcMask(int val, List<int> arr, ref List<int> outArr) { for(int i= 0; i<arr.Count; i++) { if(arr[i] == val) { outArr.Add(val); break; } else if(arr[i] < val && arr[i+1] > val) { recursiveCalcMask(val - arr[i], arr, ref outArr); outArr.Add(arr[i]); } } }
相关文章推荐
- 浅谈C++中的Const
- iOS-Core-Animation-Advanced-Techniques
- 【读书笔记】iOS-iCloud编程
- Bootstrap中的面板
- 【读书笔记】iOS-iCloud编程
- Apache Commons 工具类介绍及简单使用
- BLE睡眠分析(一)
- LeetCode OJ 系列之122 Best Time to Buy and Sell Stock II --Python
- OC_protocol协议介绍(1)
- 普通排序--冒泡排序
- 站长留言
- Beta版本冲刺计划及安排
- Bootstrap历练实例:分页状态
- Bootstrap历练实例:分页的大小
- css布局你该了解的
- Windows Server 2008 部署webservice(C# .Net)
- x86、ARM和MIPS三种主流芯片架构
- iOS开发笔记-UITableView的单选
- Oracle数据文件/控制文件/日志文件
- ping通网关 ping不能外网 DNS无法解析