Shader "Unlit/MyFirstLightShader"
{
Properties
{
_Tint("Tine",Color) = (1,1,1,1)
_MainTex ("Albedo", 2D) = "white" {}
[NoScaleOffset] _NormalMap("Normal Map",2D)="bump"{}
_BumpScale("Bump Scale",Float)=1
[NoScaleOffset] _Metallic("MetallicTex", 2D) = "white" {}
[Gamma] _Metallic("Metallic",Range(0,1))=0
_Smoothness("Smoothness",Range(0,1))=0
[NoScaleOffset] _DetailTex("Detail Albedo", 2D) = "gray" {}
_DetailNormalMap("Detail Normal",2D) = "bump"{}
_DetailBumpScale("DetailBumapScale",Float) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#pragma shader_feature _ _LOF
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
CustomEditor "MyLightingShaderGUI"
}
using UnityEngine;
using UnityEditor;
using System;
public class MyLightingShaderGUI : ShaderGUI
{
Material target;
MaterialEditor editor;
MaterialProperty[] properties;
static GUIContent staticLabel = new GUIContent();
public override void OnGUI(MaterialEditor editor, MaterialProperty[] properties)
{
this.target = editor.target as Material;
this.editor = editor;
this.properties = properties;
DoMain();
DoSecondary();
SetKeyword("_LOF", true);
}
private void SetKeyword(string keyword,bool state)
{
if (state)
{
target.EnableKeyword(keyword);
}
else
{
target.DisableKeyword(keyword);
}
}
private void DoMain()
{
GUILayout.Label("Main Maps", EditorStyles.boldLabel);
MaterialProperty mainTex = FindProperty("_MainTex");
MaterialProperty tint = FindProperty("_Tint");
editor.TexturePropertySingleLine(MakeLabel(mainTex, "Albedo (RGB)"), mainTex, tint);
DoMetallic();
DoSmoothness();
DoNormals();
editor.TextureScaleOffsetProperty(mainTex);
}
private void DoSecondary()
{
GUILayout.Label("Secondary Maps", EditorStyles.boldLabel);
MaterialProperty detailTex = FindProperty("_DetailTex");
editor.TexturePropertySingleLine(MakeLabel(detailTex, "Albedo (RGB) multiplied by 2"), detailTex);
DoSecondaryNormals();
editor.TextureScaleOffsetProperty(detailTex);
}
private void DoSmoothness()
{
MaterialProperty slider = FindProperty("_Smoothness");
EditorGUI.indentLevel += 2;
editor.ShaderProperty(slider, MakeLabel(slider));
EditorGUI.indentLevel -= 2;
}
private void DoMetallic()
{
MaterialProperty slider = FindProperty("_Metallic");
EditorGUI.indentLevel += 2;
editor.ShaderProperty(slider, MakeLabel(slider));
EditorGUI.indentLevel -= 2;
}
private void DoSecondaryNormals()
{
MaterialProperty map = FindProperty("_DetailNormalMap");
editor.TexturePropertySingleLine(MakeLabel(map), map, map.textureValue ? FindProperty("_DetailBumpScale") : null);
}
private void DoNormals()
{
MaterialProperty map = FindProperty("_NormalMap");
editor.TexturePropertySingleLine(MakeLabel(map), map, map.textureValue ? FindProperty("_BumpScale") : null);
}
private MaterialProperty FindProperty(string name)
{
return FindProperty(name, properties);
}
static GUIContent MakeLabel(string text, string tooltip = null)
{
staticLabel.text = text;
staticLabel.tooltip = tooltip;
return staticLabel;
}
static GUIContent MakeLabel(MaterialProperty property, string tooltip = null)
{
staticLabel.text = property.displayName;
staticLabel.tooltip = tooltip;
return staticLabel;
}
}