Browse Source

Make everything work

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
2ae8a103c7

+ 16 - 2
programs/Irradiance.ankiprog

@@ -37,6 +37,19 @@ layout(ANKI_UBO_BINDING(0, 0)) uniform u0_
 	uvec4 u_faceIdxArrayIdxPad2;
 };
 
+float areaElement(float x, float y)
+{
+	return atan(x * y, sqrt(x * x + y * y + 1.0));
+}
+
+float cubeCoordSolidAngle(vec2 norm)
+{
+	float invSize = 1.0 / float(ENV_TEX_TILE_SIZE);
+	vec2 v0 = norm - vec2(invSize);
+	vec2 v1 = norm + vec2(invSize);
+	return areaElement(v0.x, v0.y) - areaElement(v0.x, v1.y) - areaElement(v1.x, v0.y) + areaElement(v1.x, v1.y);
+}
+
 // Integrate the environment map to compute the irradiance for a single fragment
 void main()
 {
@@ -64,14 +77,15 @@ void main()
 				{
 					vec3 col = textureLod(u_envTex, vec4(r, texArrIdx), ENV_TEX_MIP).rgb;
 
-					outCol += col * lambert;
+					outCol += col * lambert * cubeCoordSolidAngle(UV_TO_NDC(uv));
 					weight += lambert;
 				}
 			}
 		}
 	}
 
-	out_color = outCol / weight * PI;
+	//out_color = outCol / weight * PI;
+	out_color = outCol / PI;
 }
 			]]></source>
 		</shader>

+ 22 - 4
programs/IrradianceSH.ankiprog

@@ -81,7 +81,11 @@ void initPass()
 		vec3 dir = getCubemapDirection(ndc, face);
 
 		SHCoefficients sh = computeSHCoeffiecients(dir);
-		vec3 rgb = textureLod(u_envTex, vec4(dir, 0.0), 0.0).rgb;
+		vec3 rgb = textureLod(u_envTex, vec4(dir, u_layer), 10.0).rgb;
+
+#if 1
+		rgb = mix(rgb, textureLod(u_envTex, vec4(-dir, u_layer), 10.0).rgb, 0.10);
+#endif
 
 		SHr += rgb.r * sh;
 		SHg += rgb.g * sh;
@@ -91,9 +95,9 @@ void initPass()
 	float solidAngle = cubeCoordSolidAngle(ndc);
 	uint idx = gl_LocalInvocationID.y * WORKGROUP_SIZE.x + gl_LocalInvocationID.x;
 
-	s_scratch[0][idx] = SHr * solidAngle;
-	s_scratch[1][idx] = SHg * solidAngle;
-	s_scratch[2][idx] = SHb * solidAngle;
+	s_scratch[0][idx] = SHr * solidAngle / PI;
+	s_scratch[1][idx] = SHg * solidAngle / PI;
+	s_scratch[2][idx] = SHb * solidAngle / PI;
 
 	memoryBarrierShared();
 	barrier();
@@ -133,6 +137,20 @@ void main()
 	initPass();
 	reducePasses();
 	resolvePass();
+
+	/*if(u_layer == 0)
+		u_SHr = u_SHg = u_SHb = vec4(1.0, 0.0, 0.0, 0.0);
+	else if(u_layer == 1)
+		u_SHr = u_SHg = u_SHb = vec4(0.0, 1.0, 0.0, 0.0);
+	else if(u_layer == 2)
+		u_SHr = u_SHg = u_SHb = vec4(0.0, 0.0, 1.0, 0.0);
+	else
+		u_SHr = u_SHg = u_SHb = vec4(1.0, 0.0, 1.0, 0.0);*/
+
+
+	/*u_SHr = vec4(1, 0, 1, 1);
+		u_SHg = vec4(1, 0, 1, 1);
+		u_SHb = vec4(1, 0, 1, 1);*/
 }
 			]]></source>
 		</shader>

+ 2 - 0
programs/LightShading.ankiprog

@@ -103,6 +103,8 @@ void main()
 	// Indirect
 	out_color += textureLod(u_indirectRt, in_uv, 0.0).rgb;
 
+	return;
+
 	// Skip decals
 	uint count = u_lightIndices[idxOffset];
 	idxOffset += count + 1u;

+ 26 - 5
programs/Reflections.ankiprog

@@ -56,6 +56,11 @@ layout(ANKI_TEX_BINDING(0, 5)) uniform sampler2D u_lightBufferRt;
 
 layout(ANKI_IMAGE_BINDING(0, 0)) writeonly uniform image2D out_reflAndIndirect;
 
+layout(ANKI_SS_BINDING(0, 2)) buffer b_
+{
+	vec4 u_irradianceSh[];
+};
+
 // Temp buffer to hold the indirect color
 shared vec3 s_pixels[WORKGROUP_SIZE.y][WORKGROUP_SIZE.x];
 
