视频链接:Decryption card 解密卡
因为用到的基本上都是前八周的学习内容,不作赘述,逐一简单说说要求对应的画面呈现吧

1.有山有水有角色
2.有静有动有交互
3.顶点片段不能少(Lighting Surf不做强制要求)
4.抓屏后期(至少)选一路

目录

  • 山、水、角色
      • 轨迹的问题
      • 折射的问题
      • Unlit与深度检测的问题
    • 角色
  • 静、动、交互
    • 交互
      • 思路
      • 视频制作的问题
  • 顶点片段、抓屏/后期
  • 表面着色器

山、水、角色

山体网格本身使用的是商城雪山资源,但是整体画面风格偏向卡通,贴图过于写实,需要经过处理。在红白场景中分别采用了不同的方法:

红色场景的山主要还是使用了卡通着色器,之前的笔记有提到:Shader攻占笔记(四)卡通着色器(“顶点与法线之间做抉择”部分)。
贴图部分进行了马赛克处理,即采样时对uv进行了一个floor操作,动态控制,方便调试。

//_MainLayer变量控制马赛克分层的层数
fixed4 col = tex2D(_MainTex, float2(floor(i.uv * _MainTexLayer)/_MainTexLayer));

在此之上,最后计算完颜色,在表面较暗的部分使用了圆点遮罩。(追求更写实可以在diff或者NdotL部分进行 lerp 阴影添加)

c = _LightColor0 * diff * NdotL * col * _Color;
//------------------------[阴影]
//采样贴图,调整对比度
fixed bump = saturate(tex2D(_Bump, i.buv * 15).r  + 0.4f);
//和原来的颜色进行lerp上色
//_ShadowRange变量控制阴影范围
c = lerp(c * bump, c, step(_ShadowRange, c.r));
return c;


白色场景的山体比较简单,单纯地拉到PS里面做了晶格化的滤镜处理,效果还是不错的。

在水的制作过程中遇到了几个问题,简单说说

轨迹的问题

轨迹制作的灵感主要来源于一篇雪地沙地的shader文章:游戏中沙漠、雪地的轨迹、脚印实现。里面使用了一种保持人物停留在RT中心以节省资源的方式,觉得很妙,推荐读读。
但是实际场景展示中,发现水和沙地、雪地的轨迹还是有一定区别的,波纹和衰减的频率都不太一样(果然还是不能偷懒照搬);
其次,文章中是通过改变其alpha来使波纹逐渐回到原点的,在不透明的材质上效果还行,但是放在水面这种地方就比较复杂,它使一整片RT范围内的数值都改变,不能单纯地加到现有的波纹之上(会变得更亮),也不能单纯地使用step来删除掉某些信息,因为波峰和波谷都是制造波纹需要的内容;
再次,我的视角相对比较水平,其实波纹幅度较小的情况下还是不能看清,于是由于时间关系索性暂时不优化了。
即使没有大成功,学习的部分还是写了挺多注释,在此做个记录。

生成脚印的shader

fixed4 frag (v2f i) : SV_Target
{//角色的位移差作为输入偏移轨迹贴图fixed4 col = tex2D(_MainTex, i.uv + _DeltaPos.xz * 0.015);//uv倍数即为圆的tiling//缩放为原uv的1/n后,+0.5挪到中点fixed4 stepCol = tex2D(_StepBump, (i.uv - 0.5) * 26 + 0.5);      //残影部分fixed4 stepCol2 = tex2D(_StepBump, (i.uv - 0.5) * 39 + 0.5);    //本体圆环部分stepCol2.rg = 1 - stepCol2.rg; //本体圆环突出//残影随着stepCol的a通道的降低 从stepCol2逐渐减淡stepCol = lerp(stepCol2, stepCol, stepCol.a);col = lerp(col, stepCol, saturate(stepCol.a - col.a));//0.499 > abs(i.uv.x - 0.5)? 1:0float cond = step(abs(i.uv.x - 0.5), 0.499) * step(abs(i.uv.y - 0.5), 0.499);//col慢慢过渡到float4() a通道渐低 模拟痕迹逐渐消失col = lerp(float4(0.5,0.5,1,0), col, cond * 0.996);return col;
}

使用脚印的shader:

float3x3 tangentToWorld = float3x3(normalize(i.tangent), normalize(i.bitangent), normalize(i.normal));//处理后的轨迹图 放RT
float4 stepNormalCol = tex2D(_StepBump, (i.worldPos.xz - _PlayerPos.xz) * 0.015 + 0.5);
float3 stepNormal = stepNormalCol.rgb * 2 - 1;
//float3 stepNormal = UnpackNormal(stepNormalCol);//test//提高rg的值 加强轨迹颜色
//整体地形凹凸程度
stepNormal.rg *= 2 *_BumpScale;//TBN矩阵将切线空间下的法线变换到物体空间下的法线
float3 normal = mul(normalize(stepNormal), tangentToWorld);

