unity用shader编程实现3d红心

jzssuanfa jzssuanfa     2022-08-31     597

关键词:

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

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

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


博文首发地址:

http://blog.csdn.net/duzixi/article/details/41221647


终于效果图:

技术分享    技术分享


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










unity3d---通过shader实现美颜(代码片段)

...们大可识别出肤色区域,然后在肤色区域进行美颜。Shader"Extand/Face/SkinCheck"Properties_MainTex("Texture",2D)="white"SubShaderTags"RenderType"="Opaque"LOD100PassCGPROGRAM#pragmavertexvert#pragmafragmentfrag#include"UnityCG... 查看详情

如何系统的学习unity3d中的shader编写

如何系统的学习Unity3D中的shader编写nvidiacg编程2016-02-25UnityShader(23)相信一定也有很多做unity3d开发的朋友对shader这一块有疑问。unity3d算是比较新的引擎,最近手游又比较火,很多unity3d程序猿应该是从其他专业转过来的,比如本... 查看详情

unity3d用脚本控制shader参数

...ress",0.5f);这样不行反正我试没有效果Unity3D用脚本控制Shader参数是:this.renderer.material.SetFloat("_Progress",0.5f);Unity3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内... 查看详情

unity3d用脚本控制shader参数

...uot;,0.5f);这样不行反正我试没有效果参考技术A不知道这个shader是你找的还是自己写的,这个显示在面板上的"Progress"只是一个注释,并不是这个属性的调用名字。比如你要改颜色,要调用"_Color",而不是"MainColor&... 查看详情

unity中shader的三种基本类型

一、固定功能着色器(FixedFunctionShader)固定功能着色器为固定功能渲染管线的具体表现。功能较简单兼容比较老的机器二、表面着色器存在于Unity3D中由U3D发扬光大的一门技术。Untiy3D为我们把Shader的复杂性包装起来,降低shader的... 查看详情

如何系统的学习unity3d中的shader编写

参考技术A相信一定也有很多做unity3d开发的朋友对shader这一块有疑问。unity3d算是比较新的引擎,最近手游又比较火,很多unity3d程序猿应该是从其他专业转过来的,比如本人以前就是搞javaweb开发的,所以对这一块的知识体系不太... 查看详情

扩展unity3d编辑器的脚本模板

??最近在学习Shader时感觉Shader语言参数众多、语法诡异,如果每次都从头开始写Shader一定是一件痛苦的事情。如果可以在本地定义好一组标准的Shader模板,这样当我们需要实现某些效果类似的Shader时,就可以在这个Shader模板的基... 查看详情

用unity3d在正方体6面画不同的图案,怎么实现

...制贴图最后导入unity3d参考技术A又是这个问题!除了使用shader的双材质之外,我们可以在六个面分别来一个plan之后赋予材质!本人推荐第一种! 参考技术B根据ui画贴图 查看详情

扩展unity3d编辑器的脚本模板

??近期在学习Shader时感觉Shader语言參数众多、语法诡异,假设每次都从头開始写Shader一定是一件痛苦的事情。假设能够在本地定义好一组标准的Shader模板,这样当我们须要实现某些效果相似的Shader时,就能够在这个Shader模板的基... 查看详情

unity3d玻璃shader

??Shader"Custom/Glass"{//UpgradeNOTE:replaced‘SeperateSpecular‘with‘SeparateSpecular‘  Properties{   _Color("MainColor",Color)=(1,1,1,1)   _SpecColor("SpecColor 查看详情

unity3d边缘高光shader

 Shader"Custom/NewShader"{Properties{_MainTex("Base(RGB)",2D)="white"{}_RimColor("RimColor",Color)=(1,1,1,1)_RimPower("Rimpower",range(0,5))=2//边缘强度}SubShader{Pass{CGPROGRAM#include"UnityCG.cginc 查看详情

unity学习路线

...低成本的独立游戏了) 【第三阶段】25Unity3D着色器(Shader和图形学)26Unity3D服务端(PhoronServer、MySQL)27U 查看详情

编写unity3d着色器的三种方式

不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的。先来列一下这三种方式:fixedfunctionshadervertexandfragmentshadersurfaceshader为什么Unity3D要... 查看详情

如何在shader中使用自定义函数

参考技术A用unity自带的particalsystem,那个就是粒子特效,炉石就是那样实现的,ngui主要用于做ui界面,做不了特效,炉石的特效都是3d的,并且很多是shader实现,你可以搜索unityparticalsystem以及shader教程本回答被提问者采纳 查看详情

unity3d如何能够在一个物体上面实现透明和反射两种效果请高手回答在下不胜感激。

...两种效果请高手回答在下不胜感激。参考技术A这个要写shader官方给出的shader有透明的在transparent下面,反射的就要自己去找了。追问同时在物体上面呈现透明或者反射shader是怎样的。追答这个我还不会写,不好意思噢。 查看详情

蛋哥的学习笔记之-基于unity的shader编程:x-1音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1音乐水波特效热度 13728 2015-7-1123:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 查看详情

unity3d怎么建shader

...果是进行3d游戏开发的话,想必您对着两个词不会陌生。Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制... 查看详情

【unity3d】urp中的打包资源加载

参考技术A  当项目打包后,Shader.Find寻找Shader的方式可能会失效,原因是当前项目可能没有引用此Shader。  一般解决方式,是Edit/ProjectSettings/Graphics,将Shader加入到AlwaysIncludesShaders中,我不喜欢这种方法,因为Alw... 查看详情