有些形状,即使没有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红心的更多相关文章

  1. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  2. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  3. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  4. Unity shader UI的3D效果

    原创,转载请标明出处 1.效果 scene视图中的效果: game视图中效果: 2.核心思想:改变UI的顶点坐标 3.好处:可以用正交相机来实现3D效果. 4.Shader 实现 // Unity b ...

  5. Unity SurfaceShader 开始编程

    Unity SurfaceShader 开始编程 在14年年初的时候,以前给自己定下了今年要实现的三个目标.当中之中的一个就是学会编写自己的Shader,并可以投入到实际的项目应用之中.如今,转眼间日 ...

  6. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  7. Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合

    一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...

  8. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&amp;混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

  9. [Unity]在Shader中获取摄像机角度、视线的问题

    又踩了一坑,好在谷歌到了之前的一个人遇到相同的问题,顺利解决. 先说说问题背景,我目前的毕设是体数据渲染,实现的办法是raycast.最基本的一点就是在fragment program里,获取rayc ...

随机推荐

  1. java操作zip文件

    思路: 1).读取zip中的文件并将除了重名文件之外的文件转存到中转zip文件中. 2).往中转文件中插入txt文件. 3).删除原zip文件. 4).将中转zip文件重命名为原zip文件. 前提,t ...

  2. Sass 主要知识点小记

    Sass 主要知识点小记 以前写样式的时候,每个元素的颜色,背景色都需要重新写一遍,然后就想CSS难道没有变量么?最后就查到Sass.但当时没有静下心来好好的看一下,今天正好有时间,就在这里边看边整理 ...

  3. Monkey进行测试时如何屏蔽掉状态栏和音量键

    我在学习的过程中使用简单的点击命令总是会触发到音量键和状态栏,由于我的测试机是虚拟按键所以也会触碰到 接下来说一下解决办法 全屏状态  adb shell settings put global po ...

  4. PHP 锁机制

    应用环境 解决高并发,库存为负数的情况 阻塞模式 如果其他进程已经加锁文件,当前进程会一直等其他进程解锁文件后继续执行 flock($fp, LOCK_EX) // 文件锁 非阻塞模式 如果其他进程已 ...

  5. 一:安装centos 7最小编程环境 xfce桌面

    1, u盘制作安装盘------------------------------------------------------安装时, table或者e进入编辑选项    如果不知道你的u盘的盘符 ...

  6. Python基础之函数参数与返回值进阶

    参数作用:如果外界希望在函数内部处理数据,就可以将数据作为参数传入函数内部: 返回值作用:如果希望一个函数函数执行完成后,向外界报告函数的执行结果,就可以使用函数的返回值. 函数的返回值 进阶 利用元 ...

  7. js 防止重复提交表单

    var addFlag = true; function addQuestion(){ if(!addFlag){ return; } addFlag = false; //执行更新操作 jQuery ...

  8. 【Codeforces 246D】Colorful Graph

    [链接] 我是链接,点我呀:) [题意] 让你找到所有和x颜色的点中,和该颜色的点颜色不同的相邻的点的个数(重复颜色算一次) 求出哪种颜色的所要求的点的数量最多. [题解] 对于每一条边只会被查到两次 ...

  9. 49. spring boot日志升级篇—理论【从零开始学Spring Boot】

    我们之前在其中的一篇文章介绍过如何在spring boot中使用日志记录SLF4J. Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如 ...

  10. 如何用Bugzilla系统管理产品研发过中相关需求和bug

    目 录 1.Bug处理流程及状态说明 2.bugs字段说明 3.查询报表的使用 4.bug系统与需求系统的整合 5.流程和用户权限 1. Bug处理流程及状态说明(1) BUG状态流程图 BUG的状态 ...