• 【Unity】用Shader编程实现3D红心


    有些形状,即使没有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)依旧是原来的(球型)。


  • 相关阅读:
    ASP.NET的运行原理与运行机制
    VS2008快捷键
    (五)SubSonic的存储过程操作
    110个Oracle常用函数整理汇总
    ASP.NET中HttpModule和HttpHandler的作用及用法
    报表统计(sql面试题)
    ASP.NET C# 数字格式化输出
    ASP.NET Global.ascx 事件大全
    ASP.NET中GUID
    asp.net 页面转向 Response.Redirect, Server.Transfer, Server.Execute的区别
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6852539.html
Copyright © 2020-2023  润新知