查看: 2900|回复: 9
打印 上一主题 下一主题

Unity 3 technology – Surface Shaders(三)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2011-11-25 15:24:00 |只看该作者 |倒序浏览


            
         



           Predefined Input values
         

           The Input structure can contain texture coordinates and some predefined values, for example view direction, world space position, world space reflection vector and so on. Code to compute them is only generated if they are actually used. For example, if you use world space reflection to do some cubemap reflections (as emissive term) in your surface shader, then in Deferred Lighting base pass the reflection vector will not be computed (since it does not output emission, so by extension does not need reflection vector).
         






           As a small example, the shader above extended to do simple rim lighting:
         

           #pragma surface surf Lambert
           

           struct Input {
           

           float2 uv
           


            _
           
           MainTex;
           

           float2 uv
           
            _
           
           BumpMap; float3 viewDir; };
           

           sampler2D
           
            _
           
           MainTex;
           

           sampler2D
           
            _
           
           BumpMap; float4
           
            _
           
           RimColor; float
           
            _
           
           RimPower; void surf (Input IN, inout SurfaceOutput o) {
           

           o.Albedo = tex2D (
           
            _
           
           MainTex, IN.uv
           
            _
           
           MainTex).rgb;
           

           o.Normal = UnpackNormal (tex2D (
           
            _
           
           BumpMap, IN.uv
           
            _
           
           BumpMap)); half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal)); o.Emission =
           
            _
           
           RimColor.rgb * pow (rim,
           
            _
           
           RimPower); }
           








           Vertex shader modifiers
         

           It is possible to specify custom “vertex modifier” function that will be called at start of the generated vertex shader, to modify (or generate) per-vertex data. You know, vertex shader based tree wind animation, grass billboard extrusion and so on. It can also fill in any non-predefined values in the Input structure.
         

           My favorite vertex modifier? Moving vertices along their normals.
         

           Custom Lighting Models
         

           There are a couple simple lighting models built-in, but it’s possible to specify your own. A lighting model is nothing more than a function that will be called with the filled SurfaceOutput structure and per-light parameters (direction, attenuation and so on). Different functions would have to be called in forward & deferred rendering cases; and naturally the deferred one has much less flexibility. So for any fancy effects, it is possible to say “do not compile this shader for deferred”, in which case it will be rendered via forward rendering.
         






           Example of wrapped-Lambert lighting model:
         

           #pragma surface surf WrapLambert half4 LightingWrapLambert (SurfaceOutput s, half3 dir, half atten) { dir = normalize(dir); half NdotL = dot (s.Normal, dir); half diff = NdotL * 0.5 + 0.5; half4 c; c.rgb = s.Albedo *
           
            _
           
           LightColor0.rgb * (diff * atten * 2); c.a = s.Alpha; return c; } struct Input {
           

           float2 uv
           
            _
           
           MainTex;
           

           };
           

           sampler2D
           
            _
           
           MainTex;
           

           void surf (Input IN, inout SurfaceOutput o) {
           

           o.Albedo = tex2D (
           
            _
           
           MainTex, IN.uv
           
            _
           
           MainTex).rgb;
           

           }
           

           Behind the scenes
         

           We’re using HLSL parser from Ryan Gordon’s mojoshader to parse the original surface shader code and infer some things from the abstract syntax tree mojoshader produces. This way we can figure out what members are in what structures, go over function prototypes and so on. At this stage some error checking is done to tell the user his surface function is of wrong prototype, or his structures are missing required members – which is much better than failing with dozens of compile errors in the generated code later.
         

           To figure out which surface shader inputs are actually used in the various lighting passes, we’re generating small dummy pixel shaders, compile them with Cg and use Cg’s API to query used inputs & outputs. This way we can figure out, for example, that a normal map nor it’s texture coordinate is not actually used in Deferred Lighting final pass, and save some vertex shader instructions & a texcoord interpolator.
         

           The code that is ultimately generated is compiled with various shader compilers depending on the target platform (Cg for Windows/Mac, XDK HLSL for Xbox 360, ps3 Cg for PS3, and our own fork of HLSL2GLSL for iPhone, Android and upcoming NativeClient port of Unity).
         

           So yeah, that’s it. We’ll see where this goes next, or what happens when Unity 3 will be released. I hope more folks will try to write shaders!
         

           转自官方英文blog
         

           http://blogs.unity3d.com/2010/07/17/unity-3-technology-surface-shaders/
         
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

沙发
发表于 2012-1-21 23:31:29 |只看该作者
都说老虎的屁股摸不得,但是我就敢!我不但敢摸老虎屁股,我还要揪住老虎尾巴,送上年末对你的祝福:祝今年快乐,来年更幸福!元旦祝福语
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2012-1-30 23:21:09 |只看该作者
愿你来年工资加“新”,少做“新”苦事,多领新票子;生活更新,买栋新房子,开辆新车子;心情舒“新”,听听新曲子,看看新片子;新年快乐心想事成。
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2012-4-5 23:18:13 |只看该作者
人过留名!
回复

使用道具 举报

103

主题

1

听众

7956

积分

高级设计师

Rank: 6Rank: 6

纳金币
7953
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-4-6 19:36:34 |只看该作者
回复

使用道具 举报

1010

主题

1

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
31646
精华
1

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-4-6 20:07:01 |只看该作者
爱生活,爱纳金网,爱web3D。。。。
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-4-25 23:26:24 |只看该作者
已阵亡的 蝶 随 风 舞 说过  偶尔按一下 CTRL A 会发现 世界还有另一面
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2012-5-21 23:23:02 |只看该作者
发了那么多,我都不知道该用哪个给你回帖了,呵呵
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

9#
发表于 2012-8-20 23:31:58 |只看该作者
真不错,全存下来了.
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

10#
发表于 2012-9-28 23:26:11 |只看该作者
不错哦,顶一下......
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-1-15 21:55 , Processed in 0.073819 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部