瀏覽代碼

Alternative blurring method. no difference on the same quality

Panagiotis Christopoulos Charitos 12 年之前
父節點
當前提交
d4817be956

+ 4 - 2
CMakeLists.txt

@@ -47,6 +47,8 @@ ENDIF()
 
 SET(ANKI_WINDOW_BACKEND "${_WIN_BACKEND}" CACHE STRING "The window backend (GLXX11 or EGLX11 or EGLFBDEV or DUMMY)")
 
+SET(ANKI_GCC_TO_STRING_WORKAROUND "0" CACHE STRING "Enable workaround for C++11 GCC bug (0 or 1)")
+
 #
 # Options that affect anki and extern
 #
@@ -204,12 +206,12 @@ MESSAGE("++ AnKi version: ${ANKI_VERSION_MAJOR}.${ANKI_VERSION_MINOR}")
 
 IF(CMAKE_BUILD_TYPE STREQUAL Debug)
 	MESSAGE("++ Debug build: true")
+	SET(ANKI_DEBUG 1)
 ELSE()
 	MESSAGE("++ Debug build: false")
+	SET(ANKI_DEBUG 0)
 ENDIF()
 
-SET(ANKI_GCC_TO_STRING_WORKAROUND "0" CACHE STRING "Enable workaround for C++11 GCC bug (0 or 1)")
-
 CONFIGURE_FILE("include/anki/Config.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/anki/Config.h")
 INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/anki/Config.h" DESTINATION "${INCLUDE_INSTALL_DIR}/anki")
 

+ 1 - 5
include/anki/Config.h.cmake

@@ -8,11 +8,7 @@
 #define ANKI_VERSION_MAJOR ${ANKI_VERSION_MAJOR}
 #define ANKI_REVISION ${ANKI_REVISION}
 
-#if defined(NDEBUG)
-#	define ANKI_DEBUG !NDEBUG
-#else
-#	define ANKI_DEBUG 1
-#endif
+#define ANKI_DEBUG ${ANKI_DEBUG}
 
 #define ANKI_FILE __FILE__
 #define ANKI_FUNC __func__

+ 0 - 0
include/anki/scene/Scene.h → include/anki/Scene.h


+ 2 - 0
shaders/Pps.glsl

@@ -106,6 +106,8 @@ void main(void)
 
 	fColor = gammaCorrectionRgb(vec3(0.9, 0.92, 0.75), fColor);
 
