抽了个空整理下投影器

一般投影器需要两张贴图,一张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. 〖Linux〗穿越城墙之后,直接连接国内网站的路由配置

    因为有需要做Android相关的开发工作,很多时候要穿越之后才能做事情: 如Android文件加密预研.Android NDK/SDK的下载,都需要使用得到Google: 但是穿越之后,访问国内网站就 ...

  2. 八叉树(Octree)

    八叉树(Octree)是一种用于描述三维空间的树状数据结构.想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个.再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币 ...

  3. 查看Win系统激活状态

    Win键+R调出运行框,在运行框中输入cmd slmgr.vbs -dlv winver            回车后就能看到当前系统的版本 slmgr.vbs -dli 显示:操作系统版本.部分产品 ...

  4. 转: 在Ogre中使用Havok物理引擎(源码)

    作者:CYM 众所周知Ogre则是评价很高的一款图形渲染引擎,Havok则是世界一流的物理引擎,今天花了点时间将两者结合在了一块,做了个Demo 由于国内对Havok的研究似乎很少,网上也找不到多少资 ...

  5. 基于springboot跟poi封装的最便捷的excel导出

    发布时间:2018-11-15   技术:springboot1.5.6 + maven3.0.5 + jdk1.8   概述 Springboot最便捷的Excel导出,只需要一个配置文件即可搞定 ...

  6. 从零開始学android&lt;AnalogClock与DigitalClock时钟组件.三十一.&gt;

    这两个组件比較交单,大家看下会使用即可了 XML文件配置 <span style="font-size:18px;"><RelativeLayout xmlns: ...

  7. Android的Button按钮,ACTION_UP事件不触发解决方案

           在android 编程时,有时候要实现当Button一直按下的时候,执行一些逻辑代码,当按钮弹起的时候,终止这些逻辑代码的执行.      比如在 设置页面的滑动开关时,如果不监听ACT ...

  8. 修改cnblogs日历控件CSS

    自定义cnblogs日期控件的样式时, 关于透明度 控件头部死活没法透明 在background属性值后边添加!important即把cnblogs系统自带的属性覆盖, 解决了该问题. !import ...

  9. C语言中的随意跳转

    C语言中有一个很不常用的头文件:setjmp.h. 这个头文件是C语言底层实现的,不像math.h里面的函数都是纯C语言实现的. setjmp.h包含两个函数: longjmp 跳转到某个位置 set ...

  10. 更新卡片的zIndex

    问题描述 屏幕上有若干张互相重叠的卡片,用户每点击一张卡片,就要把这张卡片的移到最上面,也就是把它的zIndex置为最大值.应该如何操作每个卡片的zIndex才能实现? 实现方案一 定义一个全局变量g ...