diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /KaplaDemo/externalIP/resources/shaders/dust_fs.cpp | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'KaplaDemo/externalIP/resources/shaders/dust_fs.cpp')
| -rw-r--r-- | KaplaDemo/externalIP/resources/shaders/dust_fs.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/KaplaDemo/externalIP/resources/shaders/dust_fs.cpp b/KaplaDemo/externalIP/resources/shaders/dust_fs.cpp new file mode 100644 index 00000000..43e0ed63 --- /dev/null +++ b/KaplaDemo/externalIP/resources/shaders/dust_fs.cpp @@ -0,0 +1,123 @@ +uniform sampler2DArrayShadow stex; +uniform float shadowAmbient = 0.3; + +float shadowCoef() +{ + const int index = 0; + /* + int index = 3; + + // find the appropriate depth map to look up in based on the depth of this fragment + if(gl_FragCoord.z < far_d.x) + index = 0; + else if(gl_FragCoord.z < far_d.y) + index = 1; + else if(gl_FragCoord.z < far_d.z) + index = 2; + */ + + // transform this fragment's position from view space to scaled light clip space + // such that the xy coordinates are in [0;1] + // note there is no need to divide by w for othogonal light sources + vec4 shadow_coord = gl_TextureMatrix[index]*vec4(gl_TexCoord[2].xyz, 1); + + shadow_coord.w = shadow_coord.z; + + // tell glsl in which layer to do the look up + shadow_coord.z = float(index); + + + // Gaussian 3x3 filter + return shadow2DArray(stex, shadow_coord).x; +} +uniform float ispotMaxDist; +uniform vec3 spotOriginEye; +uniform sampler2D spot_a0123; +uniform sampler2D spot_b123; + +uniform sampler2D smokeTex; + +const float PI = 3.1415926535897932384626433832795; +const vec3 _2pik = vec3(2.0) * vec3(PI,2.0*PI,3.0*PI); +const vec3 factor_a = vec3(2.0*PI)*vec3(1.0,2.0,3.0); +const vec3 factor_b = vec3(2.0*PI)*vec3(1.0,2.0,3.0); +const vec3 value_1 = vec3(1.0); + +uniform mat4 eyeToSpotMatrix; +void main() +{ + //gl_FragColor = gl_Color; + //return; +/* + gl_FragColor = texture2D(smokeTex, gl_TexCoord[0].xy); + gl_FragColor.w = gl_FragColor.r; + gl_FragColor.xyz = vec3(1,1,1); + return; +*/ + // calculate eye-space normal from texture coordinates + vec3 N; + N.xy = gl_TexCoord[0].xy*vec2(2.0, -2.0) + vec2(-1.0, 1.0); + float mag = dot(N.xy, N.xy); + if (mag > 1.0) discard; // kill pixels outside circle + + float falloff = pow(1.0-mag,1.0);//exp(-mag); + //falloff = 1.0f; + float shadowC = shadowCoef(); + + vec3 shadowColor = vec3(0.4, 0.4, 0.9)*0.8; + + // Also FOM + +// vec4 projectionCoordinate = eyeToSpotMatrix*vec4(gl_TexCoord[2].xyz, 1.0f); + vec4 projectionCoordinate = eyeToSpotMatrix*vec4(gl_TexCoord[2].xyz, 1.0f); + //gl_FragColor.xyz = gl_TexCoord[3].xyz*0.25f; + //gl_FragColor.xyz = projectionCoordinate.xyz / projectionCoordinate.w; + //gl_FragColor.w = 1.0f; + + //read Fourier series coefficients for color extinction on RGB + vec4 sR_a0123 = texture2DProj(spot_a0123,projectionCoordinate); + vec3 sR_b123 = texture2DProj(spot_b123,projectionCoordinate).rgb; + + //gl_FragColor.xyz = sR_a0123.xyz; + //gl_FragColor.w = 1.0f; + //return; + //compute absolute and normalized distance (in spot depth range) + float distance2spotCenter = length(spotOriginEye-gl_TexCoord[2].xyz);//distance from spot origin to surfel in world space + float d = distance2spotCenter*ispotMaxDist; + + + //compute some value to recover the extinction coefficient using the Fourier series + vec3 sin_a123 = sin(factor_a*vec3(d)); + vec3 cos_b123 = value_1-cos(factor_b*vec3(d)); + + //compute the extinction coefficients using Fourier + float att = (sR_a0123.r*d/2.0) + dot(sin_a123*(sR_a0123.gba/_2pik) ,value_1) + dot(cos_b123*(sR_b123.rgb/_2pik) ,value_1); + + att = max(0.0f, att); + att = min(1.0f, att); + shadowC *= (1.0f-att); + float inS = shadowC; + shadowC = (shadowAmbient + (1.0f -shadowAmbient)*shadowC); + //.... + if (gl_TexCoord[0].z > 1) shadowC = 1; + vec4 texColor = texture2D(smokeTex, gl_TexCoord[0].xy*0.25+gl_TexCoord[1].xy); + + gl_FragColor.xyz = (texColor.x)*gl_Color.xyz*(shadowColor + (vec3(1.0f,1,1) -shadowColor)*shadowC);//*falloff; + gl_FragColor.w = gl_Color.w*texColor.r; + + + //float fog = clamp(gl_Fog.scale*(gl_Fog.end+gl_TexCoord[2].z), 0.0, 1.0); + //float fog = exp(-gl_Fog.density*(gl_TexCoord[0].z*gl_TexCoord[0].z)); + //gl_FragColor = mix(gl_Fog.color, gl_FragColor, fog); + + gl_FragColor.xyz *= 1.6f; + gl_FragColor.w *= max(min(falloff,1.0f),0.0f) * max(min(gl_TexCoord[0].w,1.0f),0.0f); + //gl_FragColor.w = 1; + //gl_FragColor.xyz = vec3(shadowC, shadowC, shadowC); +// gl_FragColor.w = 0.2f; + //gl_FragColor.w = falloff * gl_TexCoord[0].w; + //gl_FragColor.xyz = sR_a0123.xyz; + gl_FragColor.xyz *= ((gl_TexCoord[0].z)+inS*0.3)*0.7; + //gl_FragDepth = gl_FragCoord.z - (1-mag)*0.00002; + +} |