【Unity】用Shader编程实现3D红心
有些形状,即使没有3D美术设计师提供模型,也能够用代码生成。
对于想保持原创性不想借用他人模型的独立开发人员来说,这无非是一个非常重要的途径。
今天献给大家的是用Shader编程实现的一颗红心,寄托下淡淡的思乡情。
博文首发地址:
http://blog.csdn.net/duzixi/article/details/41221647
终于效果图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHV6aXhp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="300" alt="红心模型">
开发环境:Unity 4.5.5
第一步:在原点处创建标准球体
GameObject -> Create Other -> Sphere
(注意:大小是默认的)
第二步:在Shader目录中创建HeartShader.shader文件
源码:
Shader "Custom/Heart"{
Properties {
_LightColor("Light Color", COLOR) = (1,1,1,1)
_DarkColor("Dark Color", COLOR) = (1,1,1,1)
} SubShader {
// vertex
// fragment
Pass{
CGPROGRAM // -> GPU begin // define a function type:vertex name:vert(default)
#pragma vertex vert // define another function type:fragment name:frag(default)
#pragma fragment frag uniform half4 _LightColor;
uniform half4 _DarkColor; // typedef vertex struct
// v2f: vertex to fragment
struct VertexInput
{
fixed4 vertex:POSITION; // must have
}; struct FragmentInput
{
fixed4 pos:SV_POSITION; // must have
float4 color:COLOR;
}; // compute fragment by vertex
FragmentInput vert(VertexInput i)
{
FragmentInput o; if (i.vertex.y < 0 && abs(i.vertex.z) <= 0.2 && abs(i.vertex.x) <= 0.2){
i.vertex.y -= 0.12 - sqrt(pow(i.vertex.z,2) + pow(i.vertex.x,2)) * 0.65;
} if (i.vertex.y > 0 && abs(i.vertex.z) <= 0.5 && abs(i.vertex.x) <= 0.5) {
i.vertex.y -= 0.3 - sqrt(pow(i.vertex.z,2) + pow(i.vertex.x,2)) * 0.5;
if (abs(i.vertex.z) <= 0.2 && abs(i.vertex.x) < 0.48){
i.vertex.y -= 0.2 - sqrt(abs(i.vertex.z)) * 0.45;
}
} o.pos = mul(UNITY_MATRIX_MVP, i.vertex);
o.color = _LightColor; float r = (_DarkColor.r - _LightColor.r) * (1 - i.vertex.y) + _LightColor.r;
float g = (_DarkColor.g - _LightColor.g) * (1 - i.vertex.y) + _LightColor.g;
float b = (_DarkColor.b - _LightColor.b) * (1 - i.vertex.y) + _LightColor.b; o.color = float4(r,g,b,0.5); return o;
} half4 frag(FragmentInput i):COLOR
{
return i.color;
} ENDCG // -> GPU end
}
}
// get the default shader
FallBack "Diffuse"
}
第三步:给球体加入自己定义材质
创建材质。选择 Custom -> Heart 自己定义Shader,并将材质加入到第一步创建的球体上
小结:
本篇的重点是实现红心形状,核心代码在顶点着色器部分。
这个Shader着色器色彩渲染处理的比較简单,能够依据实际须要完好色彩渲染。
另一点须要注意的是。Shader编程生成的模型仅仅是视觉上发生了变化,而起碰撞检測(Collider)依旧是原来的(球型)。
【Unity】用Shader编程实现3D红心的更多相关文章
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- Unity shader UI的3D效果
原创,转载请标明出处 1.效果 scene视图中的效果: game视图中效果: 2.核心思想:改变UI的顶点坐标 3.好处:可以用正交相机来实现3D效果. 4.Shader 实现 // Unity b ...
- Unity SurfaceShader 开始编程
Unity SurfaceShader 开始编程 在14年年初的时候,以前给自己定下了今年要实现的三个目标.当中之中的一个就是学会编写自己的Shader,并可以投入到实际的项目应用之中.如今,转眼间日 ...
- 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术
[Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...
- Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合
一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...
- 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨) ...
- [Unity]在Shader中获取摄像机角度、视线的问题
又踩了一坑,好在谷歌到了之前的一个人遇到相同的问题,顺利解决. 先说说问题背景,我目前的毕设是体数据渲染,实现的办法是raycast.最基本的一点就是在fragment program里,获取rayc ...
随机推荐
- glic,uClibc,EGLIBC 简要介绍
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- margin与padding如何进行区分
margin与padding如何进行区分,这是很多学html人的困扰,其实说白了padding 就是内容与边框的空隙.而margin则是模块与模块的空隙.[3]
- 梦想CAD控件安卓控件事件
MxDrawActivity.commandEvent 命令调用事件. 参数 说明 int iCommand 命令ID,这个ID用户自已来取的,只要多个命令ID不重复就可以 代码实现如下: publi ...
- ThinkPHP---TP功能类之上传
[一]概论 (1)上传操作的核心操作:移动临时文件(move_upload_file),在ThinkPHP里封装了上传类Upload.class.php (2)上传类Upload.class.php代 ...
- linux mysql设置远程访问
>mysql -u root -p 选择进入mysql数据库use `mysql`; 查看所有存在的账号和地址.SELECT `Host`,`User` FROM `user`; 现在决定让ro ...
- 03匿名内部类、eclipse快捷键、String相关知识
03匿名内部类.eclipse快捷键.String相关知识-2018.7.11 1.匿名内部类(只针对重写一个方法时候使用,不能向下转型,因为没有子类类名) new Inter(){ public v ...
- cmake 学习笔记(一) buildsystem
参见网址: http://www.cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html Introduction 基于CMake的构建 ...
- [bzoj1004][HNOI2008][Cards] (置换群+Burnside引理+动态规划)
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- cocos2dx 2.1.x 退出SDK相关界面后EGLView 不刷新渲染
报错内容为: [3390:1456879] failed to call contextcocos2d: surface size: 0x0[3390:1456879] Failed to make ...
- ssc项目Python爬虫心得
###今日心得 ####time.datetime 1.字符串格式到标准化格式:time.strptime(str, "%Y%m%d") 2.今天的标准化格式:today = da ...