有关法线混合的内容,可以阅读:法线混合
有关TBN矩阵的内容,可以阅读:切线空间(TBN) ---- 聊聊图形学中的矩阵运算

折射的问题


之前写折射的时候和写玻璃差不多,垂直往下看的时候观感还凑合,但是一到水平角度就有问题了:没有在水里的部分也受到了折射影响。
可以在扰动之前,通过一个是否在水里检测来筛选出在水底的内容

//用深度信息比较判断是否在水里
float depth2 = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, float4(i.scrPos.x, i.scrPos.yzw));
depth2 = LinearEyeDepth(depth2);
fixed inWater = 1 - saturate(depth2 - i.scrPos.w * _Deepness);

最后的扰动构成:

fixed2 offset = bump2.xy *_Dist_refr        //噪声扰动乘程度* _GrabPass_TexelSize * 2000   //纹素大小 抵消比例影响* i.scrPos.z                  //越靠近水底的部分扰动程度越大* inWater;                    //是否是在水里的部分
fixed4 grabColor = tex2Dproj(_GrabPass, UNITY_PROJ_COORD(i.scrPos + offset.x));

Unlit与深度检测的问题

在我给人物放上卡通材质之后,我发现用深度写的边缘泡沫不见了,进而发现unity自带的所有Unlit材质都不能显现泡沫。这个时候大佬指了路,告诉我得在SubShader后加一个Fallback,加上之后果然成功了。
shader最后FallBack

角色

和红色场景的山体使用了同一套卡通材质,加了一点高光效果

//高光区域 使用_HighlightRange控制高光范围
//须在分层之前处理(占位较小
//但是调整时需要注意避免范围的时候和分层结果交叉
fixed highlight = smoothstep(_HighlightRange, 1, NdotL);
NdotL = max(0.3 * _MainTexLayer, floor(NdotL * _LightVal)/ _LightVal);//漫反射部分光照分层

把皮囊加工了一下:



鲸的处理和人差不多,不作赘述。

静、动、交互

说说“动”吧,这个大圆环
和顶点那章笔记里头猴子瞪眼差不多:Shader攻占笔记(六)顶点涟漪与遮罩,外层Pass是普通的贴图,加入了朝法线方向浮动的方式(需要裂开的效果,所以不用顶点方向,具体效果参见笔记六中布丁部分),内层是自发光Pass。
使用blender的甜甜圈做基础,细分后再在上面刷了几刷。

小石头同样简单做了一下,作为粒子系统的第四层环绕在圆圈周围。

交互

思路

刚开始拿大赛模板做的,动画采用Timeline控制的方式,一共就只有五秒钟,不太方便做交互。于是才加入的轨迹波澜,算是角色和波纹的交互;但又觉得不太足够,因为还是没有用户和内容的交互,后期如果需要上交可交互的版本将会比较局促。
后来想到了冒险小虎队里的解密卡,于是就又搭建了一个场景(白色场景):在Unity内跨场景遮罩大概是不太可能的,想到内外基本同步,本身Timeline是没有交互,时长又相对较短,于是直接使用了插入视频的方式来增加微弱的游戏性。卡面自制,使用了Unity内部的Vedio Player遮罩组件,通过脚本控制遮罩层和视频层的UI移动。

视频制作的问题

插入的视频有清晰度被削减的问题,通过两个方法可以有微弱提高效果:

  1. 增加RenderTexture文件本身的分辨率
  2. 增加原视频的清晰度

前者可以在Unity中设置。本体的分辨率是1920 x 600,*我将RT的分辨率提高到了3200 x 1000;
后者可以参考这篇文章(【Unity开发】Unity引擎生成2K视频的方法 )提高分辨率,主要思路是在场景中使用内置提高的分辨率进行逐帧截图,存在电脑里,再通过其他软件合成视频。
原帖的评论区提到可以通过AE来合成视频,不需要下载软件合并了。

顶点片段、抓屏/后期

大部分自编着色器都是顶点片段着色器,用的表面着色器比较少。
抓屏在两个场景的水面部分,以及白色场景角色背上的玻璃人部分使用,主要思想和抓屏玻璃章节笔记里普通畸变玻璃类似,不作赘述。链接:shader攻占笔记(七)抓屏玻璃大杂烩 GrabPass{}

表面着色器

在场景中的雪地和染血地面是使用表面着色器来绘制的,上色思路和基础雪地相似。雪地场景地面纹理是经过ps彩块化的草地贴图;血液场景地面纹理是马赛克uv采样的山地贴图。


基础雪地shader

void surf (Input IN, inout SurfaceOutputStandard o)
{half4 c = tex2D(_MainTex, IN.uv_MainTex);//表面纹理o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump));//表面法线//雪地上色if(dot(WorldNormalVector(IN, o.Normal),_SnowDirection.xyz) >= _Snow)o.Albedo = _SnowColor.rgb;elseo.Albedo = c.rgb * _MainColor;o.Alpha = 1;
}

