【问题标题】:Why the shader is not working on the terrain ? It should draw a circle为什么着色器不在地形上工作?它应该画一个圆圈
【发布时间】:2020-03-17 20:42:16
【问题描述】:

我试着从这个教程中学习:Writing Shaders In 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 立方体上,现在它可以工作了。

【问题讨论】:

  • 你的地形位置是什么?
  • @0xBFE1A8 -500 , 0 , -500
  • @0xBFE1A8 我改变了地形位置,将它移到岩石来自另一个资产的一侧。但是现在当地形在侧面时,我无法将材质拖到它上面。地形不接受材质。

标签: c# unity3d shader


【解决方案1】:

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

【讨论】:

  • 仍然无法绘制圆圈。我将材质添加到您展示的地形中,我也尝试使用新地形,但它没有绘制圆圈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多