Browse Source

Some work indirect

Panagiotis Christopoulos Charitos 10 năm trước cách đây
mục cha
commit
b174c28ada
4 tập tin đã thay đổi với 89 bổ sung7 xóa
  1. 4 3
      include/anki/renderer/Ir.h
  2. 80 0
      shaders/Irradiance.glsl
  3. 4 3
      src/renderer/Ir.cpp
  4. 1 1
      src/renderer/Refl.cpp

+ 4 - 3
include/anki/renderer/Ir.h

@@ -35,9 +35,9 @@ anki_internal:
 
 	ANKI_USE_RESULT Error run(CommandBufferPtr cmdb);
 
-	TexturePtr getCubemapArray() const
+	TexturePtr getEnvironmentCubemapArray() const
 	{
-		return m_cubemapArr;
+		return m_envCubemapArr;
 	}
 
 	DynamicBufferToken getProbesToken() const
@@ -74,7 +74,8 @@ private:
 	};
 
 	Renderer m_nestedR;
-	TexturePtr m_cubemapArr;
+	TexturePtr m_envCubemapArr;
+	TexturePtr m_irradianceCubemapArr;
 	U16 m_cubemapArrMipCount = 0;
 	U16 m_cubemapArrSize = 0;
 	U16 m_fbSize = 0;

+ 80 - 0
shaders/Irradiance.glsl

@@ -0,0 +1,80 @@
+// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+// Compute the irradiance given an environment map
+
+#include "shaders/Common.glsl"
+
+layout(location = 0) in vec2 in_uv;
+
+layout(TEX_BINDING(0, 0)) samplerCube u_envTex;
+
+layout(location = 0) out vec3 out_color0;
+layout(location = 1) out vec3 out_color1;
+layout(location = 2) out vec3 out_color2;
+
+const mat3 CUBE_ROTATIONS[6] = mat3[](mat3(vec3(0.000000, 0.000000, -1.000000),
+										  vec3(0.000000, -1.000000, 0.000000),
+										  vec3(-1.000000, 0.000000, 0.000000)),
+
+	mat3(vec3(0.000000, 0.000000, 1.000000),
+										  vec3(0.000000, -1.000000, 0.000000),
+										  vec3(1.000000, 0.000000, 0.000000)),
+
+	mat3(vec3(1.000000, 0.000000, -0.000000),
+										  vec3(0.000000, -0.000000, 1.000000),
+										  vec3(0.000000, -1.000000, -0.000000)),
+
+	mat3(vec3(1.000000, 0.000000, -0.000000),
+										  vec3(0.000000, -0.000000, -1.000000),
+										  vec3(-0.000000, 1.000000, -0.000000)),
+	mat3(vec3(1.000000, 0.000000, 0.000000),
+										  vec3(0.000000, -1.000000, 0.000000),
+										  vec3(0.000000, 0.000000, -1.000000)),
+	mat3(vec3(-1.000000, -0.000000, 0.000000),
+										  vec3(0.000000, -1.000000, 0.000000),
+										  vec3(0.000000, 0.000000, 1.000000)));
+
+//==============================================================================
+// Integrate the environment map to compute the irradiance for a single fragment
+vec3 computeIrradiance(in uint face)
+{
+	// Get the r coordinate of the current face and fragment
+	vec2 ndc = in_uv * 2.0 - 1.0;
+	vec3 ri = CUBE_ROTATIONS[face] * normalize(vec3(ndc, -1.0));
+
+	vec3 outCol = vec3(0.0);
+	float weight = 0.0;
+	
+	// For all the faces and texels of the environment map calculate a color sum
+	for(uint f = 0u; f < 6u; ++f)
+	{
+		for(uint i = 0u; i < CUBEMAP_SIZE; ++i)
+		{
+			for(uint j = 0u; j < CUBEMAP_SIZE; ++j)
+			{
+				vec2 uv = vec2(j, i) / float(CUBEMAP_SIZE);
+				vec2 ndc = uv * 2.0 - 1.0;
+				vec3 r = CUBE_ROTATIONS[f] * normalize(vec3(ndc, -1.0));
+
+				vec3 col = texture(u_envTex, r).rgb;
+
+				float lambert = max(0.0, dot(r, ri));
+				outCol += col * lambert;
+				weight += lambert;
+			}
+		}
+	}
+
+	return outCol / weight;
+}
+
+//==============================================================================
+void main()
+{
+	out_color0 = computeIrradiance(FACE_INDEX + 0);
+	out_color1 = computeIrradiance(FACE_INDEX + 1);
+	out_color2 = computeIrradiance(FACE_INDEX + 2);
+}

+ 4 - 3
src/renderer/Ir.cpp

@@ -220,7 +220,8 @@ Error Ir::init(const ConfigSet& config)
 	texinit.m_sampling.m_minMagFilter = SamplingFilter::LINEAR;
 	texinit.m_sampling.m_mipmapFilter = SamplingFilter::LINEAR;
 
-	m_cubemapArr = getGrManager().newInstance<Texture>(texinit);
+	m_envCubemapArr = getGrManager().newInstance<Texture>(texinit);
+	m_irradianceCubemapArr = getGrManager().newInstance<Texture>(texinit);
 	m_cubemapArrMipCount = computeMaxMipmapCount(m_fbSize, m_fbSize);
 
 	getGrManager().finish();
@@ -551,13 +552,13 @@ Error Ir::renderReflection(
 			m_nestedR.getPps().getRt(),
 			0,
 			0,
-			m_cubemapArr,
+			m_envCubemapArr,
 			6 * cubemapIdx + i,
 			0);
 
 		// Gen mips
 		cmdb[cmdb.getSize() - 1]->generateMipmaps(
-			m_cubemapArr, 6 * cubemapIdx + i);
+			m_envCubemapArr, 6 * cubemapIdx + i);
 
 		// Flush
 		for(U j = 0; j < cmdb.getSize(); ++j)

+ 1 - 1
src/renderer/Refl.cpp

@@ -145,7 +145,7 @@ Error Refl::init1stPass(const ConfigSet& config)
 
 	if(m_irEnabled)
 	{
-		rcInit.m_textures[4].m_texture = m_ir->getCubemapArray();
+		rcInit.m_textures[4].m_texture = m_ir->getEnvironmentCubemapArray();
 	}
 
 	rcInit.m_uniformBuffers[0].m_buffer = m_uniforms;