Переглянути джерело

*Math bug fixed
*Buildting the particle emitter
*Investigating new way of calculating the HDR

Panagiotis Christopoulos Charitos 16 роки тому
батько
коміт
1aef3050dc
4 змінених файлів з 47 додано та 14 видалено
  1. 38 10
      shaders/PpsHdr.glsl
  2. 1 1
      src/Math/Mat4.inl.h
  3. 2 1
      src/Scene/Node.h
  4. 6 2
      src/Scene/ParticleEmitter.h

+ 38 - 10
shaders/PpsHdr.glsl

@@ -1,5 +1,6 @@
 /**
  * Pass 0 horizontal blur, pass 1 vertical, pass 2 median
+ * The offset of the bluring depends on the luminance of the current fragment
  */
 
 #pragma anki vertShaderBegins
@@ -12,7 +13,7 @@
 
 varying vec2 texCoords;
 
-uniform sampler2D fai;
+uniform sampler2D fai; ///< Its the IS FAI
 
 void main()
 {
@@ -25,20 +26,22 @@ void main()
 	return;*/
 
 	#if defined( _PPS_HDR_PASS_0_ ) || defined( _PPS_HDR_PASS_1_ )
-		const float super_offset = 1.5;
+		/*vec3 color = texture2D( fai, texCoords ).rgb
+		float luminance = dot( vec3(0.30, 0.59, 0.11) * color ); 
+	
+		const float maxAdditionalOffset = 2.0;
+		float additionalOffset = luminance * maxAdditionalOffset;
 
 		#if defined( _PPS_HDR_PASS_0_ )
-			float offset = 1.0 / IS_FAI_WIDTH * super_offset;
+			float offset = 1.0 / IS_FAI_WIDTH * additionalOffset;
 		#else
-			float offset = 1.0 / PASS0_HEIGHT * super_offset;
+			float offset = 1.0 / PASS0_HEIGHT * additionalOffset;
 		#endif
 
-		const int KERNEL_SIZE = 9;
-		float kernel[KERNEL_SIZE] = float[]( -3.0 * offset, -2.0 * offset, -1.0 * offset, 0.0 * offset, 1.0 * offset, 2.0 * offset,
+		const int KERNEL_SIZE = 8;
+		float kernel[KERNEL_SIZE] = float[]( -3.0 * offset, -2.0 * offset, -1.0 * offset, 1.0 * offset, 2.0 * offset,
 				                                  3.0 * offset, -4.0 * offset, 4.0 * offset );
 
-		vec3 color = vec3(0.0);
-
 		for( int i=0; i<KERNEL_SIZE; i++ )
 		{
 			#if defined( _PPS_HDR_PASS_0_ )
@@ -48,13 +51,38 @@ void main()
 			#endif
 		}
 
-		gl_FragData[0].rgb = color / KERNEL_SIZE;
+		const float denominator = 1.0 / (KERNEL_SIZE + 1); // Opt to make sure its const
+		gl_FragData[0].rgb = color * denominator;*/
+		
+		vec3 color = texture2D( fai, texCoords ).rgb
+		float luminance = dot( vec3(0.30, 0.59, 0.11) * color ); 
+	
+		#if defined( _PPS_HDR_PASS_0_ )
+			const float OFFSET = 1.0 / IS_FAI_WIDTH;
+		#else
+			const float OFFSET = 1.0 / PASS0_HEIGHT;
+		#endif
+
+		const float MAX_SAMPLES_NUM = 12.0;
+		float samplesNum = MAX_SAMPLES_NUM * luminance;
+		float samplesNumDiv2 = samplesNum/2.0;
+
+		for( float s=-samplesNumDiv2; s<=samplesNumDiv2; s += 1.0 )
+		{
+			#if defined( _PPS_HDR_PASS_0_ )
+				color += texture2D( fai, texCoords + vec2( s * OFFSET, 0.0 ) ).rgb;
+			#else // _PPS_HDR_PASS_1_
+				color += texture2D( fai, texCoords + vec2( 0.0, OFFSET * offset ) ).rgb;
+			#endif
+		}
+		
+		gl_FragData[0].rgb = color / ( floor(samplesNum) + 1.0 );
 
 	#else // _PPS_HDR_PASS_2_
 		//vec3 color = MedianFilterRGB( fai, texCoords );
 		vec3 color = texture2D( fai, texCoords ).rgb;
 
-		float Y = dot(vec3(0.30, 0.59, 0.11), color);
+		float Y = dot(vec3(0.30, 0.59, 0.11), color); // AKA luminance
 		const float exposure = 4.0;
 		const float brightMax = 4.0;
 		float YD = exposure * (exposure/brightMax + 1.0) / (exposure + 1.0) * Y;

+ 1 - 1
src/Math/Mat4.inl.h

@@ -153,7 +153,7 @@ inline Mat4::Mat4( float f )
 // constructor [Transform]
 inline Mat4::Mat4( const Transform& t )
 {
-	ME = Mat4( t.getOrigin(), Mat3(t.getRotation()) );
+	ME = Mat4( t.getOrigin(), Mat3(t.getRotation()), t.getScale() );
 }
 
 // 4x4 + 4x4

+ 2 - 1
src/Scene/Node.h

@@ -25,7 +25,8 @@ class Node
 			NT_CAMERA,
 			NT_MESH,
 			NT_SKELETON,
-			NT_SKEL_MODEL
+			NT_SKEL_MODEL,
+			NT_PARTICLE_EMITTER
 		};
 
 		Vec3  translationLspace;

+ 6 - 2
src/Scene/ParticleEmitter.h

@@ -4,13 +4,17 @@
 #include "Common.h"
 #include "Node.h"
 
+/**
+ *
+ */
 class ParticleEmitter: public Node
 {
 	public:
 
-		class Particle: public Node
+		class Particle: public MeshNode
 		{
-
+			public:
+				int life; ///< Life in ms
 		};
 
 		Vec<Particle*> particles;