+	//fColor = clamp(fColor, 0.0, 1.0) * 0.0001 + vec3(ssao);
+
 #if 0
 	if(fColor.r != 0.00000001)
 	{

+ 120 - 0
shaders/VariableSamplingBlurGeneric.glsl

@@ -0,0 +1,120 @@
+/// Defines: 
+/// - VPASS or HPASS
+/// - COL_RGBA or COL_RGB or COL_R
+/// - SAMPLES is a number of 2 or 4 or 6
+
+#pragma anki start vertexShader
+
+layout(location = 0) in vec2 position;
+
+out vec2 vTexCoords;
+
+void main()
+{
+	vTexCoords = position;
+	gl_Position = vec4(position * 2.0 - 1.0, 0.0, 1.0);
+}
+
+#pragma anki start fragmentShader
+
+precision mediump float;
+
+// Preprocessor switches sanity checks
+#if !defined(VPASS) && !defined(HPASS)
+#	error See file
+#endif
+
+#if !(defined(COL_RGBA) || defined(COL_RGB) || defined(COL_R))
+#	error See file
+#endif
+
+#if !defined(IMG_DIMENSION)
+#	error See file
+#endif
+
+#if !defined(SAMPLES)
+#	error See file
+#endif
+
+uniform mediump sampler2D img; ///< Input FAI
+
+in vec2 vTexCoords;
+
+// Determine color type
+#if defined(COL_RGBA)
+#	define COL_TYPE vec4
+#elif defined(COL_RGB)
+#	define COL_TYPE vec3
+#elif defined(COL_R)
+#	define COL_TYPE float
+#endif
+
+// Determine tex fetch
+#if defined(COL_RGBA)
+#	define TEX_FETCH rgba
+#elif defined(COL_RGB)
+#	define TEX_FETCH rgb
+#elif defined(COL_R)
+#	define TEX_FETCH r
+#endif
+
+// Calc the kernel
+#if defined(VPASS)
+#	define BLURRING_OFFSET_X(val) (float(val) / float(IMG_DIMENSION))
+#	define BLURRING_OFFSET_Y(val) 0.0
+#else
+#	define BLURRING_OFFSET_X(val) 0.0
+#	define BLURRING_OFFSET_Y(val) (float(val) / float(IMG_DIMENSION))
+#endif
+
+#define BLURRING_OFFSET(v) vec2(BLURRING_OFFSET_X(v), BLURRING_OFFSET_Y(v))
+
+#if SAMPLES == 2
+const vec2 kernel[3] = vec2[](
+	BLURRING_OFFSET(-1),
+	BLURRING_OFFSET(0),
+	BLURRING_OFFSET(1));
+#elif SAMPLES == 4
+const vec2 kernel[5] = vec2[](
+	BLURRING_OFFSET(-2),
+	BLURRING_OFFSET(-1),
+	BLURRING_OFFSET(0),
+	BLURRING_OFFSET(1),
+	BLURRING_OFFSET(2));
+#elif SAMPLES == 6
+const vec2 kernel[7] = vec2[](
+	BLURRING_OFFSET(-3),
+	BLURRING_OFFSET(-2),
+	BLURRING_OFFSET(-1),
+	BLURRING_OFFSET(0),
+	BLURRING_OFFSET(1),
+	BLURRING_OFFSET(2),
+	BLURRING_OFFSET(3));
+#elif SAMPLES == 8
+const vec2 kernel[9] = vec2[](
+	BLURRING_OFFSET(-4),
+	BLURRING_OFFSET(-3),
+	BLURRING_OFFSET(-2),
+	BLURRING_OFFSET(-1),
+	BLURRING_OFFSET(0),
+	BLURRING_OFFSET(1),
+	BLURRING_OFFSET(2),
+	BLURRING_OFFSET(3),
+	BLURRING_OFFSET(4));
+#endif
+
+layout(location = 0) out COL_TYPE fFragColor;
+
+void main()
+{
+	// the color
+	COL_TYPE col = texture(img, vTexCoords + kernel[0]);
+
+	// Get the samples
+	for(int i = 1; i < SAMPLES; i++)
+	{
+		col += texture(img, vTexCoords + kernel[i]);
+	}
+
+	fFragColor = col * (1.0 / float(SAMPLES));
+}

+ 1 - 1
src/renderer/DebugDrawer.cpp

@@ -2,7 +2,7 @@
 #include "anki/resource/ShaderProgramResource.h"
 #include "anki/physics/Converters.h"
 #include "anki/Collision.h"
-#include "anki/scene/Scene.h"
+#include "anki/Scene.h"
 #include "anki/resource/TextureResource.h"
 #include "anki/renderer/Renderer.h"
 

+ 5 - 3
src/renderer/Ssao.cpp

@@ -94,17 +94,19 @@ void Ssao::initInternal(const RendererInitializer& initializer)
 	ssaoSProg->findUniformBlock("commonBlock").setBinding(0);
 
 	// blurring progs
-	const char* SHADER_FILENAME = "shaders/GaussianBlurGeneric.glsl";
+	const char* SHADER_FILENAME = "shaders/VariableSamplingBlurGeneric.glsl";
 
 	pps = "#define HPASS\n"
 		"#define COL_R\n"
-		"#define IMG_DIMENSION " + std::to_string(bWidth) + ".0\n";
+		"#define IMG_DIMENSION " + std::to_string(bHeight) + "\n"
+		"#define SAMPLES 8\n";
 	hblurSProg.load(ShaderProgramResource::createSrcCodeToCache(
 		SHADER_FILENAME, pps.c_str()).c_str());
 
 	pps = "#define VPASS\n"
 		"#define COL_R\n"
-		"#define IMG_DIMENSION " + std::to_string(bHeight) + ".0 \n";
+		"#define IMG_DIMENSION " + std::to_string(bWidth) + "\n"
+		"#define SAMPLES 8\n";
 	vblurSProg.load(ShaderProgramResource::createSrcCodeToCache(
 		SHADER_FILENAME, pps.c_str()).c_str());
 }

+ 7 - 3
testapp/Main.cpp

@@ -27,7 +27,7 @@
 #include "anki/core/ThreadPool.h"
 #include "anki/core/Timestamp.h"
 #include "anki/core/NativeWindow.h"
-#include "anki/scene/Scene.h"
+#include "anki/Scene.h"
 #include "anki/event/LightEvent.h"
 #include "anki/event/MovableEvent.h"
 #include "anki/core/Counters.h"
@@ -386,10 +386,14 @@ void mainLoopExtra()
 		MainRendererSingleton::get().getDbg().switchBits(
 			Dbg::DF_OCTREE);
 	}
-	if(in.getKey(KC_F12) == 1)
+	if(in.getKey(KC_F6) == 1)
 	{
 		MainRendererSingleton::get().getDbg().switchDepthTestEnabled();
 	}
+	if(in.getKey(KC_F12) == 1)
+	{
+		MainRendererSingleton::get().takeScreenshot("screenshot.tga");
+	}
 
 	if(in.getKey(KC_UP)) mover->rotateLocalX(ang);
 	if(in.getKey(KC_DOWN)) mover->rotateLocalX(-ang);
@@ -540,7 +544,7 @@ void initSubsystems(int argc, char* argv[])
 	initializer.pps.hdr.enabled = true;
 	initializer.pps.hdr.renderingQuality = 0.25;
 	initializer.pps.hdr.blurringDist = 1.0;
-	initializer.pps.hdr.blurringIterationsCount = 2;
+	initializer.pps.hdr.blurringIterationsCount = 1;
 	initializer.pps.hdr.exposure = 8.0;
 	initializer.pps.ssao.blurringIterationsNum = 2;
 	initializer.pps.ssao.enabled = true;