和Keyle一起学ShaderForge - Overview
学Shader是不是很枯燥?
如果你和我一样觉得用手写shader这种已经OUT的学习方式来学习Shader,那就和我一起一个换个角度来从ShaderForge学起吧。
我后面的教程路线是这样的 SharderForge学习中穿插《unity shader and effects cookbook》一书中的概念与实践。
欢迎你和我一起探讨这个话题,这是关于一个程序猿如何去学习的方法论。
Email: keyle_xiao@hotmail.com QQ群: 137728654 StrangeIOC
1.Shader在游戏中的运用如图,我们创建了一个Shaer将其赋予一个Material(材质),然后将一些Texture(贴图)赋予这个材质上的对应Shader(在这个Shader内部对贴图与光照等因素做调整),最终将Material赋予对应的游戏物体,呈现出我们看到样子,这是我们对Shader应用最直观的认识
2.Shader示例
这是一个最简陋的Unity ShaderLab
Shader "MyShader" { Properties { _MyTexture ("My Texture", 2D) = "white" { } // other properties like colors or vectors go here as well } SubShader { // here goes the 'meat' of your // - surface shader or // - vertex and fragment shader or // - fixed function shader } SubShader { // here goes a simpler version of the SubShader above that // can run on older graphics cards } }
这里我推荐阅读下 李剑英的 剑英陪你玩转图形学 系列博文
3.使用ShaderForge创建一个Shader
创建一个基本Shader,点击Complie进行语法检查
生成Shader文件如下,红色底的是ShaderForge的配置信息可以忽略,或是在Shader写完之后删掉
// Shader created with Shader Forge Beta 0.36 // Shader Forge (c) Joachim Holmer - http://www.acegikmo.com/shaderforge/ // Note: Manually altering this data may prevent you from opening it in Shader Forge /*SF_DATA;ver:0.36;sub:START;pass:START;ps:flbk:,lico:1,lgpr:1,nrmq:1,limd:1,uamb:True,mssp:True,lmpd:False,lprd:False,enco:False,frtr:True,vitr:True,dbil:False,rmgx:True,rpth:0,hqsc:True,hqlp:False,tesm:0,blpr:0,bsrc:0,bdst:0,culm:0,dpts:2,wrdp:True,ufog:True,aust:True,igpj:False,qofs:0,qpre:1,rntp:1,fgom:False,fgoc:False,fgod:False,fgor:False,fgmd:0,fgcr:0.5,fgcg:0.5,fgcb:0.5,fgca:1,fgde:0.01,fgrn:0,fgrf:300,ofsf:0,ofsu:0,f2p0:False;n:type:ShaderForge.SFN_Final,id:1,x:32719,y:32712;pass:END;sub:END;*/ Shader "Shader Forge/NewShader" { Properties { } SubShader { Tags { "RenderType"="Opaque" } Pass { Name "ForwardBase" Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #pragma multi_compile_fwdbase_fullshadows #pragma exclude_renderers xbox360 ps3 flash d3d11_9x #pragma target 3.0 struct VertexInput { float4 vertex : POSITION; }; struct VertexOutput { float4 pos : SV_POSITION; }; VertexOutput vert (VertexInput v) { VertexOutput o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); return o; } fixed4 frag(VertexOutput i) : COLOR { ////// Lighting: float3 finalColor = 0; /// Final Color: return fixed4(finalColor,1); } ENDCG } } FallBack "Diffuse" CustomEditor "ShaderForgeMaterialInspector" }
4.ShaderForge能满足我们大多数对于Shader的需求甚至是动画效果
是不是感觉这种东西简单爆了,太容易了? 嗯 对的,可视化操作大大提高了人工编写的效率,变得容易调试了(主要是现在没有什么好的IDE用)
本系列博文并不在Shader的文法上过分深究,而是带入一个轻松愉快的学习环境,先学会如何通过ShaderForge实现,再对比实际文法,祝你玩的愉快!