Вот простой пример:
Shader "Line" {
Properties {
// Easiest way to get access of UVs in surface shaders is to define a texture
_MainTex("Texture", 2D) = "white"{}
// We can pack both points into one vector
_Line("Start Pos (xy), End Pos (zw)", Vector) = (0, 0, 1, 1)
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float4 _Line;
struct Input {
// This UV value will now represent the pixel coordinate in UV space
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
float2 start = _Line.xy;
float2 end = _Line.zw;
float2 pos = IN.uv_MainTex.xy;
// Do some calculations
return fixed4(1, 1, 1, 1);
}
ENDCG
}
}
Вот хороший пост о том, как вычислить, находится ли точка на линии:
Как проверить, если точкалежит на линии между двумя другими точками
Допустим, вы определяете функцию из этого со следующей сигнатурой:
inline bool IsPointOnLine(float2 p, float2 l1, float2 l2)
Затем для возвращаемого значения вы можете поместить это:
return IsPointOnLine(pos, start, end) ? _LineColor : _BackgroundColor
Если вам нужны координаты UV без использования текстуры, я рекомендую вместо этого сделать шейдер вершинного фрагмента и определить float2 uv : TEXCOORD0
внутри структуры appdata / VertexInput.Затем вы можете передать это фрагментному шейдеру внутри функции вершины.