Unity - 从相机的targetTexture渲染纹理产生接缝

时间:2016-02-02 19:50:08

标签: unity3d camera rendering render-to-texture

我正在尝试使用单独的相机和渲染纹理渲染场景的特定部分。该对象位于主摄像机未渲染的单独图层上,但是单独的摄像机是。辅助相机的目标纹理设置为我创建的渲染纹理。一切都按预期工作,除了这样一个事实,即当渲染到纹理时,对象有一堆直接渲染到屏幕时不存在的接缝。

直接渲染到屏幕时的样子: Correct

渲染到纹理时的样子,然后显示在场景中的四边形上: Incorrect

注意第二张图片在精灵之间有一堆透明的“线”,不应该有任何。

我使用基本的透明着色器在四边形上显示渲染纹理(因为背景不是渲染纹理的一部分,只是黑色的人群部分)。我尝试了许多不同的着色器,但它们似乎没有任何区别。

渲染纹理的设置为:宽度:Screen.width高度:Screen.height格式:RenderTextureFormat.ARGBFloat;

Unity版本:5.2.3f1 - iOS平台

注意:我这样做的原因是我可以对纹理应用“模糊”图像效果,并使前景中的人群看起来没有焦点。关于如何做到这一点的任何其他建议也是受欢迎的。

2 个答案:

答案 0 :(得分:0)

我不太确定 - 但它几乎听起来像你有线重影。您可能想要读一读,如果您正在处理的话,请告诉我:

原因在于如何创作纹理图像,以及大多数3D引擎在屏幕上以不同尺寸显示纹理时使用的过滤。

您的图像可能有完全不透明的彩色区域,部分透明的彩色区域和完全透明的区域。但是,Alpha通道完全透明(0%不透明度)的区域实际上仍然具有颜色值。在PNG中(或者至少,Photoshop导出PNG的方式)似乎默认使用白色作为完全透明的像素。对于其他格式或编辑器,这可能是黑色的。当在3d引擎中使用时,两者都是不受欢迎的。

您可能会想,“如果白色完全透明,为什么白色会出问题?”。出现问题的原因是当纹理出现在屏幕上时,通常会根据纹理图像中的像素是大于还是小于实际大小来放大或缩小。为了缩小规模,在导入期间会创建一系列缩小版本。当纹理以相对于视图的较小尺寸或更陡的角度显示时,使用这些缩小版本,旨在提高视觉质量并使渲染更快。此过程称为“mip-mapping” - 在此处阅读有关mip-mapping的更多信息。对于放大,通常使用简单的双线性插值。

缩放版本通常使用简单的双线性插值创建,这意味着透明像素与相邻的可见像素混合。使用mipmap,对于每个较小的级别,与可见像素颜色的不可见混合的问题增加(结果是令人讨厌的白色边缘在更远的距离处变得更明显)。

解决方案是确保这些完全透明的像素具有与其相邻可见像素匹配的颜色值,以便在插值发生时,来自不可见像素的颜色“渗出”具有适当的颜色。

要解决此问题(在Photoshop中),我总是使用Flaming Pear Free Plugins包中的免费“Solidify”工具,如下所示:

下载并安装Flaming Pear“Free Plugins”包(靠近该列表的底部) 在photoshop中打开你的PNG。 转到选择 - >加载选择并单击确定。 转到选择 - >保存选择并单击确定。这将创建一个新的alpha通道。 现在取消全选(Ctrl-D或Cmd-D) 选择过滤器 - >火红的梨 - >凝固B. 您的图像现在看起来完全由纯色制成,没有透明区域,但您的透明度信息现在存储在显式Alpha通道中,您可以通过在通道选项板中选择它来查看和编辑。

现在重新保存你的图像,你会发现你的白色模糊已经消失了! 资料来源:http://answers.unity3d.com/questions/10302/messy-alpha-problem-white-around-edges.html

答案 1 :(得分:0)

事实证明,我在场景中使用的着色器是出于某种原因使用“Blend SrcAlpha OneMinusSrcAlpha”,当它应该使用“Blend One OneMinusSrcAlpha”时。这导致alpha小于1的对象使其下面的对象变为半透明,并暴露出相机的清晰颜色背景。