首页 > 解决方案 > 为什么着色器不在地形上工作?它应该画一个圆圈

问题描述

我试图从本教程中学习:在 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. 它根本没有显示圆圈。什么都没有画出来。甚至没有接近链接中的教程视频。

材质没有覆盖所有地形,着色器没有工作,没有圆圈

我将地形移到一边,因为岩石和悬崖来自另一个资产。但现在我无法将材质拖过地形。地形根本不接受材料。

地形现在在一边,但我没有将材料拖到它上面

仍然无法在地形上绘制圆圈。我尝试了一个新的地形:地形(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 立方体,现在它可以工作了。

标签: c#unity3dshader

解决方案


像这样将你的材质添加到地形中:

在此处输入图像描述


推荐阅读