Bläddra i källkod

Improved default HDR bloom shader, render textures are linearly filtered and clamped by default now

Ivan Safrin 9 år sedan
förälder
incheckning
94a2e656f7

BIN
assets/default/hdr.pak


+ 5 - 12
assets/default/hdr/ExtractBloom.frag

@@ -1,16 +1,9 @@
 uniform sampler2D screenColorBuffer;
-uniform float brightThreshold;
-varying vec2 texCoordVar;
-
-void main(void)
-{	
-	vec4 color =  texture2D(screenColorBuffer, texCoordVar);
-	float lum = dot(vec4(0.30, 0.59, 0.11, 0.0), color);
-
-    if (lum > brightThreshold)
-        gl_FragColor = color;
-    else
-        gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);		
+uniform vec4 scale;
+uniform vec4 bias;
 
+varying vec2 texCoordVar;
 
+void main(void) {	
+	gl_FragColor = max(vec4(0.0), texture2D(screenColorBuffer, texCoordVar) - bias) * scale;
 }

+ 36 - 10
assets/default/hdr/HDRBloomH.frag

@@ -5,15 +5,41 @@ varying vec2 texCoordVar;
 void main(void)
 {
    vec4 sum = vec4(0.0);
-   sum += texture2D(screenTexture, vec2(texCoordVar.x - 4.0*blurSize, texCoordVar.y)) * 0.05;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x - 3.0*blurSize, texCoordVar.y)) * 0.09;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x - 2.0*blurSize, texCoordVar.y)) * 0.12;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x - blurSize, texCoordVar.y)) * 0.15;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.16;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x + blurSize, texCoordVar.y)) * 0.15;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x + 2.0*blurSize, texCoordVar.y)) * 0.12;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x + 3.0*blurSize, texCoordVar.y)) * 0.09;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x + 4.0*blurSize, texCoordVar.y)) * 0.05;
+
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 16.0*blurSize, texCoordVar.y)) * 0.000004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 15.0*blurSize, texCoordVar.y)) * 0.000012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 14.0*blurSize, texCoordVar.y)) * 0.00004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 13.0*blurSize, texCoordVar.y)) * 0.00012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 12.0*blurSize, texCoordVar.y)) * 0.000331;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 11.0*blurSize, texCoordVar.y)) * 0.000841;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 10.0*blurSize, texCoordVar.y)) * 0.001971;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 9.0*blurSize, texCoordVar.y)) * 0.004258;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 8.0*blurSize, texCoordVar.y)) * 0.008483;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 7.0*blurSize, texCoordVar.y)) * 0.015583;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 6.0*blurSize, texCoordVar.y)) * 0.026396;      
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 5.0*blurSize, texCoordVar.y)) * 0.04123;   
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 4.0*blurSize, texCoordVar.y)) * 0.059384;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 3.0*blurSize, texCoordVar.y)) * 0.07887;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 2.0*blurSize, texCoordVar.y)) * 0.096593;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x - 1.0*blurSize, texCoordVar.y)) * 0.109084;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.113597;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 16.0*blurSize, texCoordVar.y)) * 0.000004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 15.0*blurSize, texCoordVar.y)) * 0.000012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 14.0*blurSize, texCoordVar.y)) * 0.00004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 13.0*blurSize, texCoordVar.y)) * 0.00012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 12.0*blurSize, texCoordVar.y)) * 0.000331;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 11.0*blurSize, texCoordVar.y)) * 0.000841;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 10.0*blurSize, texCoordVar.y)) * 0.001971;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 9.0*blurSize, texCoordVar.y)) * 0.004258;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 8.0*blurSize, texCoordVar.y)) * 0.008483;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 7.0*blurSize, texCoordVar.y)) * 0.015583;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 6.0*blurSize, texCoordVar.y)) * 0.026396;      
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 5.0*blurSize, texCoordVar.y)) * 0.04123;   
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 4.0*blurSize, texCoordVar.y)) * 0.059384;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 3.0*blurSize, texCoordVar.y)) * 0.07887;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 2.0*blurSize, texCoordVar.y)) * 0.096593;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x + 1.0*blurSize, texCoordVar.y)) * 0.109084;
    
    gl_FragColor = sum;
-}
+}
+

+ 34 - 9
assets/default/hdr/HDRBloomV.frag

