c# - 为什么着色器不在地形上工作?它应该画一个圆圈
问题描述
我试图从本教程中学习:在 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)
添加了新材料:
这是材质设置:
这是着色器设置:
和着色器代码:
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 立方体,现在它可以工作了。
解决方案
推荐阅读
- python - python中3D numpy数组的体积计算?
- go - 如何在返回时使用路由名称作为全局变量
- prometheus - Prometheus 标签与向量时间戳的比较
- node.js - 如何保护和保护 Nodejs api
- reactjs - ReactJS:onClick `window.location.href` 返回上一页值
- java - 如何在这个位置找到特定的文本位置(坐标)和drawImage?
- gitlab - 当命令失败时,如何检查 GitLab 运行器中使用了哪个图像?
- java - 用户在 Quiz App 中获得 1 分后分数不会增加。我该如何解决?
- c# - unity Time.timeScale = 0 不会冻结整个场景
- drupal - 对 Drupal 的 Axios 身份验证请求 - invalid_grant