I want so see if you have any thoughts on how to limit the size of a particle in a Geometry Shader, just like in the Shuriken particle system. How to express the particle in viewport size and limit it. Code (CSharp): // Vertex Shader ------------------------------------------------ GS_INPUT VS_Main(appdata v) { GS_INPUT output = (GS_INPUT)0; output.color = v.color; output.pos = mul(_Object2World, v.pos); output.info = float4(v.info,0,0); return output; } // Geometry Shader ----------------------------------------------------- [maxvertexcount(4)] void GS_Main(point GS_INPUT p[1], inout TriangleStream<FS_INPUT> triStream) { //inverse view matrix float4x4 i_v = inverse(UNITY_MATRIX_V); float4 pos = p[0].pos; float distance = length(_WorldSpaceCameraPos - pos); float3 look = normalize(_WorldSpaceCameraPos - pos); float3 up = float3(0,1,0); //the rotation matrix float4x4 rotateM = rotate(float3(0,0,sin(p[0].pos.x) * _Time.y),float4(0,0,0,0)); up = mul(rotateM,up); //rotate the up vector to match the camera up up = mul(i_v,up); float3 right = cross(up, look); //individual size of particle float size = p[0].info.x; //quad vertices centered on 0,0 float4 v[4]; v[0] = float4(right * 0.5f - up * 0.5f,0); v[1] = float4(right * 0.5f + up * 0.5f, 0); v[2] = float4(- right * 0.5f - up * 0.5f, 0); v[3] = float4(- right * 0.5f + up * 0.5f, 0); float2 u[4]; u[0] = float2(1,0); u[1] = float2(1,1); u[2] = float2(0,0); u[3] = float2(0,1); FS_INPUT pIn; //use the look direction as the normal pIn.normal = look; pIn.color = p[0].color; //store the distance of each particle pIn.info = float4(distance,0,0,0); for(int i = 0;i < 4;i++) { pIn.pos = mul(UNITY_MATRIX_VP,pos + v[i] * size); pIn.tex0 = u[i]; triStream.Append(pIn); } }