游戏中实时皮肤渲染第二弹
2017-11-03 15:29
1366 查看
继上次渲染的皮肤之后,这次再写一篇可在游戏中应用的shader。
先上效果图(PS:游戏中的效果会比截图更好)。
、
这个shader主要用了以下几张贴图,皮肤贴图,法线贴图,AO贴图(g通道存储的在人脸越薄的地方值越大,例如耳朵,鼻子),曲率图。
shader面板如下:
接下来介绍主要部分代码:
光照衰减部分:
漫反射部分:
主要是曲率图的采样和环境光的一个相加值。
曲率如何计算,我在之前已经介绍过了,曲率的计算。
高光部分和常规一样:
散射部分:
其中_Lux_Skin_DeepSubsurface中的y存储的是一个对法线进行扭曲操作,x存储是对能量衰减的一个控制变量,z对效果的一个控制。
最后,计算AO
先上效果图(PS:游戏中的效果会比截图更好)。
、
这个shader主要用了以下几张贴图,皮肤贴图,法线贴图,AO贴图(g通道存储的在人脸越薄的地方值越大,例如耳朵,鼻子),曲率图。
shader面板如下:
接下来介绍主要部分代码:
光照衰减部分:
float attenuation = LIGHT_ATTENUATION(i); float3 attenColor = attenuation * _LightColor0.xyz;
漫反射部分:
主要是曲率图的采样和环境光的一个相加值。
float4 _MainTex_var = tex2D(_MainTex,TRANSFORM_TEX(i.uv0, _MainTex)); float NdotL = max(0.0,dot( normalDirection, lightDirection )); float3 directDiffuse = BentNormalsDiffuseLighting(normalDirection, lightDirection, Curvature, NdotL) ; float3 indirectDiffuse = float3(0,0,0); indirectDiffuse += UNITY_LIGHTMODEL_AMBIENT.rgb; // Ambient Light float3 diffuseColor = (_Color.rgb*_MainTex_var.rgb); float3 diffuse = (directDiffuse* attenColor + indirectDiffuse) * diffuseColor;曲率图的采样方法如下:
half3 BentNormalsDiffuseLighting(float3 normal, float3 L, float Curvature, float nl) { float NdotLBlurredUnclamped = dot(normal, L); half3 diffuseLookUp = tex2Dlod(_LookUp, float4((NdotLBlurredUnclamped * 0.5 + 0.5), Curvature, 0, 0)); return diffuseLookUp; }
曲率如何计算,我在之前已经介绍过了,曲率的计算。
高光部分和常规一样:
float3 H = normalize(lightDirection + viewDirection); float LdotH = saturate(dot(lightDirection, H)); float NdotH = saturate(dot(normalDirection, H)); float specularTerm = pow(NdotH, exp2(lerp(1, 11, _Smoothness)));
散射部分:
half3 transLightDir = lightDirection + normalDirection * _Lux_Skin_DeepSubsurface.y; half transDot = dot(-transLightDir, viewDirection); transDot = exp2((saturate(transDot)-1) * _Lux_Skin_DeepSubsurface.x) * _Translucency_var.g * _Lux_Skin_DeepSubsurface.z; half3 lightScattering = transDot * _SubColor * attenColor;
其中_Lux_Skin_DeepSubsurface中的y存储的是一个对法线进行扭曲操作,x存储是对能量衰减的一个控制变量,z对效果的一个控制。
最后,计算AO
float3 finalColor = diffuse+ specularTerm*attenColor* FresnelTerm(_SpecColor, LdotH) + lightScattering; finalColor *= _Translucency_var.a;
相关文章推荐
- 游戏中人体皮肤实时渲染第一弹
- 游戏中的角色渲染技术之皮肤篇
- Unity之实时渲染场景中的游戏对象
- 游戏实时渲染中HDR入门介绍
- 皮肤的实时3S渲染(OpenGL + GLSL)
- 实时皮肤SSS效果渲染Demo
- 游戏中实时的天气模拟和渲染
- 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染
- 真实实时皮肤渲染
- 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染
- 游戏中的角色渲染技术之皮肤篇
- 实时皮肤SSS效果渲染Demo的改进
- 为什么Unreal 4引擎能轻易实时渲染出vray要花半天才能渲染出的场景
- 实时动作游戏同步方式和传输协议选择
- 植物叶子的实时渲染
- atitit ui引擎之道 游戏引擎之道.docx 1. 概念 2 1.1. (cocos,createjs,dom) 2 2. 游戏引擎的构成(图形引擎(渲染系统),控件部件系统,事件系统 ,布局
- 游戏中基于物理的渲染(五)完结篇
- [实时渲染] 2.3 几何处理阶段
- 多种方式开启StoryBoard的实时渲染(控制圆角和边框)
- unity3d Hair real time rendering 真实头发实时渲染