You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
11 KiB
170 lines
11 KiB
2 years ago
|
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
||
|
|
||
|
#ifndef MARMO_CONVOLVE_CGINC
|
||
|
#define MARMO_CONVOLVE_CGINC
|
||
|
|
||
|
uniform samplerCUBE _CubeHDR;
|
||
|
uniform float _SpecularScale;
|
||
|
uniform float _SpecularExp;
|
||
|
uniform float _ImportantLog;
|
||
|
|
||
|
//{ r1, r2, cos( 2*pi*r2 ), sin( 2*pi*r2 ) }
|
||
|
uniform float4
|
||
|
_PhongRands0, _PhongRands1, _PhongRands2, _PhongRands3,
|
||
|
_PhongRands4, _PhongRands5, _PhongRands6, _PhongRands7,
|
||
|
_PhongRands8, _PhongRands9, _PhongRands10, _PhongRands11,
|
||
|
_PhongRands12, _PhongRands13, _PhongRands14, _PhongRands15,
|
||
|
_PhongRands16, _PhongRands17, _PhongRands18, _PhongRands19,
|
||
|
_PhongRands20, _PhongRands21, _PhongRands22, _PhongRands23,
|
||
|
_PhongRands24, _PhongRands25, _PhongRands26, _PhongRands27,
|
||
|
_PhongRands28, _PhongRands29, _PhongRands30, _PhongRands31;
|
||
|
#if SPECULAR_IMPORTANCE_SAMPLES>32
|
||
|
uniform float4
|
||
|
_PhongRands32, _PhongRands33, _PhongRands34, _PhongRands35,
|
||
|
_PhongRands36, _PhongRands37, _PhongRands38, _PhongRands39,
|
||
|
_PhongRands40, _PhongRands41, _PhongRands42, _PhongRands43,
|
||
|
_PhongRands44, _PhongRands45, _PhongRands46, _PhongRands47,
|
||
|
_PhongRands48, _PhongRands49, _PhongRands50, _PhongRands51,
|
||
|
_PhongRands52, _PhongRands53, _PhongRands54, _PhongRands55,
|
||
|
_PhongRands56, _PhongRands57, _PhongRands58, _PhongRands59,
|
||
|
_PhongRands60, _PhongRands61, _PhongRands62, _PhongRands63;
|
||
|
#endif
|
||
|
#if SPECULAR_IMPORTANCE_SAMPLES>64
|
||
|
uniform float4
|
||
|
_PhongRands64, _PhongRands65, _PhongRands66, _PhongRands67,
|
||
|
_PhongRands68, _PhongRands69, _PhongRands70, _PhongRands71,
|
||
|
_PhongRands72, _PhongRands73, _PhongRands74, _PhongRands75,
|
||
|
_PhongRands76, _PhongRands77, _PhongRands78, _PhongRands79,
|
||
|
_PhongRands80, _PhongRands81, _PhongRands82, _PhongRands83,
|
||
|
_PhongRands84, _PhongRands85, _PhongRands86, _PhongRands87,
|
||
|
_PhongRands88, _PhongRands89, _PhongRands90, _PhongRands91,
|
||
|
_PhongRands92, _PhongRands93, _PhongRands94, _PhongRands95,
|
||
|
_PhongRands96, _PhongRands97, _PhongRands98, _PhongRands99,
|
||
|
_PhongRands100, _PhongRands101, _PhongRands102, _PhongRands103,
|
||
|
_PhongRands104, _PhongRands105, _PhongRands106, _PhongRands107,
|
||
|
_PhongRands108, _PhongRands109, _PhongRands110, _PhongRands111,
|
||
|
_PhongRands112, _PhongRands113, _PhongRands114, _PhongRands115,
|
||
|
_PhongRands116, _PhongRands117, _PhongRands118, _PhongRands119,
|
||
|
_PhongRands120, _PhongRands121, _PhongRands122, _PhongRands123,
|
||
|
_PhongRands124, _PhongRands125, _PhongRands126, _PhongRands127;
|
||
|
#endif
|
||
|
|
||
|
//Forces gamma-space rendering to still return linear values from sRGB textures.
|
||
|
//Call on textures that do NOT bypass sRGB sampling.
|
||
|
half4 forceLinear3(half4 c) {
|
||
|
c.rgb = lerp(sRGBToLinear3(c.rgb), c.rgb, IS_LINEAR);
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
//returns a random hemisphere vector, with probabilty weighted to a pow() lobe of 'specExp'
|
||
|
float3 phongImportanceSample( float4 r, float specExp )
|
||
|
{
|
||
|
float cos_theta = pow( r.x, 1.0 / (specExp + 1.0) );
|
||
|
float sin_theta = sqrt( 1.0 - cos_theta*cos_theta );
|
||
|
float cos_phi = r.z;
|
||
|
float sin_phi = r.w;
|
||
|
return float3( cos_phi*sin_theta, sin_phi*sin_theta, cos_theta );
|
||
|
}
|
||
|
|
||
|
float3 importanceLookup( float3 r, float3 x, float3 y, float3 z, float4 rand ){
|
||
|
float3 dir = phongImportanceSample(rand, _SpecularExp);
|
||
|
float3 localDir = dir.x*x + dir.y*y + dir.z*z;
|
||
|
|
||
|
float pdf = (_SpecularExp + 1.0)/(2.0 * 3.14159) * pow( saturate( dot(localDir,r) ), _SpecularExp );
|
||
|
float lod = _ImportantLog - 0.5*log2( pdf );
|
||
|
|
||
|
float4 lookup;
|
||
|
lookup.xyz = localDir;//reflect( -s.vertexEye, localDir );
|
||
|
lookup.w = lod;
|
||
|
float4 result = texCUBElod(_CubeHDR, lookup);
|
||
|
|
||
|
//importance sampling always happens in linear space
|
||
|
#if MARMO_RGBM_INPUT_ON
|
||
|
result = forceLinear3(result);
|
||
|
result.rgb *= pow(result.a*6.0, 2.2);
|
||
|
#endif
|
||
|
return (1.0/float(SPECULAR_IMPORTANCE_SAMPLES)) * result.rgb;
|
||
|
}
|
||
|
|
||
|
struct appdata_t {
|
||
|
float4 vertex : POSITION;
|
||
|
float3 texcoord : TEXCOORD0;
|
||
|
};
|
||
|
|
||
|
struct v2f {
|
||
|
float4 vertex : POSITION;
|
||
|
float3 texcoord : TEXCOORD0;
|
||
|
};
|
||
|
|
||
|
v2f convolveVert (appdata_t v) {
|
||
|
v2f o;
|
||
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
||
|
o.texcoord = v.texcoord;
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
half4 convolveFrag (v2f i) : COLOR {
|
||
|
float3 n = normalize(mulVec3(_SkyMatrix, normalize(i.texcoord)));
|
||
|
|
||
|
//sample the reflection map repeatedly, with an importance-based sample distribution
|
||
|
float3 bx = normalize(cross(n,float3(0.0, 1.0, saturate(n.y*10000.0 - 9999.0))));
|
||
|
float3 by = normalize(cross(bx,n));
|
||
|
float3 bz = normalize(n);
|
||
|
float3 spec = float3(0.0,0.0,0.0);
|
||
|
|
||
|
spec =
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands0) + importanceLookup(n, bx, by, bz, _PhongRands1) + importanceLookup(n, bx, by, bz, _PhongRands2) + importanceLookup(n, bx, by, bz, _PhongRands3) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands4) + importanceLookup(n, bx, by, bz, _PhongRands5) + importanceLookup(n, bx, by, bz, _PhongRands6) + importanceLookup(n, bx, by, bz, _PhongRands7) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands8) + importanceLookup(n, bx, by, bz, _PhongRands9) + importanceLookup(n, bx, by, bz, _PhongRands10) + importanceLookup(n, bx, by, bz, _PhongRands11) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands12) + importanceLookup(n, bx, by, bz, _PhongRands13) + importanceLookup(n, bx, by, bz, _PhongRands14) + importanceLookup(n, bx, by, bz, _PhongRands15) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands16) + importanceLookup(n, bx, by, bz, _PhongRands17) + importanceLookup(n, bx, by, bz, _PhongRands18) + importanceLookup(n, bx, by, bz, _PhongRands19) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands20) + importanceLookup(n, bx, by, bz, _PhongRands21) + importanceLookup(n, bx, by, bz, _PhongRands22) + importanceLookup(n, bx, by, bz, _PhongRands23) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands24) + importanceLookup(n, bx, by, bz, _PhongRands25) + importanceLookup(n, bx, by, bz, _PhongRands26) + importanceLookup(n, bx, by, bz, _PhongRands27) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands28) + importanceLookup(n, bx, by, bz, _PhongRands29) + importanceLookup(n, bx, by, bz, _PhongRands30) + importanceLookup(n, bx, by, bz, _PhongRands31);
|
||
|
#if SPECULAR_IMPORTANCE_SAMPLES>32
|
||
|
spec +=
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands32) + importanceLookup(n, bx, by, bz, _PhongRands33) + importanceLookup(n, bx, by, bz, _PhongRands34) + importanceLookup(n, bx, by, bz, _PhongRands35) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands36) + importanceLookup(n, bx, by, bz, _PhongRands37) + importanceLookup(n, bx, by, bz, _PhongRands38) + importanceLookup(n, bx, by, bz, _PhongRands39) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands40) + importanceLookup(n, bx, by, bz, _PhongRands41) + importanceLookup(n, bx, by, bz, _PhongRands42) + importanceLookup(n, bx, by, bz, _PhongRands43) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands44) + importanceLookup(n, bx, by, bz, _PhongRands45) + importanceLookup(n, bx, by, bz, _PhongRands46) + importanceLookup(n, bx, by, bz, _PhongRands47) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands48) + importanceLookup(n, bx, by, bz, _PhongRands49) + importanceLookup(n, bx, by, bz, _PhongRands50) + importanceLookup(n, bx, by, bz, _PhongRands51) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands52) + importanceLookup(n, bx, by, bz, _PhongRands53) + importanceLookup(n, bx, by, bz, _PhongRands54) + importanceLookup(n, bx, by, bz, _PhongRands55) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands56) + importanceLookup(n, bx, by, bz, _PhongRands57) + importanceLookup(n, bx, by, bz, _PhongRands58) + importanceLookup(n, bx, by, bz, _PhongRands59) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands60) + importanceLookup(n, bx, by, bz, _PhongRands61) + importanceLookup(n, bx, by, bz, _PhongRands62) + importanceLookup(n, bx, by, bz, _PhongRands63);
|
||
|
#endif
|
||
|
#if SPECULAR_IMPORTANCE_SAMPLES>64
|
||
|
spec +=
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands64) + importanceLookup(n, bx, by, bz, _PhongRands65) + importanceLookup(n, bx, by, bz, _PhongRands66) + importanceLookup(n, bx, by, bz, _PhongRands67) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands68) + importanceLookup(n, bx, by, bz, _PhongRands69) + importanceLookup(n, bx, by, bz, _PhongRands70) + importanceLookup(n, bx, by, bz, _PhongRands71) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands72) + importanceLookup(n, bx, by, bz, _PhongRands73) + importanceLookup(n, bx, by, bz, _PhongRands74) + importanceLookup(n, bx, by, bz, _PhongRands75) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands76) + importanceLookup(n, bx, by, bz, _PhongRands77) + importanceLookup(n, bx, by, bz, _PhongRands78) + importanceLookup(n, bx, by, bz, _PhongRands79) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands80) + importanceLookup(n, bx, by, bz, _PhongRands81) + importanceLookup(n, bx, by, bz, _PhongRands82) + importanceLookup(n, bx, by, bz, _PhongRands83) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands84) + importanceLookup(n, bx, by, bz, _PhongRands85) + importanceLookup(n, bx, by, bz, _PhongRands86) + importanceLookup(n, bx, by, bz, _PhongRands87) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands88) + importanceLookup(n, bx, by, bz, _PhongRands89) + importanceLookup(n, bx, by, bz, _PhongRands90) + importanceLookup(n, bx, by, bz, _PhongRands91) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands92) + importanceLookup(n, bx, by, bz, _PhongRands93) + importanceLookup(n, bx, by, bz, _PhongRands94) + importanceLookup(n, bx, by, bz, _PhongRands95) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands96) + importanceLookup(n, bx, by, bz, _PhongRands97) + importanceLookup(n, bx, by, bz, _PhongRands98) + importanceLookup(n, bx, by, bz, _PhongRands99) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands100) + importanceLookup(n, bx, by, bz, _PhongRands101) + importanceLookup(n, bx, by, bz, _PhongRands102) + importanceLookup(n, bx, by, bz, _PhongRands103) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands104) + importanceLookup(n, bx, by, bz, _PhongRands105) + importanceLookup(n, bx, by, bz, _PhongRands106) + importanceLookup(n, bx, by, bz, _PhongRands107) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands108) + importanceLookup(n, bx, by, bz, _PhongRands109) + importanceLookup(n, bx, by, bz, _PhongRands110) + importanceLookup(n, bx, by, bz, _PhongRands111) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands112) + importanceLookup(n, bx, by, bz, _PhongRands113) + importanceLookup(n, bx, by, bz, _PhongRands114) + importanceLookup(n, bx, by, bz, _PhongRands115) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands116) + importanceLookup(n, bx, by, bz, _PhongRands117) + importanceLookup(n, bx, by, bz, _PhongRands118) + importanceLookup(n, bx, by, bz, _PhongRands119) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands120) + importanceLookup(n, bx, by, bz, _PhongRands121) + importanceLookup(n, bx, by, bz, _PhongRands122) + importanceLookup(n, bx, by, bz, _PhongRands123) +
|
||
|
importanceLookup(n, bx, by, bz, _PhongRands124) + importanceLookup(n, bx, by, bz, _PhongRands125) + importanceLookup(n, bx, by, bz, _PhongRands126) + importanceLookup(n, bx, by, bz, _PhongRands127);
|
||
|
#endif
|
||
|
|
||
|
float4 result = float4(0.0,0.0,0.0,1.0);
|
||
|
result.rgb = spec * _SpecularScale;
|
||
|
|
||
|
#if MARMO_RGBM_OUTPUT_ON
|
||
|
result = HDRtoRGBM(result);
|
||
|
//output gets converted to sRGB by gamma correction, premptively undo it
|
||
|
result.rgb = lerp(result.rgb, sRGBToLinear3(result.rgb), IS_LINEAR);
|
||
|
return result;
|
||
|
#else
|
||
|
result.a = 1.0;
|
||
|
#endif
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
#endif
|