抽了个空整理下投影器

一般投影器需要两张贴图,一张Cookie,一张FallOff。

Unity提供Light和Multiple两种自带shader,和粒子类似。

Cookie需要非alpha贴图,FallOff用带Alpha的贴图

当不使用FallOff贴图时会有侧背面穿透的问题,不管是正交还是透视投影器(Cookie边缘干净时也会)

实际上使用FallOff贴图也不能解决,但可以避免大部分情况

FallOff贴图,从左往右对应+Z至-Z范围

另外写了一个快速生成FallOff渐变贴图的工具脚本

点击创建后,会自动在Assets目录下生成一张名为Gradient的临时贴图

丢Editor目录下即可使用

  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Collections;
  6.  
  7. public class GradientCreator : EditorWindow
  8. {
  9. public enum OrderModeEnum { H, V };
  10.  
  11. Color mBeginColor = new Color(, , , );
  12. Color mEndColor = new Color(, , , );
  13. float mOffset = 1f;
  14. int mExpectWidth = ;
  15. int mExpectHeight = ;
  16. bool mIsHardEdge = true;
  17. bool mIsInvert = false;
  18. OrderModeEnum mOrderMode;
  19.  
  20. [MenuItem("Hont Tools/Gradient Creator")]
  21. public static void Setup()
  22. {
  23. GetWindow<GradientCreator>();
  24. }
  25.  
  26. void OnGUI()
  27. {
  28. mBeginColor = EditorGUILayout.ColorField("Begin Color", mBeginColor);
  29. mEndColor = EditorGUILayout.ColorField("End Color", mEndColor);
  30. mOffset = EditorGUILayout.Slider("Offset", mOffset, -, );
  31. mIsInvert = EditorGUILayout.Toggle("Invert", mIsInvert);
  32. mExpectWidth = EditorGUILayout.IntField("Expect Width", mExpectWidth);
  33. mExpectHeight = EditorGUILayout.IntField("Expect Height", mExpectHeight);
  34. mIsHardEdge = EditorGUILayout.Toggle("Hard Edge", mIsHardEdge);
  35.  
  36. mOrderMode = (OrderModeEnum)EditorGUILayout.EnumPopup("Order Mode", mOrderMode);
  37.  
  38. if (GUILayout.Button("Create!"))
  39. {
  40. var mainTexture = new Texture2D(mExpectWidth, mExpectHeight);
  41.  
  42. if (mOrderMode == OrderModeEnum.V)
  43. {
  44. for (int x = ; x < mainTexture.width; x++)
  45. {
  46. for (int y = ; y < mainTexture.height; y++)
  47. {
  48. var g = GetG(y, mainTexture.height);
  49. var currentColor = Color.Lerp(mBeginColor, mEndColor, g);
  50. mainTexture.SetPixel(x, y, currentColor);
  51. }
  52. }
  53. }
  54. else
  55. {
  56. for (int y = ; y < mainTexture.height; y++)
  57. {
  58. for (int x = ; x < mainTexture.width; x++)
  59. {
  60. var g = GetG(x, mainTexture.width);
  61. var currentColor = Color.Lerp(mBeginColor, mEndColor, g);
  62. mainTexture.SetPixel(x, y, currentColor);
  63. }
  64. }
  65. }
  66.  
  67. mainTexture.Apply();
  68.  
  69. var outputFile = System.IO.Directory.GetCurrentDirectory() + "/Assets/Gradient.png";
  70.  
  71. if (File.Exists(outputFile))
  72. File.Delete(outputFile);
  73.  
  74. var bytes = mainTexture.EncodeToPNG();
  75. File.WriteAllBytes(outputFile, bytes);
  76. AssetDatabase.Refresh();
  77. }
  78. }
  79.  
  80. float GetG(float current, float max)
  81. {
  82. var g = Mathf.Clamp01((current / max) + mOffset);
  83. g = mIsHardEdge ? g < ? 0f : 1f : g;
  84. g = mIsInvert ? - g : g;
  85. return g;
  86. }
  87. }

Gradient Creator

关于投影器的实现,我觉得如下:

1.Unity先把投影器影响到的物体剔除出来,然后再对他们进行再次绘制,并且这个绘制是在绘制透明物体的管线阶段下进行的。

2.通过'投影纹理映射'的方法,似乎是tex2Dproj。最终得到映射的UV坐标。进行绘制

需要注意,如果影响到的物体越多,dc也就越高,因为都要多绘制一次

