Как рисовать в шейдере примитивную фигуру с наложением на неё текстуры?
Допустим нужно нарисовать круг и заполнить его внутри текстурой
либо raymarch
waruiyume писал(а):потому как текстовая кухня крайне сумбурна и в ней чёрт ногу сломит.
waruiyume писал(а):При традиционном подходе(пара: вершинный-пиксельный шейдер)- никак(я объясню ниже, что имел в виду). Есть экзотичные геометрические шейдеры- ими можно генерировать геометрию, ваш Кэп. Но они не популярны ввиду своей относительной тормознутости, удачи найти нормальные туторы по ним.
При традиционном подходе, пиксельный шейдер запускается для многих пикселей одновременно, свой пля каждого(в реальности для групп по несколько пикселей, но для нас это ничего не меняет). Ввиду параллельности, каждый пиксель знает только о себе и менять может только себя. По этому именно нарисовать что-то нельзя.
Можно посчитать какой должен быть цвет пикселя с помощью функции, которая принимает позицию(или, допустим, цвет текстуры в этом месте), и возращает цвет исходя из этого. Круг нарисовать будет довольно просто:
если дистанция от текущего пикселя до центра, допустим текстурных координат, чем радиус круга, то ничего не рисуется или пиксель рисуется чёрным.
Попробуйте начать с нодовых редакторов типа "Amplify shader editor", а когда немного разберётесь пробовать текстовые варианты, потому как текстовая кухня крайне сумбурна и в ней чёрт ногу сломит.
Несколько ссылок:
https://en.wikibooks.org/wiki/Cg_Programming //устаревшее, но поможет разобраться в принципах
https://en.wikibooks.org/wiki/GLSL_Programming/Unity //более актуальное, но есть не всё то, что в предыдущем
https://catlikecoding.com/unity/tutorials/rendering //годные уроки, но у автора есть склонность к оверинженерингу
Пример шейдера(материал нужно натянуть на объект у которого есть UV координаты(встроенный куб))Синтаксис:Используется glslShader "Unlit/Circle"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
float dist = distance(0.5, i.uv);
col*=step(dist, 0.5);
return col;
}
ENDCG
}
}
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1