Unity中用Shader编程实现3D红心

有些形状,即使没有3D美术设计师提供模型,也可以用代码生成。

对于想保持原创性不想借用他人模型的独立开发者来说,这无非是一个很重要的途径。

今天献给大家的是用Shader编程实现的一颗红心,寄托下淡淡的思乡情。

最终效果图:

    

开发环境: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)依然是原来的(球型)。

时间: 2024-10-14 09:25:21

Unity中用Shader编程实现3D红心的相关文章

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

【Unity】Shader编程 基础总结

Shader编程一直是一个比较难入门难上手的主题,本篇对Unity Shader编程的一些基础和要点进行了总结. 包括Shader编程相关知识图谱.Shader编程相关数据类型.Shader核心结构体等(后续继续补充). 每个部分相互独立,可以单独参考,亦可作为一个整体参考. 博文首发:http://blog.csdn.net/duzixi 一.Shader编程知识图谱 个人对Shader编程的理解凝在四个字:色即是光. 无论是要手写Shader程序,还是利用各类Shader制作插件(如Shad

【浅墨Unity3D Shader编程】之一 游戏场景的创建 &amp; 第一个Shader的书写

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在Un

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在U

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本篇文章中,我们学习了Unity Shader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照.材质与颜色的具体写法.写了6个Shader作为本文S

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&amp;混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

【Unity Shader编程】之十四 边缘发光Shader(Rim Shader)的两种实现形态

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  这篇文章主要讲解了如何在Unity3D中分别使用Surface Shader和Vertex & Fragment Shader来编写边缘发光Shader. 一.最终实现的效果

Unity Shader编程(1)漫反射着色

Unity Shader编程(1)漫反射着色 在Unity中创建如下工程: 我们把Shader拖到Material上.Meterial拖到Cube上.这就完成了一个着色器的着色过程. Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaq

Shader编程学习笔记(四)——Unity Shader的组织形式(ShaderLab)

Unity Shader的组织形式 Unity Shader的形态 Unity官方手册上讲Unity Shader有三种不同的编写方案,这三种编写方案分别是surface shaders.vertex and fragment shaders和fixed function shaders. 从前面几篇笔记中可以了解到,可编程图形管线中能够编写shader的主要是两个部分:vertex shader和fragment shader,但Unity还有surface shaders和fixed fun