博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity投影器细节整理
阅读量:5885 次
发布时间:2019-06-19

本文共 3308 字,大约阅读时间需要 11 分钟。

抽了个空整理下投影器

 

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

 

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

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

 

 

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

 

 

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

 

 

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

 

 

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

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

丢Editor目录下即可使用

using UnityEditor;using UnityEngine;using System.IO;using System.Linq;using System.Collections;public class GradientCreator : EditorWindow{    public enum OrderModeEnum { H, V };    Color mBeginColor = new Color(1, 1, 1, 1);    Color mEndColor = new Color(0, 0, 0, 0);    float mOffset = 1f;    int mExpectWidth = 256;    int mExpectHeight = 256;    bool mIsHardEdge = true;    bool mIsInvert = false;    OrderModeEnum mOrderMode;    [MenuItem("Hont Tools/Gradient Creator")]    public static void Setup()    {        GetWindow
(); } void OnGUI() { mBeginColor = EditorGUILayout.ColorField("Begin Color", mBeginColor); mEndColor = EditorGUILayout.ColorField("End Color", mEndColor); mOffset = EditorGUILayout.Slider("Offset", mOffset, -1, 1); mIsInvert = EditorGUILayout.Toggle("Invert", mIsInvert); mExpectWidth = EditorGUILayout.IntField("Expect Width", mExpectWidth); mExpectHeight = EditorGUILayout.IntField("Expect Height", mExpectHeight); mIsHardEdge = EditorGUILayout.Toggle("Hard Edge", mIsHardEdge); mOrderMode = (OrderModeEnum)EditorGUILayout.EnumPopup("Order Mode", mOrderMode); if (GUILayout.Button("Create!")) { var mainTexture = new Texture2D(mExpectWidth, mExpectHeight); if (mOrderMode == OrderModeEnum.V) { for (int x = 0; x < mainTexture.width; x++) { for (int y = 0; y < mainTexture.height; y++) { var g = GetG(y, mainTexture.height); var currentColor = Color.Lerp(mBeginColor, mEndColor, g); mainTexture.SetPixel(x, y, currentColor); } } } else { for (int y = 0; y < mainTexture.height; y++) { for (int x = 0; x < mainTexture.width; x++) { var g = GetG(x, mainTexture.width); var currentColor = Color.Lerp(mBeginColor, mEndColor, g); mainTexture.SetPixel(x, y, currentColor); } } } mainTexture.Apply(); var outputFile = System.IO.Directory.GetCurrentDirectory() + "/Assets/Gradient.png"; if (File.Exists(outputFile)) File.Delete(outputFile); var bytes = mainTexture.EncodeToPNG(); File.WriteAllBytes(outputFile, bytes); AssetDatabase.Refresh(); } } float GetG(float current, float max) { var g = Mathf.Clamp01((current / max) + mOffset); g = mIsHardEdge ? g < 1 ? 0f : 1f : g; g = mIsInvert ? 1 - g : g; return g; }}
Gradient Creator

 

 

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

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

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

 

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

转载于:https://www.cnblogs.com/hont/p/6574204.html

你可能感兴趣的文章
Applet
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>
关于浏览器的cookie
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
影响企业信息化成败的几点因素
查看>>
SCCM 2016 配置管理系列(Part8)
查看>>
struts中的xwork源码下载地址
查看>>
ABP理论学习之仓储
查看>>
我的友情链接
查看>>
Tengine新增nginx upstream模块的使用
查看>>
CentOS图形界面和命令行切换
查看>>
HTML5通信机制与html5地理信息定位(gps)
查看>>
汽车常识全面介绍 - 悬挂系统
查看>>
加快ALTER TABLE 操作速度
查看>>
学习笔记之软考数据库系统工程师教程(第一版)
查看>>