参考连接:
几何着色器基础知识
模型沙砾化
Shader "Custom/geomShader"
{Properties{_MainTex("Texture", 2D) = "white" {}_Speed("Speed", Float) = 10_AccelerationValue("AccelerationValue", Float) = 10}SubShader{Tags { "RenderType" = "Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert //顶点着色器函数#pragma fragment frag //片元着色器函数#pragma geometry geom //几何着色器函数#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2g{float2 uv : TEXCOORD0;float4 vertex : POSITION;float3 normal : NORMAL;};struct g2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 normal : NORMAL; //定义后,必须使用};sampler2D _MainTex;float _Speed;float _AccelerationValue;float _StartTime;v2g vert(appdata v){v2g o;//将顶点和UV信息存入 o 返回o.vertex = v.vertex;o.uv = v.uv;return o;}//maxvertexcount 定义顶点输出的最大数量,PointStream>=1,LineStream>=2,TriangleStream>=3[maxvertexcount(3)]void geom(triangle v2g IN[3], inout LineStream<g2f> pointStream){ //第一个参数是输入图元,三角面的顶点UV信息//图像单元,point=1,line=2,triangle=3,lineadj=4 线段相邻2个点,triangleadj=6 三角形相邻三个点//第二个参数是输出图元的顶点UV信息//PointStream,LineStream,TriangleStream//g2f o;//float3 v1 = IN[1].vertex - IN[0].vertex;//float3 v2 = IN[2].vertex - IN[0].vertex;//float3 norm = normalize(cross(v1, v2));//计算点移动的方向//o.normal = (IN[0].normal + IN[1].normal + IN[2].normal) / 3;//float3 tempPos = (IN[0].vertex + IN[1].vertex + IN[2].vertex) / 3;//float realTime = _Time.y - _StartTime;//tempPos += norm * (_Speed * realTime + .5 * _AccelerationValue*0.01 * pow(realTime, 2));//o.vertex = UnityObjectToClipPos(tempPos);//o.uv = (IN[0].uv + IN[1].uv + IN[2].uv) / 3;//pointStream.Append(o);for (int i = 0; i < 3; i++){g2f g;//g.vertex = IN[i].vertex;//屏幕上的点坐标,结果会跟随相机移动//理解为模型的世界坐标,可以正常做三维坐标计算float3 pos = IN[i].vertex+float3(0,1,0);//物体的世界坐标转裁剪坐标,转换后,结果会跟随物体移动g.vertex = UnityObjectToClipPos(pos * _AccelerationValue * 0.1);g.normal = IN[i].normal; //此行注释,shader无法正常应用g.uv = IN[i].uv;pointStream.Append(g);}}fixed4 frag(g2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);return col;}ENDCG}}
}