@@ -178,7 +183,8 @@ void readReflectionsAndIrradianceFromProbes(
 	uint count = u_lightIndices[idxOffset++];
 	ANKI_LOOP while(count-- != 0)
 	{
-		ReflectionProbe probe = u_reflectionProbes[u_lightIndices[idxOffset++]];
+		uint probeIdx = u_lightIndices[idxOffset++];
+		ReflectionProbe probe = u_reflectionProbes[probeIdx];
 
 		float R2 = probe.positionRadiusSq.w;
 		vec3 center = probe.positionRadiusSq.xyz;
@@ -200,9 +206,24 @@ void readReflectionsAndIrradianceFromProbes(
 		specIndirect = mix(c, specIndirect, factor);
 
 		// Do the same for diffuse
-		uv = computeCubemapVecAccurate(normal, R2, f);
-		vec3 id = textureLod(u_irradianceTex, vec4(uv, cubemapIndex), 0.0).rgb;
-		diffIndirect = mix(id, diffIndirect, factor);
+		if(gl_GlobalInvocationID.x > 2560. / 2. / 2.)
+		{
+			uv = computeCubemapVecAccurate(normal, R2, f);
+			vec3 id = textureLod(u_irradianceTex, vec4(uv, cubemapIndex), 0.0).rgb;
+			diffIndirect = mix(id, diffIndirect, factor);
+		}
+		else
+		{
+			vec3 nn = normal.yzx;
+			vec3 id;
+			for(uint i = 0u; i < 3u; ++i)
+			{
+				vec4 sh = u_irradianceSh[uint(cubemapIndex) * 3u + i];
+				id[i] = dot(sh, vec4(1.0, nn));
+				//id[i] = sh[i];
+			}
+			diffIndirect = mix(id, diffIndirect, factor);
+		}
 	}
 }
 
@@ -294,7 +315,7 @@ void main()
 	vec3 finalRefl = mix(probeCol, sslrCol, sslrFactor);
 
 	// Compute the final color
-	vec3 outColor = indirectCol * gbuffer.diffuse + finalRefl * env;
+	vec3 outColor = indirectCol /* gbuffer.diffuse + finalRefl * env*/;
 
 	// Store the color for the resolve
 	s_pixels[gl_LocalInvocationID.y][gl_LocalInvocationID.x] = outColor;

+ 1 - 0
src/anki/renderer/ForwardShading.cpp

@@ -128,6 +128,7 @@ void ForwardShading::drawVolumetric(RenderingContext& ctx, RenderPassWorkContext
 
 void ForwardShading::drawUpscale(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
 {
+	return;
 	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
 
 	// **WARNING** Remember to update the consumers of the render pass that calls this method

+ 10 - 1
src/anki/renderer/Indirect.cpp

@@ -590,6 +590,15 @@ void Indirect::runIrradianceSH(RenderPassWorkContext& rgraphCtx)
 	UVec4 uniforms(cacheEntryIdx);
 	cmdb->setPushConstants(&uniforms, sizeof(uniforms));
 
+	TextureSubresourceInfo subresource;
+	subresource.m_firstFace = 0;
+	subresource.m_faceCount = 6;
+	subresource.m_firstMipmap = m_lightShading.m_cubeArr->getMipmapCount() - 1;
+	subresource.m_firstLayer = cacheEntryIdx;
+	subresource.m_layerCount = 1;
+	// rgraphCtx.bindTextureAndSampler(0, 0, m_ctx.m_lightShadingRt, subresource, m_r->getLinearSampler());
+	rgraphCtx.bindColorTextureAndSampler(0, 0, m_ctx.m_lightShadingRt, m_r->getLinearSampler());
+
 	cmdb->dispatchCompute(1, 1, 1);
 }
 
@@ -755,7 +764,7 @@ void Indirect::populateRenderGraph(RenderingContext& rctx)
 			subresource.m_firstMipmap = m_lightShading.m_cubeArr->getMipmapCount() - 1;
 			subresource.m_firstLayer = probeToUpdateCacheEntryIdx;
 			subresource.m_layerCount = 1;
-			pass.newConsumer({m_ctx.m_lightShadingRt, TextureUsageBit::SAMPLED_COMPUTE, subresource});
+			pass.newConsumer({m_ctx.m_lightShadingRt, TextureUsageBit::SAMPLED_COMPUTE /*, subresource*/});
 		}
 	}
 	else

+ 5 - 0
src/anki/renderer/Indirect.h

@@ -56,6 +56,11 @@ anki_internal:
 		return m_ctx.m_irradianceRt;
 	}
 
+	BufferPtr getIrradianceSHBuffer() const
+	{
+		return m_irradiance.m_shBuffer;
+	}
+
 private:
 	struct LightPassVertexUniforms;
 	struct LightPassPointLightUniforms;

+ 3 - 0
src/anki/renderer/Reflections.cpp

@@ -130,6 +130,9 @@ void Reflections::run(RenderPassWorkContext& rgraphCtx)
 	bindStorage(cmdb, 0, 0, rsrc.m_clustersToken);
 	bindStorage(cmdb, 0, 1, rsrc.m_lightIndicesToken);
 
+	cmdb->bindStorageBuffer(
+		0, 2, m_r->getIndirect().getIrradianceSHBuffer(), 0, m_r->getIndirect().getIrradianceSHBuffer()->getSize());
+
 	// Dispatch
 	const U sizeX = (m_r->getWidth() + m_workgroupSize[0] - 1) / m_workgroupSize[0];
 	const U sizeY = (m_r->getHeight() + m_workgroupSize[1] - 1) / m_workgroupSize[1];