COS_头发渲染shader

本文介绍了作者在Unity中实现头发渲染Shader的过程,重点探讨了高光反射和软化边缘的技术。通过参考Unity官方教程,结合伽马渲染,逐步调整参数并试验不同部分的功能。虽然代码仍存在混乱和不完善的地方,如阴影接受部分未完成,但已实现了明显的高光层次和透明边缘的软化效果。

好久没更了。苦战一周,总算捅咕出点能看的了,赶紧总结,免得以后忘了~~代码还是有点乱套,关于最主要的饿地方,切线空间还是有点蒙圈,得抓紧补基础渲染,底层的东西,要不真的让人头大,废话少说,入正题:

这次是参考unity官网的铁匠的头发shader的高光反射部分,和unity的软化边缘的部分。因为是Gama渲染,好多参数都是用If判断的,小白~看不懂。。。只能一个一个试,看看运行的是哪部分,提取出来,修改,和自己的代码融合。

小爆一下弊端,关于接受阴影的部分还没编写,(有点写不下去了,以后来补坑吧)。

 

 

^ 夸张颜色之后的为了更好体现三层高光,X控制主要高光颜色强度和范围,Y控制次高光,Z控制高光贴图的强度。

用flowmap打乱了一下,在加上法线本身的打乱,在加上OCC贴图,再加上高光贴图本身就是断断续续的,模拟出头发一丝一丝 的高光反射。

^软化边缘的效果,因为透明的渲染深度写入的问题。。一共用了3个Pass,来实现这种软化边缘的效果

第一个pass:开启深度写入的透明通道剔除

第二个pass:加阴影

第三个pass:透明的渲染,不过用的是clip(-(col.a-cutoff)),用来和第一个pass打配合~

(前面说过了,代码并不“完整”,有待狠狠的改善,这里没有base和add部分,还有很多浪费的资源)

 

