【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 ...
随机推荐
- 部署bugzilla(bugzilla+apache+mysql+linux)
工作原因,需要部署bugzilla.在此,容我新造个轮子.官方轮子:https://bugzilla.readthedocs.org/en/latest/installing/quick-start. ...
- RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试
1. 概念 Producer端重试: 生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败. 这种消息失败重试我们可以手动设置发送失败重试的次 ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
- php第二十八节课
文件上传 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- Extjs杂记录
1,页面跳转到另外一个页面 这段话的意思:取得恢复密码窗口,关闭这个窗口,页面跳转到Login页面 2,keypecial 当与导航相关的键(如箭头.tab键.Enter键.ESC键等)按下时,该事件 ...
- HDU - 6266 - HDU 6266 Hakase and Nano (博弈论)
题意: 有两个人从N个石子堆中拿石子,其中一个人可以拿两次,第二个人只能拿一次.最后拿完的人胜利. 思路: 类型 Hakase先 Hakase后 1 W L 1 1 W W 1 1 1 (3n) L ...
- db2记录去重
--查出二码,归档日期,借据号重复的数据的条数 select default_index_item_id,record_date,index_yxdk_dkjjh,min(sys_org_id),ma ...
- [bzoj1072][SCOI2007][排列perm] (状态压缩+数位dp+排列去重)
Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...
- 【Codeforces 567D】One-Dimensional Battle Ships
[链接] 我是链接,点我呀:) [题意] 长度为n的一个序列,其中有一些部分可能是空的,一些部分是长度为a的物品的一部分 (总共有k个长度为a的物品,一个放在位置i长度为a的物品会占据i,i+1,.. ...
- nyoj 93 汉诺塔(三)(stack)
汉诺塔(三) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度 ...