和Keyle一起学ShaderForge - Overview

sf_logo

 

学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应用最直观的认识

material_diagram

 

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进行语法检查

image

 

生成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的需求甚至是动画效果

image

 

是不是感觉这种东西简单爆了,太容易了?   嗯 对的,可视化操作大大提高了人工编写的效率,变得容易调试了(主要是现在没有什么好的IDE用)

本系列博文并不在Shader的文法上过分深究,而是带入一个轻松愉快的学习环境,先学会如何通过ShaderForge实现,再对比实际文法,祝你玩的愉快!

posted @ 2015-04-21 14:16  keyle_xiao  阅读(3893)  评论(2编辑  收藏  举报