原谅还不太会复用拆分,并且。。脑子有点反应不过来,全堆一页里面啦,(哈哈,坑慢慢填,以后再说吧)

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "ABigDeal/softHair"
{

		Properties{
			_Color("Texture 1 Color", Color) = (1, 1, 1, 1)
			_Cutoff("Base Alpha cutoff", Range(0,.9)) = .5
		//	_Blend("Blend", Range(0, 1)) = 0

			_Texture1("Texture 1", 2D) = ""
			//_ColorA("Texture 1 Color", Color) = (1, 1, 1, 1)

		//	_Texture2("Texture 2", 2D) = ""
			//_ColorB("Texture 2 Color", Color) = (1, 1, 1, 1)

			_Normal("Normal Map", 2D) = "bump" {}
			_NormalScale("Normal Scale", Float) = 1.0

			_SpecGlossMap("Specular", 2D) = "white" {}
			_Specular("Specular",Color)=(1,1,1,1)
			_Gloss("Gloss",Range(0,1))=20
				
			_OcclusionMap("OcclusionMap", 2D) = "white" {}

		

////////////////////////////       KK           //////////////////////////////////////////
		_KKFlowMap("FlowMap", 2D) = "white" {}
		//反射平滑
		_KKSmoot("Reflective Smoothness", Range(0.0, 1.0)) = 0.5
		//反射最大值
		_KKScale("Reflective Gray Scale", Range(0.0, 48.0)) = 5.0
		//主高光颜色
		_KKColorA("Primary Specular Color", Color) = (1.0, 1.0, 1.0)	
		//主高光指数(程度)
		_KKScaleA("Primary Exponent", Range(1.0, 192.0)) = 64.0
		//主根位置
		_KKShiftA("Primary Root Shift", Range(-20.0, 20.0)) = 0.275
		//次高光颜色
		_KKColorB("Secondary Specular Color", Color) = (1.0, 1.0, 1.0)	
		//次高光指数
		_KKScaleB("Secondary Exponent", Range(1.0, 192.0)) = 48.0
		//次根位置
		_KKShiftB("Secondary Root Shift", Range(-1.0, 1.0)) = -0.040
		//直接因素
		_KKA("Spec Mix Direct Factors", Vector) = (0.15, 0.10, 0.05, 0)
		//间接因素
		_KKB("Spec Mix Indirect Factors", Vector) = (0.75, 0.60, 0.15, 0)
				

		}

		SubShader{
			Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
			//Lighting off
			// Render both front and back facing polygons.
			Cull Off
/////////////////////////////////////////////
头发各向异性渲染Shader 这个是04年的一个ppt,主要介绍了头发渲染,其追到源头还是要看这个原理。 各向异性的主要计算公式: 主要代码如下: 切线混合扰动部分(这部分也可以用T+k*N,来对切线进行扰动): float3x3 tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir); float3 _T_var = UnpackNormal(tex2D(_Tangent, TRANSFORM_TEX(i.uv0, _Tangent))); float3 temp = lerp(_TangentParam.xyz, _T_var, _BlenfTangent); float3 T = normalize(mul(float3(temp.xy,0), tangentTransform)); 主要是通过改变切线的xy值来造成头发高光部分的多样性。 高光部分,按公式计算即可: float StrandSpecular(float3 T, float3 V, float3 L, float exponent) { float3 H = normalize(L + V); float dotTH = dot(T, H); float sinTH = sqrt(1 - dotTH*dotTH); float dirAtten = smoothstep(-1, 0, dotTH); return dirAtten*pow(sinTH, exponent); } 注意,为了模拟的更贴近真实性,应用两层高光,第一层高光代表直射光直接反射出去,第二层代表次表面散射现象具体看代码。 最终渲染部分: float4 HairLighting(float3 T, float3 N, float3 L, float3 V, float2 uv, float3 lightColor) { float diffuse = saturate(lerp(0.25, 1.0, dot(N, L)))*lightColor; float3 indirectDiffuse = float3(0, 0, 0); indirectDiffuse += UNITY_LIGHTMODEL_AMBIENT.rgb; // Ambient Light float3 H = normalize(L + V); float LdotH = saturate(dot(L, H)); float3 specular = _Specular*StrandSpecular(T, V, L, exp2(lerp(1, 11, _Gloss))); //float specMask = tex2D(_SpecMask, TRANSFORM_TEX(uv, _SpecMask)); specular += /*specMask*/_SubColor*StrandSpecular(T, V, L, exp2(lerp(1, 11, _ScatterFactor))); float4 final; float4 base = tex2D(_MainTex, TRANSFORM_TEX(uv, _MainTex)); float3 diffuseColor = (_Color.rgb*base.rgb); //float ao = tex2D(_AO, TRANSFORM_TEX(uv, _AO)).g; final.rgb = (diffuse + indirectDiffuse)*diffuseColor + specular*lightColor* FresnelTerm(_Specular, LdotH); //final.rgb *= ao; final.a = base.a; clip(final.a - _CutOff); return final; } 这里我注释掉了AO和高光遮罩,需要的同学可以加上。 最后一点为了不让头发的边经过clip之后太硬,需要进行两个通道的belnd。 第二个pass使用以下指令: Blend SrcAlpha OneMinusSrcAlpha ZWrite Off 注意第二个通道无需再进行clip操作。 至此,头发渲染完毕。
<think>好的,我需要处理用户关于Unity真实头发着色器教程或资源的请求。首先,用户之前可能已经询问过相关主题,但根据当前对话历史,用户现在明确需要教程或资源。我需要确保回答结构清晰,符合用户的需求,同时遵守系统级指令,比如正确使用LaTeX格式和添加相关引用。首先,我应该回忆Unity中常用的头发着色技术,比如HDRP的Hair MasterNode,这是Unity官方提供的资源,可能已经有相关文档。然后,用户可能需要分步实现的教程,比如从创建ShaderGraph开始,调整高光、颜色渐变等。此外,第三方资源如Asset Store中的插件也是重要部分,比如HairFX或者Luxuriant,这些资源可能提供更便捷的实现方式。接下来,我需要检查是否有相关的站内引用。根据提供的引用[^1],HDRP内置了Hair MasterNode,用于头发、眼睛和布料。这可以用来支持推荐使用HDRP的ShaderGraph的建议。因此,在回答中需要引用这一点。然后,生成相关问题,应该围绕用户的需求展开,比如优化方法、与渲染管线的兼容性、第三方插件的比较等。确保问题与主题紧密相关,帮助用户进一步探索。 需要确保所有数学表达式正确使用$...$格式,例如在提到颜色混合时,如果有公式,要正确书写。但当前问题可能不涉及太多数学公式,所以可能不需要太多LaTeX,但如果有技术术语或参数名称,要保持正确。 最后,整理回答结构,分点列出官方资源、分步教程、第三方插件和社区资源,每个部分简明扼要,并添加引用到合适的位置。确保语言流畅,使用中文,避免任何Markdown格式,除了代码块用三个反引号包裹。</think>在Unity中实现真实头发效果通常需要结合Shader编程、材质参数调整和光照模型。以下是最新且实用的资源和方法: ### 一、官方解决方案 1. **HDRP Hair Master Node** 使用HDRP内置的头发着色器节点,支持各向异性高光和多层透明度控制[^1]: ```ShaderGraph HDRP > Create Shader > Hair ``` 可调整参数包括:`Hair Strand Direction`、`Secondary Specular Occlusion`、`Transmission Intensity` 2. **Unity官方案例** 在《Digital Human》项目中演示了头发纤维的次表面散射实现: $$I_{transmission} = \frac{1}{\pi} \int_{0}^{2\pi} \cos\theta \cdot e^{-\sigma_t d} d\theta$$ ### 二、分步实现教程 1. **基础头发着色器** - 创建各向异性高光:`SpecularAA`节点控制高光方向 - 添加颜色渐变:使用`Gradient Noise`模拟发丝色素变化 - 深度剥离:通过`Depth Prepass`解决透明排序问题 2. **动态效果增强** - 在Shader中集成`Wind Zone`参数: ```hlsl float3 windOffset = _WindSpeed * sin(_Time.y + vertexWorldPos.x); ``` ### 三、第三方资源推荐 1. **Asset Store插件** - [HairFX](https://assetstore.unity.com/packages/tools/animation/hairfx-117738):支持发丝物理模拟 - [Luxuriant](https://assetstore.unity.com/packages/3d/characters/luxuriant-lite-vegetation-16717):包含写实头发材质库 2. **GitHub项目** - [Unity Strand-Based Hair](https://github.com/keijiro/StrandedHair):基于发束的实时渲染方案
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值