// Pcx - Point cloud importer & renderer for Unity // https://github.com/keijiro/Pcx Shader "Point Cloud/Point" { Properties { _Tint("Tint", Color) = (0.5, 0.5, 0.5, 1) _PointSize("Point Size", Float) = 0.05 [Toggle] _Distance("Apply Distance", Float) = 1 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex Vertex #pragma fragment Fragment #pragma multi_compile_fog #pragma multi_compile _ UNITY_COLORSPACE_GAMMA #pragma multi_compile _ _DISTANCE_ON #pragma multi_compile _ _COMPUTE_BUFFER #include "UnityCG.cginc" #include "Common.cginc" struct Attributes { float4 position : POSITION; half3 color : COLOR; }; struct Varyings { float4 position : SV_Position; half3 color : COLOR; half psize : PSIZE; UNITY_FOG_COORDS(0) }; half4 _Tint; float4x4 _Transform; half _PointSize; #if _COMPUTE_BUFFER StructuredBuffer _PointBuffer; #endif #if _COMPUTE_BUFFER Varyings Vertex(uint vid : SV_VertexID) #else Varyings Vertex(Attributes input) #endif { #if _COMPUTE_BUFFER float4 pt = _PointBuffer[vid]; float4 pos = mul(_Transform, float4(pt.xyz, 1)); half3 col = PcxDecodeColor(asuint(pt.w)); #else float4 pos = input.position; half3 col = input.color; #endif #ifdef UNITY_COLORSPACE_GAMMA col *= _Tint.rgb * 2; #else col *= LinearToGammaSpace(_Tint.rgb) * 2; col = GammaToLinearSpace(col); #endif Varyings o; o.position = UnityObjectToClipPos(pos); o.color = col; #ifdef _DISTANCE_ON o.psize = _PointSize / o.position.w * _ScreenParams.y; #else o.psize = _PointSize; #endif UNITY_TRANSFER_FOG(o, o.position); return o; } half4 Fragment(Varyings input) : SV_Target { half4 c = half4(input.color, _Tint.a); UNITY_APPLY_FOG(input.fogCoord, c); return c; } ENDCG } } CustomEditor "Pcx.PointMaterialInspector" }