@@ -5,15 +5,40 @@ varying vec2 texCoordVar;
 void main(void)
 {
    vec4 sum = vec4(0.0);
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 4.0*blurSize)) * 0.05;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 3.0*blurSize)) * 0.09;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - 2.0*blurSize)) * 0.12;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y - blurSize)) * 0.15;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.16;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + blurSize)) * 0.15;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 2.0*blurSize)) * 0.12;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 3.0*blurSize)) * 0.09;
-   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y + 4.0*blurSize)) * 0.05;
    
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 16.0*blurSize)) * 0.000004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 15.0*blurSize)) * 0.000012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 14.0*blurSize)) * 0.00004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 13.0*blurSize)) * 0.00012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 12.0*blurSize)) * 0.000331;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 11.0*blurSize)) * 0.000841;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 10.0*blurSize)) * 0.001971;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 9.0*blurSize)) * 0.004258;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 8.0*blurSize)) * 0.008483;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 7.0*blurSize)) * 0.015583;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 6.0*blurSize)) * 0.026396;      
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 5.0*blurSize)) * 0.04123;   
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 4.0*blurSize)) * 0.059384;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 3.0*blurSize)) * 0.07887;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 2.0*blurSize)) * 0.096593;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y- 1.0*blurSize)) * 0.109084;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y)) * 0.113597;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 16.0*blurSize)) * 0.000004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 15.0*blurSize)) * 0.000012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 14.0*blurSize)) * 0.00004;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 13.0*blurSize)) * 0.00012;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 12.0*blurSize)) * 0.000331;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 11.0*blurSize)) * 0.000841;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 10.0*blurSize)) * 0.001971;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 9.0*blurSize)) * 0.004258;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 8.0*blurSize)) * 0.008483;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 7.0*blurSize)) * 0.015583;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 6.0*blurSize)) * 0.026396;      
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 5.0*blurSize)) * 0.04123;   
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 4.0*blurSize)) * 0.059384;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 3.0*blurSize)) * 0.07887;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 2.0*blurSize)) * 0.096593;
+   sum += texture2D(screenTexture, vec2(texCoordVar.x, texCoordVar.y+ 1.0*blurSize)) * 0.109084;
+
    gl_FragColor = sum;
 }

+ 4 - 3
assets/default/hdr/HDRProcessBloom.frag

@@ -10,11 +10,12 @@ void main(void)
 	
 	vec4 colorBloom = texture2D(bloomTexture, texCoordVar);
 	vec4 color = texture2D(baseTexture, texCoordVar);
+
+	float YD = exposure * (exposure/brightMax + 1.0) / (exposure + 1.0);
+	color *= YD;
 	
 	color += colorBloom * bloomFactor;
-//	color = colorBloom * bloomFactor;
 	
-	float YD = exposure * (exposure/brightMax + 1.0) / (exposure + 1.0);
-	gl_FragColor = color * YD;
+	gl_FragColor = color;
 	gl_FragColor.a = 1.0;
 }

+ 3 - 3
assets/default/hdr/hdr.mat

@@ -48,9 +48,9 @@
 		</material>	
 		<material name="HDRProcessBloom" screen="true">
 			<rendertargets type="rgba_fp16">
-				<rendertarget id="bloomtarget"  sizeMode="pixels" width="512" height="512"/>
-				<rendertarget id="bloomtarget2"  sizeMode="pixels" width="512" height="512"/>				
-				<rendertarget id="bloomtarget_final"  sizeMode="pixels" width="512" height="512"/>
+				<rendertarget id="bloomtarget"  sizeMode="pixels" width="640" height="360"/>
+				<rendertarget id="bloomtarget2"  sizeMode="pixels" width="640" height="360"/>				
+				<rendertarget id="bloomtarget_final"  sizeMode="pixels" width="640" height="360"/>
 			</rendertargets>
 			<shader name="ExtractBloom">
 				<targettextures>			

+ 1 - 1
src/core/PolyTexture.cpp

@@ -26,7 +26,7 @@
 
 using namespace Polycode;
 
-Texture::Texture(unsigned int width, unsigned int height, char *textureData,bool clamp, bool createMipmaps, int type, bool framebufferTexture) : Resource(Resource::RESOURCE_TEXTURE), width(width), height(height), clamp(clamp), type(type), createMipmaps(createMipmaps), filteringMode(FILTERING_NEAREST), anisotropy(0), framebufferTexture(framebufferTexture), depthTexture(false) {
+Texture::Texture(unsigned int width, unsigned int height, char *textureData,bool clamp, bool createMipmaps, int type, bool framebufferTexture) : Resource(Resource::RESOURCE_TEXTURE), width(width), height(height), clamp(true), type(type), createMipmaps(createMipmaps), filteringMode(FILTERING_LINEAR), anisotropy(0), framebufferTexture(framebufferTexture), depthTexture(false) {
     
 	switch(type) {
 		case Image::IMAGE_RGB: