小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果
0x00 前言
发现最近没有了写长篇大论的激情,可能是到了冬天了吧。所以这篇小文只是简单介绍下如何在Unity中利用shader很简单的实现雪地效果以及毛皮效果,当然虽然标题写在了一起,但其实这是俩事。
最后和大家分享一下这两个小Demo。
0x01 斯坦福兔子和它的毛
我相信对图形学有兴趣的童靴们一定经常会见到这个上镜率超高的兔子。
关于它的典故各位可以看看龚大的回答:斯坦福兔子模型的来源和故事有哪些?
当然,我用的兔子也是从斯坦福的网站上找到的。
https://graphics.stanford.edu/~mdfisher/Data/Meshes/bunny.obj
ok,导入到我们的Unity引擎中。
可以看到这个丑丑的兔子已经端坐在场景内了。
接下来就开始我们对兔子的改造行动吧。
既然要生成皮毛,那么是否需要皮毛的网格数据呢?是的。
那么皮毛的网格要根据什么来生成呢?
要生在兔子的身体上,所以兔子的原始网格信息提供了皮毛的网格信息。
ok,那么具体要怎么做呢?很简单,Geometry Shader就是干这个的。而我们只需要根据兔子的网格信息,以每一个triangle为一个单位,在这个triangle上生成一个向外指的“金字塔”就可以了。
也就是说,在原有triangle的基础上又新生成了3个指向外面的triangle,形成毛皮的效果。
[maxvertexcount(9)]void geom(triangle v2g IN[3], inout TriangleStream<g2f> tristream){g2f o;...for (uint i = 0; i < 3; i++){o.vertex = UnityObjectToClipPos(IN[i].vertex);tristream.Append(o);o.vertex = UnityObjectToClipPos(IN[index].vertex);tristream.Append(o);o.vertex = UnityObjectToClipPos(float4(centerPos, 1));tristream.Append(o);tristream.RestartStrip();}}
因此总共会生成9个顶点,3个新三角形共同组成一跟毛。
Demo地址:chenjd/Stanford-Bunny-Fur-With-Unity
0x02 雪地痕迹的效果
实现雪地印痕的思路其实也很简单,即记录玩家移动过程中的位置,之后再根据这些数据修改雪地的mesh即可。
所以,很简单的,我们在unity中只需要一个在玩家头顶上的正交相机和一个rendertexture就可以记录玩家的移动过程中的位置了。
之后在shader文件中先用vs根据rendertexture的数据修改雪地mesh的相关顶点位置,同时为了更方便地实现光照的效果,接下来使用surface shader,实现光照。
void vert(inout appdata_full vertex){vertex.vertex.y -= tex2Dlod(_SnowTrackTex, float4(vertex.texcoord.xy, 0, 0)).r * _SnowTrackFactor;}void surf (Input IN, inout SurfaceOutputStandard o) {fixed4 c = tex2D(_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex));o.Alpha = c.a;}
好了,最后的效果就是下面这样的。
Demo地址:chenjd/Unity-Miscellaneous-Shaders
0x03 后记
当然,如果有更多的三角形以上效果会更加真实精细。所以有时候会搭配Tessellation的处理,提供更多的三角形,提供更多的精确性。
-EOF-
最后打个广告,欢迎支持我的书《Unity 3D脚本编程》
欢迎大家关注我的公众号慕容的游戏编程:chenjd01
小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果相关推荐
- 在OpenGL中利用shader进行实时瘦脸大眼等脸型微调
在OpenGL中利用shader进行实时瘦脸大眼等脸型微调 在现在这个靠脸吃饭的时代,如果你没有一张瓜子脸一双大眼睛,那还怎么去吃饭呢,而现在一些直播视频App相机应用基本都会有瘦脸大眼效果.本文是在 ...
- 斯坦福兔子的伪全息舞台剧
前两天用 Python 语言写了个小工具 Hamal,可以将一些朴素的数据文件转化为 POV-Ray 场景文件,然后进行光线跟踪渲染,从而实现数据的可视化.有关 Hamal 的用法,详见 「Hamal ...
- 小王利用计算机设计了一个计算程序,七年级数学上册5.3代数式的值巧求计算机里的代数式的值素材(新版)青岛版...
巧求计算机里的代数式的值 随着社会的发展,电脑已进入了寻常百姓家,为既能培养学生学习电脑的兴趣,又能培养学生的应用意识,各地中考试题出现了以计算机为背景的许多题目,解决这类题目的关键在于搞清计算机程序 ...
- 如何利用Shader来渲染游戏中的3D角色
杨航最近在学Unity3D 本文主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader. 一.从Shader开始 ...
- python画图代码-Python实战小程序利用matplotlib模块画图代码分享
Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...
- 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享
Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...
- 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...
- matlab读入三维点云数据斯坦福兔子
其中点云数据是斯坦福兔子,做三维点云重构后的人可以好好看看,只是简单读入程序,作为初学者比较好些,进一步的研究还在后边,有机会的话会继续上传,比如说delauny三角网格划分,还想进一步研究snake ...
- 微信小程序利用腾讯云IM发送语音 + 图片
微信小程序利用腾讯云IM发送语音 + 图片 能做到这里 说明你已经可以发送普通文本了 如果没有的话可以看一下我的上一篇文章 有完整的讲解 效果图 语音聊天 发送图片 传送 → 发送图片 发送语音 ** ...
- 小王利用计算机设计了一个计算程序,小王利用计算机设计了一个计算程序,输入和输出的数据如下表:那么,当输入数据是8时,输出的数据是[]A.B.C.D.-七年级数学...
题文 小王利用计算机设计了一个计算程序,输入和输出的数据如下表: 那么,当输入数据是8时,输出的数据是 [ ] A. B. C. D. 题型:单选题 难度:中档 答案 C 据专家权威分析,试 ...
最新文章
- 如何通过终端快速删除文件和目录(bash shell)[关闭]
- 长沙理工大学计算机系教师,长沙理工大学数学与计算机科学学院导师介绍:王晚生...
- 集合框架源码分析一(接口篇)
- 3.浏览器输入www.baidu.com到显示主页的全过程
- ORACLE TEXT LEXER PREFERENCE(二)
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结
- java web项目_[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)
- .net语言中使用MapWinGIS.ocx
- Scrum联盟的新任全球营销副总裁访谈
- 聚聚科技---PHP开发笔试题及答案
- android安卓源码海量项目合集打包-1
- 生信技能树课程记录笔记(六)20220530
- css设置内外边距,css内外边距属性
- 关于 电子护照 的基本小常识问答
- 简易网页(HTML)
- nexus5 博通芯片WIFI详解 (1)
- 教你用直播大师在局域网内发布组播节目
- Ubuntu-18.04 安装 ROS 系统
- Miktex 修改经验
- c#操作word图表(二)