水文
几何着色器,第一个pass就默认的unlit效果。第二个pass是新建的。属性都没有用到,先留个坑吧。
Shader "GeoHelp/LineMesh"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_EdgeWidth("Edge Width", Float) = 0.5
_LineColor("LineColor",COLOR)=(0,0,0,1)
}
SubShader
{
Tags {"RenderPipeline"="UniversalRenderPipeline"
"RenderType"="Opaque"}
HLSLINCLUDE
#include "UnlitLib/UnlitCollections.hlsl"
ENDHLSL
Pass
{
HLSLPROGRAM
#pragma vertex vert_default
#pragma fragment frag_unlit
//#include "UnlitLib/UnlitCollections.hlsl"
half4 frag_unlit(v2f i) : SV_TARGET
{
return half4(1,1,1,1);
}
ENDHLSL
}
Pass
{
Tags{"LightMode"="LineGeoPass"}
HLSLPROGRAM
#pragma vertex vert2geo
#pragma geometry geom
#pragma fragment geo2frag
struct appdata
{
float4 vertex:POSITION;
float2 uv: TEXCOORD0;
};
struct geodata
{
float4 vertex : INTERNALGEOPOS;
float2 uv:TEXCOORD0;
};
struct fragdata
{
float4 vertex : SV_POSITION;
float2 uv:TEXCOORD0;
};
geodata vert2geo(appdata v)
{
geodata o;
o.vertex = TransformObjectToHClip(v.vertex);
o.uv = v.uv;
return o;
}
float4 _LineColor;
float _EdgeWidth;
[maxvertexcount(3)]
void geom(triangle geodata vg[3], inout LineStream<fragdata> ls)
{
for(int i=0;i<3;i++)
{
fragdata g2f;
g2f.vertex = vg[i].vertex;
g2f.uv = vg[i].uv;
ls.Append(g2f);
}
ls.RestartStrip();
}
half4 geo2frag(fragdata i):SV_TARGET
{
return half4(0,0,0,1);
}
ENDHLSL
}
}
}
maxvertexcount:vs输出到geo的一次最大顶点数
triangle geodata vg[3]:指明处理的类型为三角形。还有line,point
Stream:几何着色器可能会生成新的顶点新的图元,这些输出称为流,然后进入下个着色器作为输入。此外还有PointStream、LineStream
RestartStrip():结束 一个primitive strip,开启新的strip。如果没有足够的顶点来创建图元,则或被丢弃。
效果
效果如上,但这种方式是没办法修改线条粗细的。有一个思路是构建新的于line平行的点,然后填充三角形。