透明着色器允许下面的对象显示在上面
Transparent shader allows the objects below to show on top
在我的场景中,笑脸(带 png 图像的四边形)放置在 Y:0,点(带平铺 3X3 的四边形)放置在 Y:-0.25。
我需要为笑脸使用的着色器是透明漫反射,因为我使用的是圆形 png 图像。
但是我在下面使用的点显示在笑脸上方。使用任何其他着色器(如漫反射)可以解决问题,但笑脸变成正方形。
截图:
如果您需要更多说明,请随时询问。
编辑:
我已经附上了来自检查面板的笑脸和圆点的着色器细节。
link: http://postimg.org/image/cvws1os7d/
编辑 2:
我发现问题应该出在 MainCamera 上,尤其是 distance & "Field Of View"。
我需要使用 "Perspective" 作为投影类型和 140 作为视野。
如果我将投影类型更改为正交,问题就完全解决了。
下面的屏幕截图显示了距离和视野如何控制笑脸上的点的外观。
截图一:
Y位置:8.48
视野:30
link: http://postimg.org/image/s31tttrkp/
截图2:
Y位置:9.7
视野:30
link: http://postimg.org/image/f71sq0y4b/
截图3:
Y位置:11.41
视野:30
link: http://postimg.org/image/3uk4az3d3/
截图四:
Y 位置:1
视野:140
link: http://postimg.org/image/bul9zwg7z/
这可以作为线索吗?
如果您使用 Sprite Renderer
组件渲染图像,您必须使用 Sorting Layer
和 Order in Layer
参数更改渲染顺序,而不是更改 Y 位置。
可以通过单击 "default" 并选择 "Add Sorting Layer.." 来添加排序图层。层的顺序通过将它们拖动到不同的顺序来改变。使用 Order in Layer
时,首先呈现较小的数字。这意味着较高的数字将绘制在较低的数字之上。
只是几个信息,关于透明度通常是如何实现的(不仅仅是 Unity)。
与此同时,不透明对象可以按任何顺序绘制(即使按从前到后的顺序对它们进行排序最终可以提高一些依赖于早期 z 剔除的 GPU 性能)。可以使用存储在 z-buffer.
中的深度值推断出哪些像素是可见的
您不能依赖 z-buffer 来实现透明度。
对于渲染半透明物体,一种典型的方法是在所有不透明物体之后绘制它们,并按从后到前的顺序对它们进行排序(首先绘制距离相机较远的透明物体)。
现在的问题是:如何对对象进行排序?使用透视相机和通用形状的网格,the solution is not obvious。
对于平行于正交摄影机视平面的四边形网格,z 顺序是隐式正确的(这就是它总是适合您的原因)。
您还可以注意到相机位置会影响绘图顺序,因为对于透视相机,顺序是根据对象位置和相机之间的距离计算的。
那么在您的特定用例场景中,您可以用 Unity3d
做什么?
一些技巧:
- 显式设置 material
的 render queue
- 在着色器中显式设置render order(与上述类似,但等于每个具有相同着色器的对象)
- 使用 Offset 将深度伪造到着色器中(在您的情况下不是很有用,但值得知道)
希望这对您有所帮助
编辑
我不知道,camera transparency sorting mode 似乎可以自定义。所以这是另一种解决方案,如果您想使用透视相机,这可能是最适合您的情况。
在我的场景中,笑脸(带 png 图像的四边形)放置在 Y:0,点(带平铺 3X3 的四边形)放置在 Y:-0.25。 我需要为笑脸使用的着色器是透明漫反射,因为我使用的是圆形 png 图像。
但是我在下面使用的点显示在笑脸上方。使用任何其他着色器(如漫反射)可以解决问题,但笑脸变成正方形。
截图:
如果您需要更多说明,请随时询问。
编辑: 我已经附上了来自检查面板的笑脸和圆点的着色器细节。 link: http://postimg.org/image/cvws1os7d/
编辑 2: 我发现问题应该出在 MainCamera 上,尤其是 distance & "Field Of View"。 我需要使用 "Perspective" 作为投影类型和 140 作为视野。
如果我将投影类型更改为正交,问题就完全解决了。
下面的屏幕截图显示了距离和视野如何控制笑脸上的点的外观。
截图一: Y位置:8.48 视野:30 link: http://postimg.org/image/s31tttrkp/
截图2: Y位置:9.7 视野:30 link: http://postimg.org/image/f71sq0y4b/
截图3: Y位置:11.41 视野:30 link: http://postimg.org/image/3uk4az3d3/
截图四: Y 位置:1 视野:140 link: http://postimg.org/image/bul9zwg7z/
这可以作为线索吗?
如果您使用 Sprite Renderer
组件渲染图像,您必须使用 Sorting Layer
和 Order in Layer
参数更改渲染顺序,而不是更改 Y 位置。
可以通过单击 "default" 并选择 "Add Sorting Layer.." 来添加排序图层。层的顺序通过将它们拖动到不同的顺序来改变。使用 Order in Layer
时,首先呈现较小的数字。这意味着较高的数字将绘制在较低的数字之上。
只是几个信息,关于透明度通常是如何实现的(不仅仅是 Unity)。
与此同时,不透明对象可以按任何顺序绘制(即使按从前到后的顺序对它们进行排序最终可以提高一些依赖于早期 z 剔除的 GPU 性能)。可以使用存储在 z-buffer.
中的深度值推断出哪些像素是可见的您不能依赖 z-buffer 来实现透明度。 对于渲染半透明物体,一种典型的方法是在所有不透明物体之后绘制它们,并按从后到前的顺序对它们进行排序(首先绘制距离相机较远的透明物体)。
现在的问题是:如何对对象进行排序?使用透视相机和通用形状的网格,the solution is not obvious。
对于平行于正交摄影机视平面的四边形网格,z 顺序是隐式正确的(这就是它总是适合您的原因)。 您还可以注意到相机位置会影响绘图顺序,因为对于透视相机,顺序是根据对象位置和相机之间的距离计算的。
那么在您的特定用例场景中,您可以用 Unity3d
做什么?
一些技巧:
- 显式设置 material 的 render queue
- 在着色器中显式设置render order(与上述类似,但等于每个具有相同着色器的对象)
- 使用 Offset 将深度伪造到着色器中(在您的情况下不是很有用,但值得知道)
希望这对您有所帮助
编辑
我不知道,camera transparency sorting mode 似乎可以自定义。所以这是另一种解决方案,如果您想使用透视相机,这可能是最适合您的情况。