几何着色器描绘模型线框

it2026-02-08  0

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

下面是核心代码

// 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; }

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

最新回复(0)