修改剃毛

This commit is contained in:
shenjianxing 2025-03-04 14:15:11 +08:00
parent 1064bc6923
commit 4900a7a9f4
11 changed files with 21 additions and 606 deletions

View File

@ -8,8 +8,7 @@ Material:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: Shader Graphs_TiMao m_Name: Shader Graphs_TiMao
m_Shader: {fileID: -6465566751694194690, guid: 71f4112fdfb48b2499d0b9a9227a4f39, m_Shader: {fileID: -6465566751694194690, guid: 71f4112fdfb48b2499d0b9a9227a4f39, type: 3}
type: 3}
m_Parent: {fileID: 0} m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0 m_ModifiedSerializedProperties: 0
m_ValidKeywords: [] m_ValidKeywords: []
@ -24,6 +23,10 @@ Material:
m_SavedProperties: m_SavedProperties:
serializedVersion: 3 serializedVersion: 3
m_TexEnvs: m_TexEnvs:
- _AO:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _Cubemap: - _Cubemap:
m_Texture: {fileID: 8900000, guid: 4d02be114fa362d4c8f2930512feed6f, type: 3} m_Texture: {fileID: 8900000, guid: 4d02be114fa362d4c8f2930512feed6f, type: 3}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
@ -36,6 +39,10 @@ Material:
m_Texture: {fileID: 2800000, guid: 10f36425885b13c41b4f5732d27cb050, type: 3} m_Texture: {fileID: 2800000, guid: 10f36425885b13c41b4f5732d27cb050, type: 3}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _Normal:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ValueMask: - _ValueMask:
m_Texture: {fileID: 2800000, guid: 625e84e011f035b4dbdd7a85a7a8f2b3, type: 3} m_Texture: {fileID: 2800000, guid: 625e84e011f035b4dbdd7a85a7a8f2b3, type: 3}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
@ -54,10 +61,11 @@ Material:
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
m_Ints: [] m_Ints: []
m_Floats: m_Floats:
- _AoValue: 1
- _GValue: 1 - _GValue: 1
- _QueueControl: 0 - _QueueControl: 0
- _QueueOffset: 0 - _QueueOffset: 0
- _TValue: 0.08 - _TValue: 1
m_Colors: m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 0} - _Color: {r: 1, g: 1, b: 1, a: 0}
m_BuildTextureStacks: [] m_BuildTextureStacks: []

View File

