注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[unity3d] Shader系列(1) ---- Vertex/Fragment Shader初步  

2013-03-17 13:13:41|  分类: 3d_unity |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

unity3d 4.1,http://docs.unity3d.com/Documentation/Components/SL-Reference.html

unity3d 中支持 fixed-function shader、surface shader和vert/frag shader。
fixed-function shader 是针对老硬件的 shader,现在很少用了,不讨论。
surface shader 是 unity3d 自己设计的一套 shader,其实就是封装了 vert/frag,简化写 shader 的流程。因为不标准,暂时也不讨论。
vert/frag shader 就是对应于 dx/opengl 接口的标准 shader 了。我们来看看这个。

unity3d 通过自己定义了一套 ShaderLib 来描述 shader 信息,类似 dx 中的 .fx。在 ShaderLib 中允许插入 Cg,用来写具体的 vert/frag shader 内容。

image

新建一个 Shader,叫“NormalLit”。然后写入如下代码:
  (1) UnityCG.cginc 在 unity 安装目录
  (2) appdata_base 是 UnityCG.cginc 中预定义好的 vertex 数据 ,参见 http://docs.unity3d.com/Documentation/Components/SL-VertexProgramInputs.html
  (3) UNITY_MATRIX_MVP,ModelViewProjective matrix
  (4) FallBack "VertexLit",如果当前 Shader 目标机器无法执行,换用另一 Shader“VertexLit”
  (5) SV_POSITION,参见
       http://www.gamedev.net/topic/579610-hlsl-semantics-position-vs-sv_position/
       http://msdn.microsoft.com/en-us/library/bb509647(VS.85).aspx

----------------------------------------------------------------
Shader "Custom/NormalLit" {
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex VsMain
            #pragma fragment PsMain
            #include "UnityCG.cginc"

            struct VsOutput {
                float4 pos  : SV_POSITION;
                float3 color : COLOR0;
            };

            VsOutput VsMain(appdata_base v)
            {
                VsOutput o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.color = v.normal*0.5 + 0.5;
                return o;
            }

            half4 PsMain(VsOutput i) : COLOR
            {
                return half4(i.color, 1);
            }
            ENDCG
        }
    }
    FallBack "VertexLit"
}
----------------------------------------------------------------

新建一个 Material,并指定其 Shader 为 Custom/NormalLit。Shader 的名字“Custom/NormalLit”对应了这里的目录结构。

image

把 Material 拖到对应的物体上,看,是不是很帅!

image


好,下面看看如何给 Shader 带上贴图。修改 Shader 代码为:
  (1) Properties 的内容是可在编辑器中编辑的输入内容,如贴图、常量等
  (2) float4 MainTex_ST 很重要,否则编译不过。因为 TRANSFORM_TEX 利用了这个变量。参见:http://forum.unity3d.com/threads/24962-What-is-_MainTex_ST

----------------------------------------------------------------
Shader "Custom/NormalLit" {
    Properties {
        MainTex("Texture", 2D) = "white" {}
    }
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex VsMain
            #pragma fragment PsMain
            #include "UnityCG.cginc"

            sampler2D MainTex;
            float4 MainTex_ST;

            struct VsOutput {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            VsOutput VsMain(appdata_base v)
            {
                VsOutput o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, MainTex);
                return o;
            }

            half4 PsMain(VsOutput i) : COLOR
            {
                return tex2D(MainTex, i.uv);
            }
            ENDCG
        }
    }
    FallBack "VertexLit"
}
----------------------------------------------------------------

给 Material 拖个贴图上去,一切搞定。

image

  评论这张
 
阅读(4234)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017