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.
169 lines
11 KiB
169 lines
11 KiB
// 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
|
|
|