Я пытался извлечь уроки из этого урока: Написание шейдеров в Unity
Код шейдера:
Shader "Custom/TerrainCircle"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_MainColor("Main Color", Color) = (0, 1, 0)
_CircleColor("Circle Color", Color) = (1, 0, 0)
_Center("Center", Vector) = (0,0,0,0)
_Radius("Radius", Range(0, 100)) = 10
_Thickness("Thickness", Range(0, 100)) = 5
}
SubShader
{
CGPROGRAM
#pragma surface surfaceFunc Lambert
sampler2D _MainTex;
fixed3 _MainColor;
fixed3 _CircleColor;
float3 _Center;
float _Thickness;
float _Radius;
struct Input {
float2 uv_MainTex;
float3 worldPos;
};
void surfaceFunc(Input IN, inout SurfaceOutput o) {
half4 c = tex2D(_MainTex, IN.uv_MainTex);
float dist = distance(_Center, IN.worldPos);
if (dist > _Radius && dist < (_Radius + _Thickness))
o.Albedo = _CircleColor;
else
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
}
Затем я создал файл шейдера с кодом и материал. Добавил шейдер к материалу. Затем перетащите материал на местность.
Две проблемы:
При перетаскивании материала на местность материал помещается только на небольшую часть рельефа на этой скале. в белом. Почему он не применяет материал по всей местности?
Это не показывает круг вообще. Ничего не нарисовано. Даже близко к обучающему видео в ссылке.
Я сдвинул местность в сторону, так как скалы и утесы из другого актива. Но теперь я не могу перетащить материал по местности. Ландшафт вообще не принимает материал.
Все еще не работает, не рисуя окружность на местности. Я пробовал с новым ландшафтом: Terrain (1)
Добавлен новый материал:
Это настройки материала:
Это настройки шейдера:
И шейдер код:
Shader "Custom/TerrainCircle"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_MainColor("Main Color", Color) = (0, 1, 0)
_CircleColor("Circle Color", Color) = (1, 0, 0)
_Center("Center", Vector) = (0,0,0,0)
_Radius("Radius", Range(0, 100)) = 10
_Thickness("Thickness", Range(0, 100)) = 5
}
SubShader
{
CGPROGRAM
#pragma surface surfaceFunc Lambert
sampler2D _MainTex;
fixed3 _MainColor;
fixed3 _CircleColor;
float3 _Center;
float _Thickness;
float _Radius;
struct Input {
float2 uv_MainTex;
float3 worldPos;
};
void surfaceFunc(Input IN, inout SurfaceOutput o) {
half4 c = tex2D(_MainTex, IN.uv_MainTex);
float dist = distance(_Center, IN.worldPos);
if (dist > _Radius && dist < (_Radius + _Thickness))
o.Albedo = _CircleColor;
else
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
}
Созданный мною тип шейдера: Стандартный шейдер поверхности
Решение Мне пришлось создать моно-скрипт:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class CircleOnTerrain : MonoBehaviour
{
public Material radiusMaterial;
public float radius = 1;
public Color color = Color.white;
public Color circleColor = Color.blue;
public float thickness = 1;
void Update()
{
radiusMaterial.SetVector("_Center", transform.position);
radiusMaterial.SetFloat("_Radius", radius);
radiusMaterial.SetColor("_MainColor", color);
radiusMaterial.SetColor("_CircleColor", circleColor);
radiusMaterial.SetFloat("_Thickness", thickness);
}
}
Прикрепил скрипт к 3d куб и теперь он работает.