// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) #ifndef UNITY_CG_INCLUDED #define UNITY_CG_INCLUDED // ------------------------------------------------------------------- // Common functions float saturate(float x) { return max(0.0, min(1.0, x)); } // ------------------------------------------------------------------- // builtin values exposed from Unity // Time values from Unity uniform vec4 _Time; uniform vec4 _SinTime; uniform vec4 _CosTime; // x = 1 or -1 (-1 if projection is flipped) // y = near plane // z = far plane // w = 1/far plane uniform vec4 _ProjectionParams; // x = width // y = height // z = 1 + 1.0/width // w = 1 + 1.0/height uniform vec4 _ScreenParams; uniform vec3 _WorldSpaceCameraPos; uniform vec4 _WorldSpaceLightPos0; uniform vec4 _LightPositionRange; // xyz = pos, w = 1/range // ------------------------------------------------------------------- // helper functions and macros used in many standard shaders #if defined DIRECTIONAL || defined DIRECTIONAL_COOKIE #define USING_DIRECTIONAL_LIGHT #endif #if defined DIRECTIONAL || defined DIRECTIONAL_COOKIE || defined POINT || defined SPOT || defined POINT_NOATT || defined POINT_COOKIE #define USING_LIGHT_MULTI_COMPILE #endif #ifdef VERTEX // Computes world space light direction vec3 WorldSpaceLightDir( vec4 v ) { vec3 worldPos = (unity_ObjectToWorld * v).xyz; #ifndef USING_LIGHT_MULTI_COMPILE return _WorldSpaceLightPos0.xyz - worldPos * _WorldSpaceLightPos0.w; #else #ifndef USING_DIRECTIONAL_LIGHT return _WorldSpaceLightPos0.xyz - worldPos; #else return _WorldSpaceLightPos0.xyz; #endif #endif } // Computes object space light direction vec3 ObjSpaceLightDir( vec4 v ) { vec3 objSpaceLightPos = (unity_WorldToObject * _WorldSpaceLightPos0).xyz; #ifndef USING_LIGHT_MULTI_COMPILE return objSpaceLightPos.xyz - v.xyz * _WorldSpaceLightPos0.w; #else #ifndef USING_DIRECTIONAL_LIGHT return objSpaceLightPos.xyz - v.xyz; #else return objSpaceLightPos.xyz; #endif #endif } // Computes world space view direction vec3 WorldSpaceViewDir( vec4 v ) { return _WorldSpaceCameraPos.xyz - (unity_ObjectToWorld * v).xyz; } // Computes object space view direction vec3 ObjSpaceViewDir( vec4 v ) { vec3 objSpaceCameraPos = (unity_WorldToObject * vec4(_WorldSpaceCameraPos.xyz, 1.0)).xyz; return objSpaceCameraPos - v.xyz; } // Declares 3x3 matrix 'rotation', filled with tangent space basis // Do not use multiline define here, nVidia OpenGL drivers are buggy in parsing that. #define TANGENT_SPACE_ROTATION vec3 binormal = cross( gl_Normal.xyz, Tangent.xyz ) * Tangent.w; mat3 rotation = mat3( Tangent.x, binormal.x, gl_Normal.x, Tangent.y, binormal.y, gl_Normal.y, Tangent.z, binormal.z, gl_Normal.z ); // Transforms float2 UV by scale/bias property (new method) // GLSL ES does not support ## concat operator so we also provide macro that expects xxx_ST #define TRANSFORM_TEX_ST(tex,namest) (tex.xy * namest.xy + namest.zw) #ifndef GL_ES #define TRANSFORM_TEX(tex,name) TRANSFORM_TEX_ST(tex, name##_ST) #endif // Deprecated. Used to transform 4D UV by a fixed function texture matrix. Now just returns the passed UV. #define TRANSFORM_UV(idx) (gl_TexCoord[0].xy) #endif // VERTEX // Calculates UV offset for parallax bump mapping vec2 ParallaxOffset( float h, float height, vec3 viewDir ) { h = h * height - height/2.0; vec3 v = normalize(viewDir); v.z += 0.42; return h * (v.xy / v.z); } // Converts color to luminance (grayscale) float Luminance( vec3 c ) { return dot( c, vec3(0.22, 0.707, 0.071) ); } #endif