@ -1,129 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class RongMaoBody : MonoBehaviour
{
//public Shader shader;
[Header("渲染目标")]
public Renderer Target;
public Shader BaseShader;
[Header("皮毛物理")]
public int LayerCount = 10;
public float FurLength = 0.5f;
public Vector3 FurFore;
public Texture2D Noise;
public Texture2D Noise2;
public Texture2D MainTex;
public Texture2D Mask;
//public Texture2D ValueMask;
//[Range(0.08f,1)]public float TValue=1;
//[Range(0.08f,1)]public float GValue=1;
[Header("皮毛渲染")]
//毛发染色
public Color FurColor=Color.white;
public Color ShadowColor=Color.white;
public float ShadowPow = 2;
public float SpPow=1.0f;
public float SpScale=1.0f;
public float FPow=1.0f;
public float FScale=1.0f;
public float FurTenacity=1.0f;
private GameObject[] layers;
private Material mat;
// Start is called before the first frame update
void Start()
{
CreateFur();
//mat=Target.gameObject.GetComponent<Renderer>().material;
}
// Update is called once per frame
void Update()
{
UpadteTransform();
}
//更新每层毛发的位置
void UpadteTransform()
{
if (layers == null || layers.Length == 0)
{
return;
}
for (int i = 0; i < layers.Length; i++)
{
//依据层数、毛发长度和毛发硬度计算lerp速度
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
//让Shell的位置和旋转Lerp到目标模型
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
}
}
//创建毛发
void CreateFur()
{
layers = new GameObject[LayerCount];
float furOffset = 1.0f / LayerCount;
for (int i = 0; i < LayerCount; i++)
{
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
layer.hideFlags = HideFlags.HideInHierarchy;
//layer.tag = "Shell";
Material[] mats = layer.GetComponent<Renderer>().materials;
mats[0]=new Material(BaseShader);
layer.GetComponent<Renderer>().materials =mats;// Basemat;
Material layerMat = layer.GetComponent<Renderer>().materials[0];
//for (int j = 0; j < layerMats.Length; j++)
// {
//Material layerMat = layerMats[i];
layerMat.SetTexture("_MainTex",MainTex);
layerMat.SetColor("_Color",FurColor);
layerMat.SetFloat("_SpPow",SpPow);
layerMat.SetFloat("_SpScale",SpScale);
layerMat.SetFloat("_FPow",FPow);
layerMat.SetFloat("_FScale",FScale);
layerMat.SetFloat("_FurLength",FurLength);
layerMat.SetTexture("_Noise",Noise);
layerMat.SetTexture("_Noise2",Noise2);
layerMat.SetTexture("_Mask",Mask);
//layerMat.SetTexture("_ValueMask",ValueMask);
layerMat.SetColor("_ShadowColor",ShadowColor);
layerMat.SetFloat("_ShadowPow",ShadowPow);
layerMat.SetFloat("_LayerOffset",i*furOffset);
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
layerMat.renderQueue = 3000 + i;
//}
layers[i] = layer;
}
//Debug.Log("创建完毕");
}
private Camera cam;
//删除创建的游戏毛发
private void OnDestroy()
{
// if (layers == null || layers.length == 0)
// {
// return;
// }
//
// for (int i = 0; i < layers.length; i++)
// {
// destroy(layers[i].gameobject);
// }
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: f12d4af7ab2b81c4ea3b01b6f5eac087
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,137 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class RongMaoDu : MonoBehaviour
{
//public Shader shader;
[Header("渲染目标")]
public Renderer Target;
public Shader BaseShader;
[Header("皮毛物理")]
public int LayerCount = 10;
public float FurLength = 0.5f;
public Vector3 FurFore;
public Texture2D Noise;
public Texture2D Noise2;
public Texture2D MainTex;
public Texture2D Mask;
public Texture2D ValueMask;
[Range(0.08f,1)]public float TValue=1;
//[Range(0.08f,1)]public float GValue=1;
[Header("皮毛渲染")]
//毛发染色
public Color FurColor=Color.white;
public Color ShadowColor=Color.white;
public float ShadowPow = 2;
public float SpPow=1.0f;
public float SpScale=1.0f;
public float FPow=1.0f;
public float FScale=1.0f;
public float FurTenacity=1.0f;
private GameObject[] layers;
private Material mat;
// Start is called before the first frame update
void Start()
{
CreateFur();
mat=Target.gameObject.GetComponent<Renderer>().materials[1];
}
// Update is called once per frame
void Update()
{
UpadteTransform();
UpdateValue();
}
//更新每层毛发的位置
void UpadteTransform()
{
if (layers == null || layers.Length == 0)
{
return;
}
for (int i = 0; i < layers.Length; i++)
{
//依据层数、毛发长度和毛发硬度计算lerp速度
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
//让Shell的位置和旋转Lerp到目标模型
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
}
}
//创建毛发
void CreateFur()
{
layers = new GameObject[LayerCount];
float furOffset = 1.0f / LayerCount;
for (int i = 0; i < LayerCount; i++)
{
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
layer.hideFlags = HideFlags.HideInHierarchy;
//layer.tag = "Shell";
Material[] mats = layer.GetComponent<Renderer>().materials;
mats[1]=new Material(BaseShader);
layer.GetComponent<Renderer>().materials =mats;// Basemat;
Material layerMat = layer.GetComponent<Renderer>().materials[1];
//for (int j = 0; j < layerMats.Length; j++)
// {
//Material layerMat = layerMats[i];
layerMat.SetTexture("_MainTex",MainTex);
layerMat.SetColor("_Color",FurColor);
layerMat.SetFloat("_SpPow",SpPow);
layerMat.SetFloat("_SpScale",SpScale);
layerMat.SetFloat("_FPow",FPow);
layerMat.SetFloat("_FScale",FScale);
layerMat.SetFloat("_FurLength",FurLength);
layerMat.SetTexture("_Noise",Noise);
layerMat.SetTexture("_Noise2",Noise2);
layerMat.SetTexture("_Mask",Mask);
layerMat.SetTexture("_ValueMask",ValueMask);
layerMat.SetColor("_ShadowColor",ShadowColor);
layerMat.SetFloat("_ShadowPow",ShadowPow);
layerMat.SetFloat("_LayerOffset",i*furOffset);
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
layerMat.renderQueue = 3000 + i;
//}
layers[i] = layer;
}
//Debug.Log("创建完毕");
}
void UpdateValue()
{
for (int i = 0; i < layers.Length; i++)
{
Material layerMat = layers[i].GetComponent<Renderer>().materials[1];
layerMat.SetFloat("_Value",TValue);
mat.SetFloat("_TValue",TValue);
//mat.SetFloat("_GValue",GValue);
}
}
//删除创建的游戏毛发
private void OnDestroy()
{
// if (layers == null || layers.length == 0)
// {
// return;
// }
//
// for (int i = 0; i < layers.length; i++)
// {
// destroy(layers[i].gameobject);
// }
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 598e923d669eaab46b0f7d156768c0d6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,144 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class RongMaoDuWanZheng : MonoBehaviour
{
public int matNum=0;
public List<Material> Mats = new List<Material>();
//public Shader shader;
[Header("渲染目标")]
public Renderer Target;
public Shader BaseShader;
[Header("皮毛物理")]
public int LayerCount = 10;
public float FurLength = 0.5f;
public Vector3 FurFore;
public Texture2D Noise;
public Texture2D Noise2;
public Texture2D MainTex;
public Texture2D Mask;
public Texture2D ValueMask;
[Range(0.08f,1)]public float TValue=1;
//[Range(0.08f,1)]public float GValue=1;
[Header("皮毛渲染")]
//毛发染色
public Color FurColor=Color.white;
public Color ShadowColor=Color.white;
public float ShadowPow = 2;
public float SpPow=1.0f;
public float SpScale=1.0f;
public float FPow=1.0f;
public float FScale=1.0f;
public float FurTenacity=1.0f;
private GameObject[] layers;
private Material mat;
// Start is called before the first frame update
void Start()
{
CreateFur();
mat=Target.gameObject.GetComponent<Renderer>().materials[matNum];
}
// Update is called once per frame
void Update()
{
UpadteTransform();
UpdateValue();
}
//更新每层毛发的位置
void UpadteTransform()
{
if (layers == null || layers.Length == 0)
{
return;
}
for (int i = 0; i < layers.Length; i++)
{
//依据层数、毛发长度和毛发硬度计算lerp速度
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
//让Shell的位置和旋转Lerp到目标模型
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
}
}
//创建毛发
void CreateFur()
{
layers = new GameObject[LayerCount];
float furOffset = 1.0f / LayerCount;
for (int i = 0; i < LayerCount; i++)
{
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
//layer.hideFlags = HideFlags.HideInHierarchy;
//layer.tag = "Shell";
layer.GetComponent<Renderer>().materials = Mats.ToArray();
Material[] mats = layer.GetComponent<Renderer>().materials;
mats[matNum]=new Material(BaseShader);
layer.GetComponent<Renderer>().materials =mats;
Material layerMat = layer.GetComponent<Renderer>().materials[matNum];
//for (int j = 0; j < layerMats.Length; j++)
// {
//Material layerMat = layerMats[i];
layerMat.SetTexture("_MainTex",MainTex);
layerMat.SetColor("_Color",FurColor);
layerMat.SetFloat("_SpPow",SpPow);
layerMat.SetFloat("_SpScale",SpScale);
layerMat.SetFloat("_FPow",FPow);
layerMat.SetFloat("_FScale",FScale);
layerMat.SetFloat("_FurLength",FurLength);
layerMat.SetTexture("_Noise",Noise);
layerMat.SetTexture("_Noise2",Noise2);
layerMat.SetTexture("_Mask",Mask);
layerMat.SetTexture("_ValueMask",ValueMask);
layerMat.SetColor("_ShadowColor",ShadowColor);
layerMat.SetFloat("_ShadowPow",ShadowPow);
layerMat.SetFloat("_LayerOffset",i*furOffset);
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
layerMat.renderQueue = 3000 + i;
//}
//layer.transform.parent = Target.transform;
layers[i] = layer;
}
//Debug.Log("创建完毕");
}
void UpdateValue()
{
for (int i = 0; i < layers.Length; i++)
{
Material layerMat = layers[i].GetComponent<Renderer>().materials[matNum];
layerMat.SetFloat("_Value",TValue);
mat.SetFloat("_TValue",TValue);
//mat.SetFloat("_GValue",GValue);
}
}
//删除创建的游戏毛发
private void OnDestroy()
{
// if (layers == null || layers.length == 0)
// {
// return;
// }
//
// for (int i = 0; i < layers.length; i++)
// {
// destroy(layers[i].gameobject);
// }
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 1458a57372e398240a4450d82c9194de
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,140 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class RongMaoDuWanZhengOld : MonoBehaviour
{
public int matNum=0;
//public Shader shader;
[Header("渲染目标")]
public Renderer Target;
public Shader BaseShader;
[Header("皮毛物理")]
public int LayerCount = 10;
public float FurLength = 0.5f;
public Vector3 FurFore;
public Texture2D Noise;
public Texture2D Noise2;
public Texture2D MainTex;
public Texture2D Mask;
public Texture2D ValueMask;
[Range(0.08f,1)]public float TValue=1;
//[Range(0.08f,1)]public float GValue=1;
[Header("皮毛渲染")]
//毛发染色
public Color FurColor=Color.white;
public Color ShadowColor=Color.white;
public float ShadowPow = 2;
public float SpPow=1.0f;
public float SpScale=1.0f;
public float FPow=1.0f;
public float FScale=1.0f;
public float FurTenacity=1.0f;
private GameObject[] layers;
private Material mat;
// Start is called before the first frame update
void Start()
{
CreateFur();
mat=Target.gameObject.GetComponent<Renderer>().materials[matNum];
}
// Update is called once per frame
void Update()
{
UpadteTransform();
UpdateValue();
}
//更新每层毛发的位置
void UpadteTransform()
{
if (layers == null || layers.Length == 0)
{
return;
}
for (int i = 0; i < layers.Length; i++)
{
//依据层数、毛发长度和毛发硬度计算lerp速度
float lerpSpeed = (layers.Length-i) * (1.0f / layers.Length)* FurTenacity;
//让Shell的位置和旋转Lerp到目标模型
//后面乘的常数完全是试出来的参数……没有具体物理解释,移动时毛发更新
layers[i].gameObject.transform.position = Vector3.Lerp(layers[i].gameObject.transform.position, Target.transform.position, lerpSpeed * Time.deltaTime *20);
layers[i].gameObject.transform.rotation = Quaternion.Lerp(layers[i].gameObject.transform.rotation, Target.transform.rotation, lerpSpeed * Time.deltaTime *10);
}
}
//创建毛发
void CreateFur()
{
layers = new GameObject[LayerCount];
float furOffset = 1.0f / LayerCount;
for (int i = 0; i < LayerCount; i++)
{
GameObject layer = Instantiate(Target.gameObject, Target.transform.position, Target.transform.rotation,this.transform);
//layer.hideFlags = HideFlags.HideInHierarchy;
//layer.tag = "Shell";
Material[] mats = layer.GetComponent<Renderer>().materials;
mats[matNum]=new Material(BaseShader);
layer.GetComponent<Renderer>().materials =mats;
Material layerMat = layer.GetComponent<Renderer>().materials[matNum];
//for (int j = 0; j < layerMats.Length; j++)
// {
//Material layerMat = layerMats[i];
layerMat.SetTexture("_MainTex",MainTex);
layerMat.SetColor("_Color",FurColor);
layerMat.SetFloat("_SpPow",SpPow);
layerMat.SetFloat("_SpScale",SpScale);
layerMat.SetFloat("_FPow",FPow);
layerMat.SetFloat("_FScale",FScale);
layerMat.SetFloat("_FurLength",FurLength);
layerMat.SetTexture("_Noise",Noise);
layerMat.SetTexture("_Noise2",Noise2);
layerMat.SetTexture("_Mask",Mask);
layerMat.SetTexture("_ValueMask",ValueMask);
layerMat.SetColor("_ShadowColor",ShadowColor);
layerMat.SetFloat("_ShadowPow",ShadowPow);
layerMat.SetFloat("_LayerOffset",i*furOffset);
layerMat.SetVector("_FurOffset",FurFore*Mathf.Pow(i*furOffset,FurTenacity)*0.0f);
layerMat.renderQueue = 3000 + i;
//}
//layer.transform.parent = Target.transform;
layers[i] = layer;
}
//Debug.Log("创建完毕");
}
void UpdateValue()
{
for (int i = 0; i < layers.Length; i++)
{
Material layerMat = layers[i].GetComponent<Renderer>().materials[matNum];
layerMat.SetFloat("_Value",TValue);
mat.SetFloat("_TValue",TValue);
//mat.SetFloat("_GValue",GValue);
}
}
//删除创建的游戏毛发
private void OnDestroy()
{
// if (layers == null || layers.length == 0)
// {
// return;
// }
//
// for (int i = 0; i < layers.length; i++)
// {
// destroy(layers[i].gameobject);
// }
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 9e31f7b6160cbed41851ac4f758706c8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -26905,7 +26905,8 @@ PrefabInstance:
propertyPath: m_IsActive propertyPath: m_IsActive
value: 0 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents:
- {fileID: 2999783213077156870, guid: e1761819aac3ed74682aa8337a23d32e, type: 3}
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: [] m_AddedGameObjects: []
m_AddedComponents: m_AddedComponents:

View File

@ -78,10 +78,10 @@ AnimationClip:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: TValue attribute: material._TValue
path: path: Qvan2
classID: 114 classID: 23
script: {fileID: 11500000, guid: 9e31f7b6160cbed41851ac4f758706c8, type: 3} script: {fileID: 0}
flags: 0 flags: 0
m_PPtrCurves: [] m_PPtrCurves: []
m_SampleRate: 24 m_SampleRate: 24
@ -174,10 +174,10 @@ AnimationClip:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: TValue attribute: material._TValue
path: path: Qvan2
classID: 114 classID: 23
script: {fileID: 11500000, guid: 9e31f7b6160cbed41851ac4f758706c8, type: 3} script: {fileID: 0}
flags: 0 flags: 0
m_EulerEditorCurves: [] m_EulerEditorCurves: []
m_HasGenericRootTransform: 0 m_HasGenericRootTransform: 0