如何使Unity玻璃着色器仅折射它背后的物体?

时间:2016-11-05 15:11:40

标签: unity3d shader hlsl fragment-shader

我正在寻找Unity的玻璃着色器,它只能折射它背后的物体,或者想要如何修改现有的玻璃着色器来做到这一点。

此屏幕截图显示了在曲面网格上使用FX / Glass / Stained BumpDistort时会发生什么。

enter image description here

如您所见,玻璃着色器折射网格前面的球体和网格后面的地面。我正在寻找一个只能折射它背后的物体的着色器。

以下是该着色器的代码,供参考:

 import java.util.*;
 Scanner input = new Scanner(System.in);
 String text = input.nextLine();
 int check = 0;
 for(int i = 0; i < text.length(); i++;){
     if(text.substring(i, i + 2) .equals("of")){
          check = 0;
     }
 }

我的直觉是它与_GrabTexture被捕获的方式有关,但我并不完全确定。我很感激任何建议。谢谢!

1 个答案:

答案 0 :(得分:5)

没有简单的答案。 如果不以某种方式考虑上下文,你就无法考虑折射,所以让我们看看:

基本上,定义一个对象何时“落后”另一个对象并不容易。偶数meassure a point's distance to the camera有不同的方法,更不用说考虑整个几何。有许多奇怪的情况,几何相交,中心和边界可以在任何地方。

raytracing algorithms中通常很容易考虑折射(你只需要射线并计算它如何反弹/折射以获得颜色)。但是在raster graphics(用于99%的实时图形)中,对象将作为一个整体呈现,并轮流呈现。

该图像的作用是首先渲染背景和球,然后再渲染玻璃。玻璃不会“折射”任何东西,它只会将自身描绘为对渲染缓冲区中所写内容的扭曲。

“之前”是关键。你不会在光栅图形中获得“落后”,一切都是通过意识到渲染顺序来完成的。让我们看看如何创建一些折射:

  • 手动设置render queue tags for the shaders,以便知道在绘制管道的哪个位置
  • 手动设置each material's render queue
  • 创建一个不断整理场景的脚本,每个帧根据您想要的位置或任何方法计算玻璃之前或之后应该绘制的内容,并在材质中设置渲染队列
  • 创建一个脚本,使场景过滤掉(through various methods)不应被折射的对象,并将其用作要折射的纹理(取决于场景的复杂程度,这有时是必要的)

这些只是我头脑中的一些选项,一切都取决于你的场景

我的建议:

  • 选择球的材质
  • 右键单击“检查器”窗口 - &gt;勾选“调试”模式
  • 将自定义渲染队列设置为2200(绘制常规几何图形后)
  • 选择玻璃'材质
  • 将自定义渲染队列设置为2100(在大多数几何体之后,但在球之前)
相关问题