Unity投影器细节整理的更多相关文章

  1. ffmpeg细节整理记录

    ffmpeg细节整理记录 1.-vcodec.-code:v.-c:v ffmpeg的官方文档 -vcodec 是 -code:v 别名. -vcodec codec (output) Set the ...

  2. Unity自学路线整理(参看微信公众号Unity墙外的世界的文章 )

    目前还是个新手. 发现自己有时候还是会一脸蒙...的对着电脑屏幕不知所措,为了利用好在大学零散的时间所以整理一下学习unity的路线. 计划好才能更好的利用时间. 1. 先学好C#再去看引擎,我看的是 ...

  3. Unity 捏脸整理及基于骨骼的捏脸功能实现

    目前实现捏脸功能的方式主要有两种.一个是Blendshape(融合变形),一个是基于骨骼驱动的方式,通过修改骨骼矩阵(bindpose)来影响SkinMesh.这两种方式的最终原理都是在shader ...

  4. 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。

    近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"?       解决方式:手 ...

  5. CSS面试细节整理(一)

    最近面试时候发现自己最熟悉的css确实开发中好多细节没注意到,为了防止在栽跟头,打算从头到底捋一遍咯 语法部分: 1.css几种选择器的写法 (1)h1 em {color:red;} (后代选择器) ...

  6. Java细节整理——数组与内存控制

    重点:使用Java数组之前,必须对数组对象进行初始化. 当数组的所有元素都被分配了合适的内存空间,并指定了初始值时,数组的初始化完成.程序以后将不能重新改变数组对象在内存中的位置和大小. 知识点整理: ...

  7. iOS开发笔记18:一些编译、开发调试、打包的细节整理

    1.以链库的方式引用第三方库 一些特殊场景可能会要求使用链库的方式使用第三方库,大体设置如下: ①Other Linker Flags里进行设置,格式为-l+库名称 ②Libray Search Pa ...

  8. iOS-技术细节整理

    遇到未使用类,可以看看xcode->help->developer documentation 下面做一下简单的技术细节整理 Auto Layout使用Auto Layout来灵活改变UI ...

  9. spark shuffle 相关细节整理

    1.Shuffle Write 和Shuffle Read具体发生在哪里 2.哪里用到了Partitioner 3.何为mapSideCombine 4.何时进行排序 之前已经看过spark shuf ...

随机推荐

  1. XMLHttpRequest HTTP请求的返回码为0 http status = 0

    由于用户在http返回前关闭/取消,或者防火墙等原因,会造成http请求没有status信息.w3c有相应的说明:http://www.w3.org/TR/XMLHttpRequest/#the-st ...

  2. 【Linux】文件权限

    Linux的每一个文件都跟多种类型相关联.在这些权限中,我们通常需要和三类权限打交道(用户.用户组以及其他实体). 1.文件权限查看ls –l Linux:/qinys # ls -l total 6 ...

  3. mysql日期/时间转换为字符串

    将日期时间2016-05-13 16:07:50转化为字符串20160513 date_format select phone,  date_format(time, '%Y%m%d%H%i%s') ...

  4. mysql改变字符串的大小写

    INITCAP:转换每个字的第一个字符为大写LOWER:转换所有字符为小写UPPER:转换所有字符为人写 eg: LOWER(phone)

  5. Axure 实现数字自动加键功能(点击“+”数字加1,点击“-”数字减1)

    百度网盘:http://pan.baidu.com/s/1gfPQ9V1 在上面的元件库中,拖“数字框(仅正数)”即可实现自动加减的功能 如图:

  6. 【转】UIAutomator源码分析之启动和运行

    我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用AccessibilitService APIs来获取窗口界面控件信息已经注入用户行为事件,那么今天开始我们 ...

  7. Ubuntu x86-64汇编(1)

    x86-64 Assembly Language Programming with Ubuntu 的读书记录 x86计算机体系架构 架构总览 CPU, RAM, 存储, 输入输出设备等, 数据的尺寸( ...

  8. Huginn部署到 Heroku

    折腾了几个小时,现在记录下安装步骤 1.本机Win10,放弃本地安装,官网建议也是, 2.安装虚拟机,装ubuntu系统 3.更换国内源(包括apt和gem,bunlde)ruby中国 4.注册her ...

  9. socket 995 错误 boost

    这个错误的中文解释是:由于线程退出或应用程序请求,已中止 I/O 操作. 最近几天学习boost asio 在抄官方的一个实例代码时遇到 了,这个错误搞了我三天才解决,就是在一行代码中少了一个 s 所 ...

  10. 基于Android的小巫新闻客户端开发系列教程

    <ignore_js_op> 141224c6n6x7wmu1aacap7.jpg (27.51 KB, 下载次数: 0) 下载附件  保存到相册 23 秒前 上传   <ignor ...