Почему шейдер не работает на местности? Следует нарисовать круг - PullRequest
1 голос
/ 17 марта 2020

Я пытался извлечь уроки из этого урока: Написание шейдеров в 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
       }
}

Затем я создал файл шейдера с кодом и материал. Добавил шейдер к материалу. Затем перетащите материал на местность.

Две проблемы:

  1. При перетаскивании материала на местность материал помещается только на небольшую часть рельефа на этой скале. в белом. Почему он не применяет материал по всей местности?

  2. Это не показывает круг вообще. Ничего не нарисовано. Даже близко к обучающему видео в ссылке.

Material is not over all the terrain and the shader is not working no circle at all

Я сдвинул местность в сторону, так как скалы и утесы из другого актива. Но теперь я не могу перетащить материал по местности. Ландшафт вообще не принимает материал.

The terrain is now on the side but I an't drag the material over it

Все еще не работает, не рисуя окружность на местности. Я пробовал с новым ландшафтом: Terrain (1)

Добавлен новый материал:

New Terrain but not working yet

Это настройки материала:

Material settings

Это настройки шейдера:

Shader settings

И шейдер код:

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 куб и теперь он работает.

1 Ответ

2 голосов
/ 18 марта 2020

Добавьте свой материал к местности следующим образом:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...