天才的大三暑假修行之旅.表面着色器(二)
2015-07-27 08:03
387 查看
天才的大三暑假修行之旅.表面着色器(二)
肯定很多人看了那么多人讲着色器的文章之后都有一个疑问,这Input结构体是干什么的,到底需不需要定义里面的参数。先后写了几个例子发现然并卵。后来看了这一篇文章:http://unity3d.9tech.cn/news/2013/1202/39031.html
虽然没怎么讲Input,但是有一句顺带的讲了一下Input的作用。“Input其实是需要我们去定义的结构,这给我们提供了一个机会,可以把所需要参与计算的数据都放到这个Input结构中,传入surf 函数使用”。如果大家要是有什么好的对Input的理解也可以写下留言。
接着就是表面着色器实战了。这里分别是两个大神的uv部分的讲解。而且都是实现水纹。
/article/1324925.html
/article/1383377.html
先上一下我用的素材。
这个是暖羊羊头像的那篇博客里做完的效果。
[code]Shader "Surface/SSeven" { Properties { _MainTex ("MainText", 2D) = "white" {} _BaseTex("BaseText",2D)="white"{} _XSpeedOne("XSpeedOne",float)=0 _YSpeedOne("YSpeedOne",float)=0 _XSpeedTwo("XSpeedTwo",float)=0 _YSpeedTwo("YSpeedTwo",float)=0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; sampler2D _BaseTex; float _XSpeedOne; float _YSpeedOne; float _XSpeedTwo; float _YSpeedTwo; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutputStandard o) { float2 First=IN.uv_MainTex; float2 Sec=IN.uv_MainTex; First+=float2(_XSpeedOne*_Time.y,_YSpeedOne*_Time.y); Sec+=float2(_XSpeedTwo*_Time.y,_YSpeedTwo*_Time.y); half4 FResult=tex2D(_MainTex,First); half4 SResult=tex2D(_BaseTex,Sec); o.Albedo=FResult.rgb*0.5+SResult.rgb*0.5; o.Alpha=1.0; } ENDCG } FallBack "Diffuse" }
这里我把在哪里设置Shader的截图贴了出来,大家可能直接复制粘贴之后发现在Custom没有,因为我定义为Surface了,在Surface中找。
这个是那个头像是一个女孩吃西瓜的效果。
[code]Shader "Surface/SEight" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _XSpeed("XSpeed",float)=0 _YSpeed("YSpeed",float)=0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; float _XSpeed; float _YSpeed; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutputStandard o) { float2 Temp=IN.uv_MainTex; Temp+=float2(_XSpeed*_Time.y,_YSpeed*_Time.y); o.Albedo = tex2D (_MainTex, Temp).rgb; } ENDCG } FallBack "Diffuse" }
其实两个人的原理都是产不多的。只不过第一个人用了2张图片来做水的效果,所以显得更加逼真一些。但是效果都不是那么令人满意,为什么呢,因为水有水波,波纹会浮动变化,而两种方法只是进行平移而已。以后再看看有没有更好的实现方法。
再说说编程中遇见的困难,我学习Shader是从Unity5开始的。发现很多地方都有区别。而且上一篇也说了SurfaceOutputStandard与SurfaceOutput不通用。现在教大家一个在Unity5上使用之前Shader的方法。因为新版的支持物理光,这是官网的介绍。所以只要把物理光的定义给删了就变成旧的Shader编辑方式了。
http://docs.unity3d.com/Manual/SL-SurfaceShaders.html
而且UNITY5吧,默认没有标准包的,要去官网下载。本来有一个天空盒子的Shader练习也因此做不了了。所以大家要是学习基础,参考网上教程的话还是用4.X的unity来学习,毕竟那个版本的教程多而且也方便掌握。
相关文章推荐
- 精简点名IAP错误
- 解析大型.NET ERP系统核心组件 查询设计器 报表设计器 窗体设计器 工作流设计器 任务计划设计器
- UNIX的标准与选项
- UNIX的标准与选项
- 上周热点回顾(7.20-7.26)
- 暑假作业 三
- SqlServer将数据库中的表导入到另一个数据库
- spring mvc 的Controller类默认Scope是单例(singleton)的
- 数据库设计的N个败笔
- c# mvc flash上传
- Course Schedule
- Spark专家王家林 系列Scala 课程 (2)
- SDL游戏开发系列第二话:基本图形的绘制
- velocity使用步骤
- oscache
- SSI服务器包含技术
- (WPF)XAML 过程式代码
- Windows App开发之更多技巧
- 【java】itoo项目实战之hibernate 批量保存优化
- Windows App开发之使用通知与动态磁贴