UnityShader水墨渲染的尝试

  • 描边
  • 混合纹理

先上一张原图,模型素材之类的可以在这里
下载

描边

使用最基本的dot(n,v)来计算边缘,根据需要给控制项,这里我使用了pow来使明暗对比更强烈,又除以一个值调整过渡。

half nv = max(saturate(dot(bump, viewDir)),0.0001);
//这里用除法调节起来比较好控制
fixed outline = pow(nv, _Pow)/_Range;
outline = outline > _Outline ? 1 : outline;

但是感觉晕染的效果丢失了,因此做了修改:

fixed outline = pow(nv, _Pow)/ _Range;
//边缘拿出来单独调节
fixed edge = outline > _Outline ? 1 : 0;
outline = outline * edge;

混合纹理

随便找张水墨的纹理图

只是单纯的输出采样贴图

float4 featuretex = tex2D(_FeatureTex,i.uv.xy).rgba;


和上面的描边结果混合


把原来的贴图也混合进去,在此之前先对原贴图处理,为了能和feature融合的自然一点:

float4 albedo = tex2D(_MainTex,i.uv.xy).rgba;
//brigtness亮度
fixed3 finalColor = albedo * _Brightness;
//saturation饱和度:首先根据公式计算同等亮度情况下饱和度最低的值:
fixed gray = 0.2125 * albedo.r + 0.7154 * albedo.g + 0.0721 * albedo.b;
fixed3 grayColor = fixed3(gray, gray, gray);
//根据Saturation在饱和度最低的图像和原图之间差值
finalColor = lerp(grayColor, finalColor, _Saturation);
//contrast对比度:首先计算对比度最低的值
fixed3 avgColor = fixed3(0.5, 0.5, 0.5);
//根据Contrast在对比度最低的图像和原图之间差值
finalColor = lerp(avgColor, finalColor, _Contrast);//混合feature
fixed3 blend = finalColor < feature ? feature: finalColor;
//F只是想加强边缘的效果
fixed F = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(viewDir, bump), 5);
blend = blend*(1-F);
return fixed4(blend,1);

调节各项参数:

还是有很多不足的地方,护腕和肩膀都没什么细节,描边也不够细致,水墨的纹理也可以多尝试一下找到更合适的。 水墨画最重要的是线条,留白,晕染,后面会再研究一下描边。用在别的模型上试试 :


模型整体还是太过于西式了。 shader写起来不难,主要是练习了一下各种混合模式,这里
有PS混合的各种计算公式。
最后放上代码:

