重走大神之路_ 乐乐姐_推荐阅读_ 卡通化
乐乐姐几乎每个章节都推荐书或资料一些高大上的英文书,例如:Artistic rendering and cartoon animation
我是不会去看的
原因是,她还推荐了:《GNU1~7》
我更是不会去看
这几本书我可以说当年在旧图书馆都看过,都看过第一章,新馆建成并投入多年了,你可以想象这几本书是有多老(老是有人借,并不很封尘),首先是这些书太旧了,然后就是工作中根本不会用到,当然大神推荐,我也不好说什么,之前浅墨,毛星云也推荐,所以理论上,应该确实是好书,不信邪的可以去看看。
如果让我推荐C#书,我是不会向我以前的上司那样去推荐《。Net红宝书》的,初高级2册,因为这个红宝书C++也出,数据库也出,你怎么能保证他们写的质量一致,又各有特色各自出彩呢,《GNU1~7》可是出了7册啊,估计还能出11~12册,而每本书几百页,含有无数个毫无相关的论文,事实是就是真的不如做中学(前提是你有很多的理论基础,大量的编程工作,就在质变到量变的前一刻),在做中学突破自己是最好的方法,也也和入门与否没有关系,就算你刚入门,看红宝书也不会让你比较入门,工作中也不会用到。当然做中学,有个很大的不好,会很多人懂得写两个语法就以为自己掌握了全宇宙
我还是觉得,能练僻邪剑法的,还会去耍青城大众脸剑法么、???
乐乐姐的推荐,其实就剩下插件了:Toony Cartoon Shader
这个就比较对我的胃口,但还是因人而异吧,哪个方向适合自己就坚持走下去吧,保持前行才是到达目的地的唯一方法
卡通化渲染就两个东西(大家都这么说)
描边 - Outline
渐变色彩 - Ramp
关于描边有太多描述和作品了,也有很多人觉得很简单,特别是那些大厂的主城
瞬间觉得,国外的月亮就是特别圆
其实原理是一样的,这个插件有很多个Shader,可关键就一个,而且很多实现真的很LOW
再多说一点吧,很多国外的东西都很好,规范的东西也值得学习,但是:
1.不符合国情,国内一个部位对一个Shader的做法反而更直接,更好
2.英文,我估计,90后00后反而不重视英文了,不懂
3.过时,国内0.5天都嫌花费时间多,这个插件还是7年前的
4.攀比,非得我的比你强,比你快,比你好,还比你钱多,世上真有这样的好事??
5.多余,右下声明说模型官方的,左下告诉你可以用鼠标,左边是旋转等控制,右边是各项细节控制,核心就一个
6.Surface Shader,在国内这么多年都没流行开来
7.范围太广,很难掌握,国内涉及的范围和技术目前太深太广了,老板太傻,大厂太多,现在对于那些还吐槽国内游戏的,或者问为什么的,我都懒得回怼(3A公司在国内还没出现,但只是果而已,或者也永远不会出现,但这不会阻止我们在一堆小白老板和各种质疑声中去创造因,种最好的因,其他管他呢)
shader扩展的关键
这个Cartoon 插件的关键只有一个:
UsePass "Hidden/ToonyColors-Outline/OUTLINE"
[*]这个方法需要写在Pass{} 外,否则会提示“psss token_USEPass XXXX”,大概意思就是不输入Pass内的语法
[*]外部調用的Pass需要用 Pass { Name 聲明
模拟写了个简单的:
OutLine:
Shader "ORGEDashu/SimpleTexture"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Outline("描边宽度",Float) = 1
_OutlineColor("描边颜色",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#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
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
UsePass "ORGEDashu/Sample/OutlinePro/OUTLINE"
}
}
Shader "ORGEDashu/Sample/OutlinePro"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Outline("描边宽度",Float) = 1
_OutlineColor("描边颜色",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
//Outline default
Pass
{
Name "OUTLINE"
Cull Front
Lighting Off
// ZWrite Off
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#define SMOOTH_Z_ARTEFACTS
#define OUTLINE_CONST_SIZE
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : POSITION;
};
float _Outline;
//sampler2D _MainTex;
fixed4 _OutlineColor;
//float4 _MainTex_ST;
v2f vert(a2v v)
{
v2f o;
_Outline *= 0.1f;//乘以0.1 在属性面板拖动容易点
#ifdef SMOOTH_Z_ARTEFACTS
//Correct Z artefacts
float4 pos = mul(UNITY_MATRIX_MV, v.vertex);
float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
normal.z = -0.6;
//Camera-independent size
#ifdef OUTLINE_CONST_SIZE
//想要搞清楚这个公式 应该要搞清楚物件-》镜头的转换
float dist = distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, v.vertex));
pos = pos + float4(normalize(normal),0) * _Outline * dist * 1.0;
#else
pos = pos + float4(normalize(normal),0) * _Outline;
#endif
#else
#ifdef OUTLINE_CONST_SIZE
float dist = distance(_WorldSpaceCameraPos, mul(unity_ObjectToWorld, v.vertex));
float4 pos = mul(UNITY_MATRIX_MV, v.vertex + float4(v.normal,0) * _Outline * dist * 1.0);
#else
float4 pos = mul(UNITY_MATRIX_MV, v.vertex + float4(v.normal,0) * _Outline );
#endif
#endif
o.pos = mul(UNITY_MATRIX_P, pos);
return o;
}
float4 frag(v2f IN) : COLOR
{
return _OutlineColor;
}
ENDCG
}
}
}OutLine的重点是:
这种Outline实现方法,模型过度圆滑效果比较好,对于棱角就很糟心了,你懂的,国内乱七八糟的环境,还要吐槽别人造成的乱七八糟,难道你不是环境中的一份子么,你有更好的办法吗,乱世出英雄哦
Ramp
有见过颜色渐变的博文,如果是光的渐变,就是黑白渐变了,素材:
。。,有点什么都看不到,截图:
Shader "Unity Shader Book/Chapter 7/RampTexture"
{
Properties
{
_Diffuse("Diffuse", Color) = (1, 1, 1, 1)
_RampTex("Ramp Tex", 2D) = "white"{}
_Specular("Specular", Color) = (1, 1, 1, 1)
_Gloss("Gloss", Range(8, 256)) = 20
}
SubShader
{
Pass
{
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD2;
};
fixed4 _Diffuse;
sampler2D _RampTex;
float4 _RampTex_ST;
fixed4 _Specular;
float _Gloss;
v2f vert (a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed halfLambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;
fixed3 diffuseColor = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).rgb * _Diffuse.rgb;
fixed3 diffuse = _LightColor0.rgb * diffuseColor;
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
fixed3 halfDir = normalize(worldLightDir + viewDir);
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);
return fixed4(ambient + diffuse + specular, 1);
}
ENDCG
}
}
Fallback "Diffuse"
}Ramp重点是:
Color和光照傻傻分不清,反而更复杂
见过纯 Ramp Color,网上文章也很多
关键是多读书,多和美术沟通
EyeLashes
这个卡通渲染插件中,还发现,无论你怎么调整,都没什么作用滴,感受一下
EyeLashes重点是:
*实现很“简单”,就是Transparent, Diffuse,
*但是,我们这种理工狗是不可能分清楚5号和7号口红的区别,还是放弃吧
*远看是没什么卵用的
*还必须,通过uv或者ShinMeshRender 配合
页:
[1]