Browse Source

SSLR method 2

Panagiotis Christopoulos Charitos 11 years ago
parent
commit
345b54d2a4

+ 86 - 13
shaders/PpsSslr.frag.glsl

@@ -55,31 +55,104 @@ void main()
 	float specColor;
 	readNormalSpecularColorFromGBuffer(uMsRt, inTexCoords, normal, specColor);
 
+	//outColor = vec3(0.5, 0.0, 0.0);
+	outColor = vec3(0.0);
+
 	if(specColor < 0.5)
 	{
-		outColor = vec3(0.0);
 		return;
 	}
 
-	vec3 posv = readPosition(inTexCoords);
+	vec3 p0 = readPosition(inTexCoords);
 
 	// Reflection direction
-	vec3 rDir = reflect(normalize(posv), normal);
+	vec3 eye = normalize(p0);
+	vec3 r = reflect(eye, normal);
+
+#if 1
+	float t = -p0.z / (r.z + 0.000001);
+	vec3 p1 = p0 + r * t;
 
-	/*vec3 startpos = posv;
-	vec3 endpos = startpos + rDir * 1.0;
+	/*if(p1.z > 0.0)
+	{
+		outColor = vec3(1, 0.0, 1);
+		return;
+	}*/
 
-	vec3 startposproj = project(startpos);
-	vec3 endposproj = project(endpos);
+	vec2 pp0 = inTexCoords * 2.0 - 1.0;
+	vec3 pp1 = project(p1);
 
-	outColor = textureRt(uIsRt, endposproj.xy * 0.5 + 0.5).rgb;
-	outColor = vec3(0.0);*/
+	vec2 dir = pp1.xy - pp0;
+	vec2 path = dir * 0.5; // (pp1.xy/2+1/2)-(pp0.xy/2+1/2)
+	path *= vec2(float(WIDTH), float(HEIGHT));
+	path = abs(path);
+	float steps = max(path.x, path.y);
 
-#if 1
+	// XXX
+	float len = length(dir);
+	float stepD =  len / steps;
+	dir /= len;
+
+	steps = min(steps, 400.0);
+
+	for(float i = 1.0; i < steps; i += 1.0)
+	{
+		vec2 ndc = pp0 + dir * (i * stepD);
+
+		vec2 comp = abs(ndc);
+		if(comp.x > 1.0 || comp.y > 1.0)
+		{
+			//outColor = vec3(1, 0.0, 1);
+			return;
+		}
+
+		vec3 a;
+		a.z = -1.0;
+		a.xy = ndc * uProjectionParams.xy * a.z;
+		a = normalize(a);
+
+		vec3 c0 = cross(a, r);
+		vec3 c1 = cross(p0, r);
+		float k = c1.x / c0.x;
+
+		vec3 intersection = a * k;
+
+		vec2 texCoord = ndc * 0.5 + 0.5;
+		float depth = readZ(texCoord);
+
+		float diffDepth = depth - intersection.z;
+
+		/*if(i + 4.0 > 400.0)
+		{
+			outColor = vec3(pp1.zz, 0.0);
+			return;
+		}*/
+
+		if(diffDepth > 0.0)
+		{
+			if(diffDepth > 0.4)
+			{
+				//outColor = vec3(1.0);
+				return;
+			}
+
+			float factor = 1.0 - length(ndc.xy);
+			factor *= 1.0 - length(pp0.xy);
+
+			outColor = textureRt(uIsRt, texCoord).rgb * (factor * specColor);
+
+			//outColor = vec3(1.0 - abs(pp0.xy), 0.0);
+			return;
+		}
+	}
+#endif
+
+#if 0
 	vec3 pos = posv;
-	for(int i = 0; i < 500; i++)
+	int i;
+	for(i = 0; i < 200; i++)
 	{
-		pos += rDir * 0.1;
+		pos += r * 0.1;
 
 		vec4 posNdc = uProjectionMatrix * vec4(pos, 1.0);
 		posNdc.xyz /= posNdc.w;
@@ -111,7 +184,7 @@ void main()
 		}
 	}
 
-	//outColor = vec3(0.5, 0.0, 0.0);
 	outColor = vec3(0.0);
+	//outColor = vec3(float(i) / 100.0);
 #endif
 }

+ 4 - 0
src/gl/GlJobManager.cpp

@@ -105,6 +105,10 @@ void GlJobManager::stop()
 	{
 		std::unique_lock<std::mutex> lock(m_mtx);
 		m_renderingThreadSignal = 1;
+
+		// Set some dummy values in order to unlock the cond var
+		m_tail = m_queue.size() + 1;
+		m_head = m_tail + 1;
 	}
 	m_thread.join();
 #else

+ 2 - 2
src/renderer/MainRenderer.cpp

@@ -76,8 +76,8 @@ void MainRenderer::render(SceneGraph& scene)
 			rt = &getIs()._getRt();
 		}
 
-		//rt = &getPps().getSslr().m_rt;
-		//rt = &getMs()._getRt0();
+		rt = &getPps().getSslr().m_rt;
+		rt = &getMs()._getRt0();
 
 		rt->setFilter(lastJobs, GlTextureHandle::Filter::LINEAR);
 		rt->bind(lastJobs, 0);

+ 0 - 1
src/renderer/Renderer.cpp

@@ -148,7 +148,6 @@ void Renderer::init(const RendererInitializer& initializer)
 	m_is.init(initializer);
 	m_bs.init(initializer);
 	m_pps.init(initializer);