Shader "Unlit/ShuiMo"
{Properties {    _Outline("Outline",Range(0,1)) = 0.5_Range("Range" , Range(0,10)) = 0.1      _Pow("Pow",Range(0,10))=1_FresnelScale("FresnelScale",Range(-10,10)) = 0.5_Brightness("Brightness", Float) = 1 _Saturation("Saturation", Float) = 1 _Contrast("Contrast", Float) = 1_MainTex ("MainTexture", 2D) = "white" {}_MainNormalTex ("NormalTex", 2D) = "white" {}_BumpScale ("Bump Scale", Float) = 1.0_FeatureTex("FeatureTex",2D) = "white" {}}SubShader {Tags{"RenderType"="Opaque"}Pass {Tags { "LightMode"="ForwardBase"}CGPROGRAM#pragma target 3.0#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "Lighting.cginc"float _Outline;float _Pow;float _Range;half _Brightness;half _Saturation;half _Contrast;half _FresnelScale;sampler2D _FeatureTex;sampler2D _MainTex;float4 _MainTex_ST;sampler2D _MainNormalTex;half _BumpScale;float4 _MainNormalTex_ST;struct v2f{float4 pos : SV_POSITION;float4 uv : TEXCOORD0;  float4 T2W0 :TEXCOORD1;float4 T2W1 :TEXCOORD2;float4 T2W2 :TEXCOORD3;};v2f vert(appdata_full v){v2f o;              o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);o.uv.zw = TRANSFORM_TEX(v.texcoord,_MainNormalTex);float3 worldPos = mul(unity_ObjectToWorld,v.vertex);float3 worldNormal = UnityObjectToWorldNormal(v.normal);float3 worldTangent = UnityObjectToWorldDir(v.tangent);float3 worldBitangent = cross(worldNormal ,worldTangent) * v.tangent.w;o.T2W0 = float4 (worldTangent.x,worldBitangent.x,worldNormal.x,worldPos .x);o.T2W1 = float4 (worldTangent.y,worldBitangent.y,worldNormal.y,worldPos .y);o.T2W2 = float4 (worldTangent.z,worldBitangent.z,worldNormal.z,worldPos .z);return o;}half4 frag(v2f i) : SV_Target{float4 albedo = tex2D(_MainTex,i.uv.xy).rgba;fixed3 finalColor = albedo * _Brightness;fixed gray = 0.2125 * albedo.r + 0.7154 * albedo.g + 0.0721 * albedo.b;fixed3 grayColor = fixed3(gray, gray, gray);finalColor = lerp(grayColor, finalColor, _Saturation);fixed3 avgColor = fixed3(0.5, 0.5, 0.5);finalColor = lerp(avgColor, finalColor, _Contrast);float3 worldPos  = float3(i.T2W0.w,i.T2W1.w,i.T2W2.w);fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));    fixed3 bump = UnpackNormal(tex2D(_MainNormalTex,i.uv.zw));bump.xy *= _BumpScale;bump.z = sqrt(1.0 - saturate(dot(bump.xy, bump.xy)));bump = normalize(half3( dot(i.T2W0.xyz,bump),dot(i.T2W1.xyz,bump),dot(i.T2W2.xyz,bump)));half nv = max(saturate(dot(bump, viewDir)),0.0001);fixed outline = pow(nv, _Pow)/ _Range;   fixed edge = outline > _Outline ? 1 : 0;            outline = saturate(outline * edge);float4 featuretex = tex2D(_FeatureTex,i.uv.xy).rgba;outline = saturate(fixed4(outline, outline, outline, outline));float4 feature = outline * featuretex;fixed3 blend = finalColor < feature ? feature: finalColor;fixed F = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(viewDir, bump), 5);blend = blend*(1-F);return fixed4(blend,1);}ENDCG}}FallBack "Diffuse"
}

UnityShader水墨渲染的尝试相关推荐

  1. UnityShader水体渲染

    水体渲染 简单水体 贴图+UV动画 使用一张噪声纹理,采样结果作为UV的偏移值,从而模拟水流动的效果 // sample the texture fixed4 noise_col = tex2D(_N ...

  2. 预渲染 prerender-spa-plugin 尝试

    背景:想给项目做一些优化,想尝试预渲染和SSR 这里说一下SSR 使用的技术栈是VUE 预渲染使用的是 prerender-spa-plugin 这个包 先说一下效果吧 这个感觉就是类似高级的骨架屏, ...

  3. UnityShader RenderTypeQueue 渲染顺序

    整理自这两篇博文 https://blog.csdn.net/u013477973/article/details/80607989?depth_1-utm_source=distribute.pc_ ...

  4. UnityShader崩坏渲染解析系列(3)--高光、Dither效果、Rim、特殊状态

    身体渲染 高光 Dither效果 Rim 特殊状态 小结 高光 前面介绍了暗面的计算方式,接下来是高光的计算效果.高光计算比较简单,采用了Blinn-Phong的光照模型,明暗计算的时候采用了lamb ...

  5. 虚幻引擎_材质+后处理实现中国风水墨渲染

    一.水墨风格解析 首先对想要达成的效果进行拆解. 材料: 传统中国画以毛笔.水墨.植物性和矿物性颜料.绢.帛.宣纸为工具材料. 表现主题: 中国画总体上追求神韵和气韵的表现. 造型不拘泥于外形的肖似, ...

  6. UnityShader崩坏渲染解析系列(2)--明暗计算

    身体渲染 什么是明暗 处理明暗 崩坏处理 资源解析 总结 什么是明暗 与实时渲染不一样的地方在于,日式卡通渲染阴影过度有明显的分界线. 没错,左边的明暗变化有一条很明显的交界线,而右边的是有过渡效果的 ...

  7. Unity3D-实现水墨渲染效果

    原文:http://gad.qq.com/user/myarticle?id=438905

  8. 模型终于来了,水墨渲染新效果。

    目前就等大规模场景资源到位了,看来程序上基本已经不需要过多的修缮了.

  9. 【Unity 风格化】水墨风渲染01:从总结实现方法开始

    写在前面 一直比较迷风格化的东西,之前写PBR其实也是为了后面尝试PBR+NRP做铺垫,毕竟了解写实向才能进一步学习奇奇怪怪的NPR方式!话不多说,从水墨渲染开始,正式进入风格化的世界!! 无论是什么 ...

最新文章

  1. linux系统下的oracle数据库,在Linux系统下安装Oracle数据库
  2. 青龙羊毛——宝石星球(教程)
  3. MongonDB 知识
  4. C++二叉树的建立与遍历
  5. office老是提示Microsoft office word 遇到问题需要关闭,问是否发送错误报告
  6. 服务器显示rl112,【RL-TCPnet网络教程】第13章 RL-TCPnet之TCP服务器(下)
  7. (转)记录一次迁移 wss WebSocket 的事故
  8. Apache 配置域名入口路径
  9. 所以Apache基金会不受美国法律约束?
  10. Express 极速掌握
  11. 【机器学习】Andrew Ng——05Octave
  12. 伺服电机的调试步骤有哪些
  13. 查找python关键字
  14. BlackBerry7290软件安装——电子书阅读Mobipocket
  15. Unhandled rejection Error: EACCES: permission denied, open '/Users
  16. 程序员的自我修养有哪些途径
  17. icloud连接服务器时出现问题_icloud连接服务器失败怎么办-互盾苹果恢复精灵
  18. 【ThreeJS基础教程-初识Threejs】1.2掌控我们的物体和模型
  19. acm测试题目数据生成
  20. 华为高性能服务器实验室,1000平米全球唯一!华为神秘实验室首公开

热门文章

  1. aspf ftp_FTP主动模式和被动模式
  2. Java简单雷电游戏代码
  3. MySQL 幻读和不可重复读的区别
  4. Java学习_Day 10(学习内容:尚硅谷集合JAVA零基础P523-P533)
  5. 用户体验研究方法选择的一些原则
  6. java 第三方登录之QQ登录
  7. sql面试题(学生表_课程表_成绩表_教师表)
  8. 用js做购物界面的常用效果
  9. 【案例】如何让阀门制造提高排产效率?APS系统帮你实现
  10. 【目标跟踪】帧差法结合卡尔曼滤波行人姿态识别【含GUI Matlab源码 1127期】