【发布时间】: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)
添加了新材质:
这是材质设置:
这是着色器设置:
还有着色器代码:
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 我改变了地形位置,将它移到岩石来自另一个资产的一侧。但是现在当地形在侧面时,我无法将材质拖到它上面。地形不接受材质。