冒着捡帽子的风险,我还是问了这个问题。
需要为Unity3d编写一个着色器,它看起来是最简单的,呈放射状出现的图像(如下面的 gif 中所示),但具有模糊和渐变透明效果。也就是说,填充图像的一段(例如 30 度)- 不清晰可见,但透明度平滑过渡(下图中的示例)。
同时,零透明度的图像有最大的模糊(虽然它在透明图像上不可见,并且在这个例子中不是很清楚,但是因为当使用着色器时它会应用于照片之间的过渡,一切将在那里清晰可见)并且随着单个像素的透明度降低,它们的模糊程度也会降低。因此,如果透明度为 100(不透明),则模糊 = 0。
看了好几篇文章,脑子里还是想不通。我读了高斯模糊是如何实现的(平均每列/行的精灵上最近像素的 rgb 值),我知道有必要为此附加透明度并根据另一个改变一个,但是,例如,如何做到这一切,直接在代码中,这里还附上了动画,我完全不明白(虽然我明白有一个属性,_TransVal有一个#pragma alpha负责透明度的参数)。
因为 我以前不必编写着色器,老实说,我在 Internet 上找到的那些文章并没有带来太多清晰度 - 特别是在实现问题上。非常了解着色器是什么、它们是什么以及为什么 - 我有它。
如果有人承诺使用我的任务示例逐步描述实施过程并进行解释,我将不胜感激:他们说我们为此需要这个,为此,这就是我们将如何改变模糊,这就是透明度,这就是我们添加动画的方式。
更新 我能够实现的目标:通过调整我在 delirium 中收集的误解的 sigma 和 cutoff 值(由于我缺乏编写着色器的经验),我需要的一切都会发生,除了一个 BUT,精灵在这一切的背后,它从何而来,如何摆脱它,我仍然无法理解。
http://g.recordit.co/rUaGYdynQ3.gif(大图)。
此材质(带着色器)应用于图像。图像和画布,它们被放置在由单独的相机渲染的transparentfx层上(该层在主相机上被禁用)。仍然需要了解如何在后面禁用(或从渲染中删除)这个精灵,并以最小的形式解决任务(填充边缘的透明度不再重要,至少要处理模糊)。
更新 2如果您将它设置在Image类型本身上filled并转动旋钮,任务就解决了fill amount。但是如何人为地关闭图像的渲染,只留下真实的渲染,仍然是不可理解的。
着色器输出:
更新 12 月 29 日
意识到我不太擅长像人一样写作,我尝试使用 Shader Forge,它似乎达到了预期的效果(必要的效果之一)。但结果很奇怪,在某种意义上,在单元的检查器窗口中显示了应有的效果,而在游戏场景中,可以说它表现得“简化”了。请参阅下面的 gif 以更好地理解。GIF1,检查器窗口。
GIF2,游戏窗口




Ответ, часть 2.
Так как возможно это будет нагрузка на шейдер, то можно некоторые части также довыносить в управляющий скрипт. Оставить тут только применение значений. В итоге шейдер и скрипт могут быть такими:
Скрипт будет таким:
в инспекторе управление такое:
И по поводу размытия...Так как мой ответ уже большой (из-за кода)...и уже вторая часть, то я приведу код шейдера
Blur, который вы можете перенести в шейдеры выше. А также дописать управление размытием из скрипта по примеру выше.P.S. К сожалению шейдер
RadialFillработает только дляSprite Mode→Single. Как сделать для мультиMultiple, я пока не знаю.P.P.S. Можно сделать еще улучшения:
getMatrix(матрица вращения) также в скрипт.atan2и применять уже её. Глядишь еще чуть снять загрузку с шейдера можно.PPPS要尝试至少在较小的层面上了解着色器,您可以使用Shader Forge资产- 用于编程着色器的可视化编辑器。在这种情况下,视觉效果非常好。
在免费的中,目前搜索只显示uShader FREE - 但我没有尝试过,我不知道它有多好。
上面着色器中使用的阅读链接:
混合
Unity 中的着色器和效果。食谱书
通过单个着色器来围栏是否值得这一切?会这样做:
哇,有趣的问题,甚至是奖励!
总的来说,无论我读了多少书,我都无法想象为什么要对透明度应用模糊效果。毕竟,如果 sprite 的某个部分是透明的,那么那里的模糊就不会可见和明显,而不透明的地方则没有模糊。或者我不明白什么,这意味着一般对整个精灵应用模糊,而不管现在可用的径向填充百分比是多少。如果是这样,那么
(!!!)
是的,站点管理员会原谅我,但我不会给出一个答案(由于代码量,而不是因为“水”)。所以答案将分为两部分。
回答第 1 部分。
最重要的是裁剪,填充透明度将归结为将采取面具的事实,一切都会在此基础上发生。掩码是通过三角函数以编程方式生成的
atan2。在轴上它看起来像这样:在二维坐标系中它看起来像这样:
由于遮罩是由黑白色调组成的某个组件,其中黑色是完全没有纹理,而白色是完全可见的纹理,那么对于透明度,遮罩
atan2将是从黑色到白色的过渡(见图上面),并且将应用附加功能进行裁剪,因此它只是黑色/白色,没有平滑过渡。我将尝试只发布一个着色器,其中包含对所做工作的评论。我不确定一切都会清楚,但我会尽力而为。
要在正确的时间开始填充,当然需要下达命令。哪里可以给?没错 - 从剧本。它将位于下方:
在哪里:
cutoffStartAngle— начальный угол обрезки,opacityStartAngle— начальный угол прозрачности. Эти параметры для того, чтобы немного отрегулировать по вкусу площадь сектора, занимаемого прозрачностью. Замечу, что прозрачность изменяется от -360 до 360, потому что первый круг она проворачивается сама по себе, а второй круг — плавно "заходит" за текстуру.deltaAngle- дельта, на которую проворачиваются маски.Что скрипт делает? При нажатии нажатии на клавишу мыши он берет шейдер у спрайта (точнее с его материала), устанавливает изначальные углы, в цикле изменяет угол поворота и передает это значение в шейдер, чтобы он там уже у себя применил значения в
frag.Выглядит в инспекторе так:
Итог будет выглядеть примерно таким:
Увы на данной гифке не получается передать то, как это выглядит в правильности
Улучшение
Так как у секции cutoff и opacity есть общие части, то их можно вынести в общие функции, как и во всех нормальных языках программирования.