抽了个空整理下投影器

一般投影器需要两张贴图,一张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(, , , );
Color mEndColor = new Color(, , , );
float mOffset = 1f;
int mExpectWidth = ;
int mExpectHeight = ;
bool mIsHardEdge = true;
bool mIsInvert = false;
OrderModeEnum mOrderMode; [MenuItem("Hont Tools/Gradient Creator")]
public static void Setup()
{
GetWindow<GradientCreator>();
} void OnGUI()
{
mBeginColor = EditorGUILayout.ColorField("Begin Color", mBeginColor);
mEndColor = EditorGUILayout.ColorField("End Color", mEndColor);
mOffset = EditorGUILayout.Slider("Offset", mOffset, -, );
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 = ; x < mainTexture.width; x++)
{
for (int y = ; 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 = ; y < mainTexture.height; y++)
{
for (int x = ; 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 < ? 0f : 1f : g;
g = mIsInvert ? - g : g;
return g;
}
}

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. java AES加密、解密(兼容windows和linux)

      java AES加密.解密 CreationTime--2018年7月14日10点06分 Author:Marydon 1.准备工作 updateTime--2018年8月10日15点28分 up ...

  2. 找出以“b”开头的名字

    找出以“b”开头的名字:select * from pet where name like 'b%' “_”:匹配任何单个字符“%”:匹配任意数目字符(包括零字符)

  3. Win10激活KMS2.0

    目前,发现的唯一能激活Window10的纯净版. 下载地址: http://pan.baidu.com/s/1bpvMRBx 好孩子看不见: http://pan.baidu.com/s/1bo8xP ...

  4. ArcGIS 概述

    ArcGIS产品线为用户提供一个可伸缩的,全面的GIS平台.ArcObjects包含了大量的可编程组件,从细粒度的对象(例如,单个的几何对象)到粗粒度的对象(例如与现有ArcMap文档交互的地图对象) ...

  5. webservice(pers)

    1.     Java远程方法调用 Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接 ...

  6. 理解sklearn.feature.text中的CountVectorizer和TfidfVectorizer

    """ 理解sklearn中的CountVectorizer和TfidfVectorizer """ from collections im ...

  7. libev4.15学习

    libev作为优秀的高性能IO框架,非常值得学习! 虽然我是菜鸟,但也必须学习啦,从今天一点一点地学习,慢慢进步! # include "ev.h" struct event_ba ...

  8. 【LeetCode】215. Kth Largest Element in an Array (2 solutions)

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  9. zabbix v3.0安装部署

    这篇文章没有写明init的部分要注意 zabbix v3.0安装部署 摘要: 本文的安装过程摘自http://www.ttlsa.com/以及http://b.lifec-inc.com ,和站长凉白 ...

  10. 自由是有代价的:聊聊这几年尝试的道路 要想生活好,别看哲学书和思想书。简单看看可以,看多了问题就大了。还是要去研究研究些具体的问题。别jb坐在屋子里,嘴里念着海子的诗,脑袋里想康德想的事情,兜里屁都没有,幻想自己是大国总理,去想影帝是怎么炼成的。

    自由是有代价的:聊聊这几年尝试的道路 现在不愿意写过多的技术文章了,一点是现在做的技术比较偏,写出来看的人也不多,二来是家庭事务比较繁多,没以前那么有时间写了.最近,园子里多了一些写经历的文章,我也将 ...