Как ни странно, про шейдеры очень хорошо написано
в мануале. Там есть отличные примеры
вершинно-пиксельных и
поверхностных шейдеров. Помимо мануала еще есть
серия туториалов на Wikibooks, где подробно всё разбирается с основ. Начинать лучше с вершинно-пиксельных шейдеров, в конечном итоге всё сводится к ним, поверхностные шейдеры это просто синтаксический сахар, да и те же постэффекты делаются только на пиксельных шейдерах. Кроме того, я бы настоятельно рекомендовал поставить Visual Studio вместе с
Visual Studio Tools for Unity, иначе не получите худо-бедной подсветки синтаксиса, шейдеры и так сложно дебажить, так хоть будет полегче. В качестве образца ещё часто пригождаются встроенные шейдеры, скачать их можно на
этой странице.
Что касается взаимодействия шейдеров с объектами, так оно отсутствует. Шейдеры ничего не знают про сцену и объекты, они работают только с данными, которые есть в модельке, экранных буферах и переданных параметрах. Есть ещё глобальные константы и ключевые слова, но не думаю, что они вам в скором времени понадобятся.
Если говорить конкретно о примере с просвечиванием сквозь стену, то делается оно довольно просто с помощью двухпроходного шейдера с изменённым
ZTest. Один раз моделька рисуется только там, где в z-буфере уже что-то есть, и один раз рисуется "как обычно". В шейдере ниже я просто скопировал второй раз проход из обычного Unlit шейдера и добавил строчку с
ZTest Greater
, ничего сложного.
Пример шейдераShader "Custom/Example"
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
float4 _Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return _Color;
}
ENDCG
}
Pass
{
ZTest Greater
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
float4 _Color;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return -_Color;
}
ENDCG
}
}
}
Энергетические щиты можно сделать разными способами, обычно это комбинация шейдеров, скриптов, систем частиц и анимаций. Например в шейдере может быть массив точек, рядом с которыми в определённом радиусе рисуется кружок. Точки передаются в материал с помощью
Material.SetVectorArray или в рендерер с помощью MaterialPropertyBlock.SetVectorArray и
Renderer.SetPropertyBlock. Далее в скрипте с помощью функции или анимации меняется радиус рисуемого кружка и одновременно запускается система частиц. Всё это вместе выглядит как энергетический щит, но нельзя сказать, что дело только в шейдере.