116 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (C) 2012 Jorge Jimenez (jorge@iryoku.com)
							 | 
						||
| 
								 | 
							
								// Copyright (C) 2012 Diego Gutierrez (diegog@unizar.es)
							 | 
						||
| 
								 | 
							
								// All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								// modification, are permitted provided that the following conditions are met:
							 | 
						||
| 
								 | 
							
								// 
							 | 
						||
| 
								 | 
							
								//    1. Redistributions of source code must retain the above copyright notice,
							 | 
						||
| 
								 | 
							
								//       this list of conditions and the following disclaimer.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//    2. Redistributions in binary form must reproduce the following disclaimer
							 | 
						||
| 
								 | 
							
								//       in the documentation and/or other materials provided with the 
							 | 
						||
| 
								 | 
							
								//       distribution:
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//       "Uses Separable SSS. Copyright (C) 2012 by Jorge Jimenez and Diego
							 | 
						||
| 
								 | 
							
								//        Gutierrez."
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS 
							 | 
						||
| 
								 | 
							
								// IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
							 | 
						||
| 
								 | 
							
								// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
							 | 
						||
| 
								 | 
							
								// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS 
							 | 
						||
| 
								 | 
							
								// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
							 | 
						||
| 
								 | 
							
								// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
							 | 
						||
| 
								 | 
							
								// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
							 | 
						||
| 
								 | 
							
								// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
							 | 
						||
| 
								 | 
							
								// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
							 | 
						||
| 
								 | 
							
								// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
							 | 
						||
| 
								 | 
							
								// POSSIBILITY OF SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// The views and conclusions contained in the software and documentation are 
							 | 
						||
| 
								 | 
							
								// those of the authors and should not be interpreted as representing official
							 | 
						||
| 
								 | 
							
								// policies, either expressed or implied, of the copyright holders.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#version 450
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "compiled.inc"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uniform sampler2D gbufferD;
							 | 
						||
| 
								 | 
							
								uniform sampler2D gbuffer0;
							 | 
						||
| 
								 | 
							
								uniform sampler2D tex;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uniform vec2 dir;
							 | 
						||
| 
								 | 
							
								uniform vec2 cameraProj;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								in vec2 texCoord;
							 | 
						||
| 
								 | 
							
								out vec4 fragColor;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const float SSSS_FOVY = 108.0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Separable SSS Reflectance
							 | 
						||
| 
								 | 
							
								// const float sssWidth = 0.005;
							 | 
						||
| 
								 | 
							
								vec4 SSSSBlur() {
							 | 
						||
| 
								 | 
							
									// Quality = 0
							 | 
						||
| 
								 | 
							
									const int SSSS_N_SAMPLES  = 11;
							 | 
						||
| 
								 | 
							
									vec4 kernel[SSSS_N_SAMPLES];		
							 | 
						||
| 
								 | 
							
									kernel[0] = vec4(0.560479, 0.669086, 0.784728, 0);
							 | 
						||
| 
								 | 
							
									kernel[1] = vec4(0.00471691, 0.000184771, 5.07566e-005, -2);
							 | 
						||
| 
								 | 
							
									kernel[2] = vec4(0.0192831, 0.00282018, 0.00084214, -1.28);
							 | 
						||
| 
								 | 
							
									kernel[3] = vec4(0.03639, 0.0130999, 0.00643685, -0.72);
							 | 
						||
| 
								 | 
							
									kernel[4] = vec4(0.0821904, 0.0358608, 0.0209261, -0.32);
							 | 
						||
| 
								 | 
							
									kernel[5] = vec4(0.0771802, 0.113491, 0.0793803, -0.08);
							 | 
						||
| 
								 | 
							
									kernel[6] = vec4(0.0771802, 0.113491, 0.0793803, 0.08);
							 | 
						||
| 
								 | 
							
									kernel[7] = vec4(0.0821904, 0.0358608, 0.0209261, 0.32);
							 | 
						||
| 
								 | 
							
									kernel[8] = vec4(0.03639, 0.0130999, 0.00643685, 0.72);
							 | 
						||
| 
								 | 
							
									kernel[9] = vec4(0.0192831, 0.00282018, 0.00084214, 1.28);
							 | 
						||
| 
								 | 
							
									kernel[10] = vec4(0.00471691, 0.000184771, 5.07565e-005, 2);
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									vec4 colorM = textureLod(tex, texCoord, 0.0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Fetch linear depth of current pixel
							 | 
						||
| 
								 | 
							
									float depth = textureLod(gbufferD, texCoord, 0.0).r;
							 | 
						||
| 
								 | 
							
									float depthM = cameraProj.y / (depth - cameraProj.x);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Calculate the sssWidth scale (1.0 for a unit plane sitting on the projection window)
							 | 
						||
| 
								 | 
							
									float distanceToProjectionWindow = 1.0 / tan(0.5 * radians(SSSS_FOVY));
							 | 
						||
| 
								 | 
							
									float scale = distanceToProjectionWindow / depthM;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Calculate the final step to fetch the surrounding pixels
							 | 
						||
| 
								 | 
							
									vec2 finalStep = sssWidth * scale * dir;
							 | 
						||
| 
								 | 
							
									finalStep *= 1.0;//SSSS_STREGTH_SOURCE; // Modulate it using the alpha channel.
							 | 
						||
| 
								 | 
							
									finalStep *= 1.0 / 3.0; // Divide by 3 as the kernels range from -3 to 3.
							 | 
						||
| 
								 | 
							
									finalStep *= 0.05; //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Accumulate the center sample:
							 | 
						||
| 
								 | 
							
									vec4 colorBlurred = colorM;
							 | 
						||
| 
								 | 
							
									colorBlurred.rgb *= kernel[0].rgb;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Accumulate the other samples
							 | 
						||
| 
								 | 
							
									for (int i = 1; i < SSSS_N_SAMPLES; i++) {
							 | 
						||
| 
								 | 
							
										// Fetch color and depth for current sample
							 | 
						||
| 
								 | 
							
										vec2 offset = texCoord + kernel[i].a * finalStep;
							 | 
						||
| 
								 | 
							
										vec4 color = textureLod(tex, offset, 0.0);
							 | 
						||
| 
								 | 
							
										//#if SSSS_FOLLOW_SURFACE == 1
							 | 
						||
| 
								 | 
							
										// If the difference in depth is huge, we lerp color back to "colorM":
							 | 
						||
| 
								 | 
							
										//float depth = textureLod(tex, offset, 0.0).r;
							 | 
						||
| 
								 | 
							
										//float s = clamp(300.0f * distanceToProjectionWindow * sssWidth * abs(depthM - depth),0.0,1.0);
							 | 
						||
| 
								 | 
							
										//color.rgb = mix(color.rgb, colorM.rgb, s);
							 | 
						||
| 
								 | 
							
										//#endif
							 | 
						||
| 
								 | 
							
										// Accumulate
							 | 
						||
| 
								 | 
							
										colorBlurred.rgb += kernel[i].rgb * color.rgb;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return colorBlurred;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void main() {
							 | 
						||
| 
								 | 
							
									if (textureLod(gbuffer0, texCoord, 0.0).a == 8192.0) {
							 | 
						||
| 
								 | 
							
										fragColor = clamp(SSSSBlur(), 0.0, 1.0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else {
							 | 
						||
| 
								 | 
							
										fragColor = textureLod(tex, texCoord, 0.0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |