几何着色器描绘模型线框

基本原理就是判断当前像素位置处于三角面里的位置 这个距离小于某个系数就画颜色,然后可以和另一个颜色插值

下面是核心代码

// Geometry Shader
				[maxvertexcount(3)]
				void UCLAGL_geom(triangle UCLAGL_v2g p[3], inout TriangleStream<UCLAGL_g2f> triStream)
				{
					//视口坐标
					float2 p0 = _ScreenParams.xy * p[0].pos.xy / p[0].pos.w;
					float2 p1 = _ScreenParams.xy * p[1].pos.xy / p[1].pos.w;
					float2 p2 = _ScreenParams.xy * p[2].pos.xy / p[2].pos.w;
	
					
					//三条边
					float2 v0 = p2 - p1;
					float2 v1 = p2 - p0;
					float2 v2 = p1 - p0;

					//三角形的面积
 					float area = abs(v1.x*v2.y - v1.y * v2.x);

					//面积除于边长 当前点距离每个边的长度
					float dist0 = area / length(v0);
					float dist1 = area / length(v1);
					float dist2 = area / length(v2);
	
					UCLAGL_g2f pIn;
	
					//add the first point
					pIn.pos = p[0].pos;
					pIn.uv = p[0].uv;
					pIn.worldpos=p[0].worldPos;
					pIn.dist = float3(dist0,0,0);
					//pIn.worldPos=
					triStream.Append(pIn);

					//add the second point
					pIn.pos =  p[1].pos;
					pIn.uv = p[1].uv;
					pIn.worldpos=p[1].worldPos;
					pIn.dist = float3(0,dist1,0);
					triStream.Append(pIn);
	
					//add the third point
					pIn.pos = p[2].pos;
					pIn.uv = p[2].uv;
					pIn.worldpos=p[2].worldPos;
					pIn.dist = float3(0,0,dist2);
					triStream.Append(pIn);
				}

				// Fragment Shader
				float4 UCLAGL_frag(UCLAGL_g2f input) : COLOR
				{	
					//底色
					//fixed3 worldPos=mul(unity_ObjectToWorld,v.worldPos).xyz;
					fixed high=smoothstep(_WorldPos.x,_WorldPos.y,input.worldpos.y);
			        fixed4 col = tex2D(_MainTex, input.uv)*_ColorTint*0.8;
			        //col*=high;

					//获取该点到附近三条边最短的距离
					float val = min( input.dist.x, min( input.dist.y, input.dist.z));
	
					//添加宽度 也可以直接与宽度值比较
					val = exp2( -1/_LineThickness * val * val );
		
					//
					float4 targetColor = _LineColor * tex2D( _LineMainTex, input.uv);
					//float4 transCol = _LineColor * tex2D( _LineMainTex, input.uv);
					//transCol.a = 0;
					//transCol=(0,0,0,0);
					float4 final=val * targetColor+(1-val)*col;
					return final*high;
				}

因为这是一个全息城市的效果 所以还通过顶点高度判断 做了一个渐变效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值