-	m_bs.init(initializer);
 	m_dbg.init(initializer);
 
 	// Init the shaderPostProcessorString

+ 4 - 0
src/renderer/Sslr.cpp

@@ -28,6 +28,10 @@ void Sslr::init(const RendererInitializer& initializer)
 	// Programs
 	std::stringstream pps;
 
+	pps << "#define WIDTH " << m_width 
+		<< "\n#define HEIGHT " << m_height
+		<< "\n";
+
 	m_reflectionFrag.load(ProgramResource::createSrcCodeToCache(
 		"shaders/PpsSslr.frag.glsl", pps.str().c_str(), "r_").c_str());
 

+ 7 - 6
src/scene/ParticleEmitter.cpp

@@ -246,7 +246,8 @@ ParticleEmitter::ParticleEmitter(
 	m_vertBuff = GlBufferHandle(jobs, GL_ARRAY_BUFFER, buffSize, 
 		GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT);
 
-	jobs.flush();
+	// TODO Optimize that to avoir serialization
+	jobs.finish();
 
 	m_vertBuffMapping = (U8*)m_vertBuff.getPersistentMappingAddress();
 }
@@ -386,7 +387,7 @@ void ParticleEmitter::frameUpdate(F32 prevUpdateTime, F32 crntTime,
 	m_aliveParticlesCount = 0;
 
 	F32* verts = (F32*)(m_vertBuffMapping 
-		+ (getGlobTimestamp() % 3) * m_vertBuff.getSize());
+		+ (getGlobTimestamp() % 3) * (m_vertBuff.getSize() / 3));
 	F32* verts_base = verts;
 	(void)verts_base;
 
@@ -407,6 +408,10 @@ void ParticleEmitter::frameUpdate(F32 prevUpdateTime, F32 crntTime,
 		{
 			// It's alive
 
+			// Do checks
+			ANKI_ASSERT(((PtrSize)verts + VERT_SIZE 
+				- (PtrSize)m_vertBuffMapping) <= m_vertBuff.getSize());
+
 			// This will calculate a new world transformation
 			p->simulate(*this, prevUpdateTime, crntTime);
 
@@ -440,10 +445,6 @@ void ParticleEmitter::frameUpdate(F32 prevUpdateTime, F32 crntTime,
 
 			++m_aliveParticlesCount;
 			verts += 5;
-
-			// Do checks
-			ANKI_ASSERT(
-				((PtrSize)verts - (PtrSize)verts_base) <= m_vertBuff.getSize());
 		}
 	}
 

+ 12 - 9
testapp/Main.cpp

@@ -224,16 +224,18 @@ void init()
 
 		if(i == 0)
 		{
-			/*scene.newSceneNode(pe, "pefire", "particles/fire.ankipart");
+			pe = scene.newSceneNode<ParticleEmitter>(
+				"pefire", "particles/fire.ankipart");
 			pe->setLocalOrigin(lightPos);
 
-			scene.newSceneNode(pe, "pesmoke", "particles/smoke.ankipart");
-			pe->setLocalOrigin(lightPos);*/
+			pe = scene.newSceneNode<ParticleEmitter>(
+				"pesmoke", "particles/smoke.ankipart");
+			pe->setLocalOrigin(lightPos);
 		}
-		/*else
+		else
 		{
 			InstanceNode* instance;
-			scene.newSceneNode(instance, 
+			instance = scene.newSceneNode<InstanceNode>( 
 				("pefire_inst" + std::to_string(i)).c_str());
 
 			instance->setLocalOrigin(lightPos);
@@ -241,8 +243,7 @@ void init()
 			SceneNode& sn = scene.findSceneNode("pefire");
 			sn.addChild(instance);
 
-
-			scene.newSceneNode(instance, 
+			instance = scene.newSceneNode<InstanceNode>(
 				("pesmoke_inst" + std::to_string(i)).c_str());
 
 			instance->setLocalOrigin(lightPos);
@@ -250,7 +251,7 @@ void init()
 			scene.findSceneNode("pesmoke").addChild(instance);
 		}
 
-		{
+		/*{
 			scene.newSceneNode(pe, ("pesparks" + std::to_string(i)).c_str(), 
 				"particles/sparks.ankipart");
 			pe->setLocalOrigin(lightPos);
@@ -551,6 +552,8 @@ void mainLoop()
 		increaseGlobTimestamp();
 	}
 
+	
+	GlManagerSingleton::get().destroy();
 	ANKI_COUNTER_STOP_TIMER_INC(FPS);
 
 	ANKI_COUNTERS_FLUSH();
@@ -566,7 +569,6 @@ void mainLoop()
 
 void makeCurrent(void* ctx)
 {
-	ANKI_ASSERT(ctx);
 	win->contextMakeCurrent(ctx);
 }
 
@@ -637,6 +639,7 @@ void initSubsystems(int argc, char* argv[])
 	initializer.set("pps.hdr.blurringIterationsCount", 1);
 	initializer.set("pps.hdr.exposure", 8.0);
 	initializer.set("pps.hdr.samples", 9);
+	initializer.set("pps.sslr.enabled", true);
 	initializer.set("pps.sslr.renderingQuality", 0.5);
 	initializer.set("pps.ssao.blurringIterationsNum", 1);
 	initializer.set("pps.ssao.enabled", true);