mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-12-01 03:47:07 -05:00
179 lines
5.5 KiB
Text
179 lines
5.5 KiB
Text
mat3 xll_constructMat3( mat4 m) {
|
|
return mat3( vec3( m[0]), vec3( m[1]), vec3( m[2]));
|
|
}
|
|
struct v2f_vertex_lit {
|
|
vec2 uv;
|
|
vec4 diff;
|
|
vec4 spec;
|
|
};
|
|
struct v2f_img {
|
|
vec4 pos;
|
|
vec2 uv;
|
|
};
|
|
struct appdata_img {
|
|
vec4 vertex;
|
|
vec2 texcoord;
|
|
};
|
|
struct SurfaceOutput {
|
|
vec3 Albedo;
|
|
vec3 Normal;
|
|
vec3 Emission;
|
|
float Specular;
|
|
float Gloss;
|
|
float Alpha;
|
|
};
|
|
struct Input {
|
|
vec2 uv_Control;
|
|
vec2 uv_Splat0;
|
|
vec2 uv_Splat1;
|
|
vec2 uv_Splat2;
|
|
vec2 uv_Splat3;
|
|
};
|
|
struct v2f_surf {
|
|
vec4 pos;
|
|
float fog;
|
|
vec4 hip_pack0;
|
|
vec4 hip_pack1;
|
|
vec2 hip_pack2;
|
|
vec3 normal;
|
|
vec3 vlight;
|
|
vec4 _ShadowCoord;
|
|
};
|
|
struct appdata_full {
|
|
vec4 vertex;
|
|
vec4 tangent;
|
|
vec3 normal;
|
|
vec4 texcoord;
|
|
vec4 texcoord1;
|
|
vec4 color;
|
|
};
|
|
uniform vec4 _Control_ST;
|
|
uniform mat4 _Object2World;
|
|
uniform vec4 _ProjectionParams;
|
|
uniform vec4 _Splat0_ST;
|
|
uniform vec4 _Splat1_ST;
|
|
uniform vec4 _Splat2_ST;
|
|
uniform vec4 _Splat3_ST;
|
|
|
|
uniform vec4 unity_4LightAtten0;
|
|
uniform vec4 unity_4LightPosX0;
|
|
uniform vec4 unity_4LightPosY0;
|
|
uniform vec4 unity_4LightPosZ0;
|
|
uniform vec3 unity_LightColor0;
|
|
uniform vec3 unity_LightColor1;
|
|
uniform vec3 unity_LightColor2;
|
|
uniform vec3 unity_LightColor3;
|
|
uniform vec4 unity_SHAb;
|
|
uniform vec4 unity_SHAg;
|
|
uniform vec4 unity_SHAr;
|
|
uniform vec4 unity_SHBb;
|
|
uniform vec4 unity_SHBg;
|
|
uniform vec4 unity_SHBr;
|
|
uniform vec4 unity_SHC;
|
|
uniform vec4 unity_Scale;
|
|
vec3 ShadeSH9( in vec4 normal );
|
|
vec3 Shade4PointLights( in vec4 lightPosX, in vec4 lightPosY, in vec4 lightPosZ, in vec3 lightColor0, in vec3 lightColor1, in vec3 lightColor2, in vec3 lightColor3, in vec4 lightAttenSq, in vec3 pos, in vec3 normal );
|
|
void PositionFog( in vec4 v, out vec4 pos, out float fog );
|
|
vec4 ComputeScreenPos( in vec4 pos );
|
|
v2f_surf vert_surf( in appdata_full v );
|
|
vec3 ShadeSH9( in vec4 normal ) {
|
|
vec3 x1;
|
|
vec4 vB;
|
|
vec3 x2;
|
|
float vC;
|
|
vec3 x3;
|
|
x1.x = dot( unity_SHAr, normal);
|
|
x1.y = dot( unity_SHAg, normal);
|
|
x1.z = dot( unity_SHAb, normal);
|
|
vB = (normal.xyzz * normal.yzzx );
|
|
x2.x = dot( unity_SHBr, vB);
|
|
x2.y = dot( unity_SHBg, vB);
|
|
x2.z = dot( unity_SHBb, vB);
|
|
vC = ((normal.x * normal.x ) - (normal.y * normal.y ));
|
|
x3 = (unity_SHC.xyz * vC);
|
|
return ((x1 + x2) + x3);
|
|
}
|
|
vec3 Shade4PointLights( in vec4 lightPosX, in vec4 lightPosY, in vec4 lightPosZ, in vec3 lightColor0, in vec3 lightColor1, in vec3 lightColor2, in vec3 lightColor3, in vec4 lightAttenSq, in vec3 pos, in vec3 normal ) {
|
|
vec4 toLightX;
|
|
vec4 toLightY;
|
|
vec4 toLightZ;
|
|
vec4 lengthSq;
|
|
vec4 ndotl;
|
|
vec4 corr;
|
|
vec4 atten;
|
|
vec4 diff;
|
|
vec3 col;
|
|
toLightX = (lightPosX - pos.x );
|
|
toLightY = (lightPosY - pos.y );
|
|
toLightZ = (lightPosZ - pos.z );
|
|
lengthSq = vec4( 0.000000);
|
|
lengthSq += (toLightX * toLightX);
|
|
lengthSq += (toLightY * toLightY);
|
|
lengthSq += (toLightZ * toLightZ);
|
|
ndotl = vec4( 0.000000);
|
|
ndotl += (toLightX * normal.x );
|
|
ndotl += (toLightY * normal.y );
|
|
ndotl += (toLightZ * normal.z );
|
|
corr = inversesqrt( lengthSq );
|
|
ndotl = max( vec4( 0.000000, 0.000000, 0.000000, 0.000000), (ndotl * corr));
|
|
atten = (1.00000 / (1.00000 + (lengthSq * lightAttenSq)));
|
|
diff = (ndotl * atten);
|
|
col = vec3( 0.000000);
|
|
col += (lightColor0 * diff.x );
|
|
col += (lightColor1 * diff.y );
|
|
col += (lightColor2 * diff.z );
|
|
col += (lightColor3 * diff.w );
|
|
return col;
|
|
}
|
|
void PositionFog( in vec4 v, out vec4 pos, out float fog ) {
|
|
pos = ( gl_ModelViewProjectionMatrix * v );
|
|
fog = pos.z ;
|
|
}
|
|
vec4 ComputeScreenPos( in vec4 pos ) {
|
|
vec4 o;
|
|
o = (pos * 0.500000);
|
|
o.xy = (vec2( o.x , (o.y * _ProjectionParams.x )) + o.w );
|
|
o.zw = pos.zw ;
|
|
return o;
|
|
}
|
|
v2f_surf vert_surf( in appdata_full v ) {
|
|
v2f_surf o;
|
|
vec3 worldN;
|
|
vec3 shlight;
|
|
vec3 worldPos;
|
|
PositionFog( v.vertex, o.pos, o.fog);
|
|
o.hip_pack0.xy = ((v.texcoord.xy * _Control_ST.xy ) + _Control_ST.zw );
|
|
o.hip_pack0.zw = ((v.texcoord.xy * _Splat0_ST.xy ) + _Splat0_ST.zw );
|
|
o.hip_pack1.xy = ((v.texcoord.xy * _Splat1_ST.xy ) + _Splat1_ST.zw );
|
|
o.hip_pack1.zw = ((v.texcoord.xy * _Splat2_ST.xy ) + _Splat2_ST.zw );
|
|
o.hip_pack2.xy = ((v.texcoord.xy * _Splat3_ST.xy ) + _Splat3_ST.zw );
|
|
worldN = ( xll_constructMat3( _Object2World) * (v.normal * unity_Scale.w ) );
|
|
o.normal = worldN;
|
|
shlight = ShadeSH9( vec4( worldN, 1.00000));
|
|
o.vlight = shlight;
|
|
worldPos = ( _Object2World * v.vertex ).xyz ;
|
|
o.vlight += Shade4PointLights( unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, unity_LightColor0, unity_LightColor1, unity_LightColor2, unity_LightColor3, unity_4LightAtten0, worldPos, worldN);
|
|
o._ShadowCoord = ComputeScreenPos( o.pos);
|
|
return o;
|
|
}
|
|
attribute vec4 TANGENT;
|
|
varying vec4 xlv_FOG;
|
|
void main() {
|
|
v2f_surf xl_retval;
|
|
appdata_full xlt_v;
|
|
xlt_v.vertex = vec4( gl_Vertex);
|
|
xlt_v.tangent = vec4( TANGENT);
|
|
xlt_v.normal = vec3( gl_Normal);
|
|
xlt_v.texcoord = vec4( gl_MultiTexCoord0);
|
|
xlt_v.texcoord1 = vec4( gl_MultiTexCoord1);
|
|
xlt_v.color = vec4( gl_Color);
|
|
xl_retval = vert_surf( xlt_v);
|
|
gl_Position = vec4( xl_retval.pos);
|
|
xlv_FOG = vec4( xl_retval.fog, 0.0, 0.0, 0.0);
|
|
gl_TexCoord[0] = vec4( xl_retval.hip_pack0);
|
|
gl_TexCoord[1] = vec4( xl_retval.hip_pack1);
|
|
gl_TexCoord[2] = vec4( xl_retval.hip_pack2, 0.0, 0.0);
|
|
gl_TexCoord[3] = vec4( xl_retval.normal, 0.0);
|
|
gl_TexCoord[4] = vec4( xl_retval.vlight, 0.0);
|
|
gl_TexCoord[5] = vec4( xl_retval._ShadowCoord);
|
|
}
|