此外,使用worldPos.y 的 step方法来控制纹理范围,使得雪和血在水面之上截止。很简单就不贴了。

Shader攻占笔记(九)结课作业小记相关推荐

  1. HTML网页设计结课作业~仿蘑菇街商城网站源码(HTML+CSS+JS)

    HTML网页设计结课作业~仿蘑菇街商城网站源码(HTML+CSS+JS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多?没有合适 ...

  2. HTML5期末大作业:宠物网站设计——布偶猫(7页)带留言板 HTML+CSS+JavaScript web结课作业的源码 web网页设计实例作业 html大学生网站开发实践作业...

    常见网页设计作业题材有 ​​个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 明星. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 军 ...

  3. 《移动软件开发》结课作业:答案漂流瓶 实验报告

    姓名和学号? 陆子毅,20120012029 本实验属于哪门课程? 中国海洋大学22夏<移动软件开发> 实验名称? 结课实验:答案漂流瓶 Answer Drift Bottle 博客地址? ...

  4. Java结课作业——黑白棋

    Java结课作业--局域网联机黑白棋(翻转棋) 出售项目.项目包括主机端代码(黑棋代码)和客户端代码(白棋代码),重写的MyJLabel类和图片文件.请联系作者购买

  5. 数据库结课作业——校园失物招领系统

    目录 杂七杂八 起因 项目环境 前端界面的选择 数据库理论阶段 数据库模型 代码实现 相关功能 UI设计 界面展示 项目总文件 项目代码(ui总文件在中) 杂七杂八 起因 因为数据库实验结课作业要结合 ...

  6. 路由交换与技术结课作业

    目 次 1 绪论............................................................................................ ...

  7. matlab选修结课作业,matlab结课作业

    文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持. 山西大同大学 matlab 课程结课作业 MATLAB 程序应用 姓名: 课程序号: 2 班级: 学号: 2013 ...... 山西 ...

  8. matlab选修结课作业,matlab在高等数学中的应用结课作业

    matlab在高等数学中的应用结课作业 MatLab软件在作图中的应用 1.描点作图(MatLab及在电子信息课程中的应用131页) a=0:0.01:3; >> y=a: plot(y) ...

  9. 管理学实验的设计与实践结课作业

    一.不同组织结构类型对组织的沟通效率会带来影响,这也是在组织结构设计过 程需要考虑的重要内容,但对于两者的关系无法准确界定.如在直线职能制的组织结构中,管理幅度和深度是影响是影响沟通效率的主要因素.请 ...

最新文章

  1. vtuber面部捕捉工具_泰国程序员开发VTuber形象生成系统,人人都能当虚拟偶像
  2. RocketMQ简介
  3. 如何快速安全的插入千万条数据?
  4. 使用 wxImage 为 OpenGL 加载纹理
  5. windows安装nvm
  6. 天正双击墙体不能编辑_今日设计分享:CAD常用快捷键、Ps快捷键大全、天正快捷键总结!...
  7. go语言和java比_Go VS Java:一位资深程序员对两种语言的解读
  8. AcWing.282石子合并(区间DP)题解
  9. php正则表达式中的字符是,PHP_PHP正则表达式中的特殊字符,字符/意义:对于字符,通常表 - phpStudy...
  10. sublime livereload插件
  11. 命令解析optparse
  12. 系统开机 linux 时间不对,linux下查看系统运行时间和最近一次的开机启动时间
  13. python连接sql server报20002错误_python - 如何修复pymssql中的“20002,严重性9:Adaptive Server连接失败”错误 - 堆栈内存溢出...
  14. iOS关于上传iTunes store一直卡住终极解决方案
  15. WebGL白模做专题图注意事项
  16. linux 查看u盘痕迹记录,Linux使用记录
  17. Google浏览器被劫持解决方法
  18. 计算机管理器用户怎么打开文件,电脑文件管理器怎么打开文件夹 文件管理器打开想要的文件夹方法-电脑教程...
  19. 《哪吒》票房破25亿,我用AI分析了它20W+评论数据
  20. 想做游戏场景建模师,如何拿到高薪资?

热门文章

  1. PHP根据键值,对二维数组重新进行分组
  2. file html5 样式,CSS小技巧之自定义个性的file表单样式
  3. ElasticSearch(6.3.0)的配置和使用全过程
  4. revit二次开发--异形柱翻模
  5. 微信重磅功能更新!加好友按人数收费,视频号付费订阅、微信版“知乎”来了...
  6. 荣耀开发者关怀月邂逅1024程序员节,请开发者喝咖啡
  7. Ural 1671. Anansi's Cobweb(并查集)
  8. c语言中方阵对角线的和程序,c语言程序 1、方阵求出主对角线上元素之和;2、辅对角线上元素之积;3方阵中最大的元素...
  9. 计算机 布局菜单栏 无法打勾,w7系统 我的电脑工具栏不见了
  10. 用脚本语言对 Excel 分组汇总