Selaa lähdekoodia

Omni lights are now working

Panagiotis Christopoulos Charitos 10 vuotta sitten
vanhempi
sitoutus
afe5d78c44

+ 1 - 3
include/anki/renderer/Drawer.h

@@ -47,9 +47,7 @@ public:
 		m_cmdBuff = cmdBuff;
 	}
 
-	ANKI_USE_RESULT Error render(
-		SceneNode& frsn,
-		VisibleNode& visible);
+	ANKI_USE_RESULT Error render(FrustumComponent& frc, VisibleNode& visible);
 
 	void finishDraw()
 	{

+ 1 - 1
include/anki/renderer/Is.h

@@ -153,7 +153,7 @@ private:
 	/// Calculate the size of the tile
 	PtrSize calcTileSize() const;
 
-	void updateCommonBlock(CommandBufferPtr& cmdBuff);
+	void updateCommonBlock(CommandBufferPtr& cmdBuff, FrustumComponent& frc);
 
 	// Binning
 	void binLights(U32 threadId, PtrSize threadsCount, TaskCommonData& data);

+ 1 - 1
include/anki/scene/Light.h

@@ -64,7 +64,7 @@ public:
 	{
 	public:
 		PerspectiveFrustum m_frustum;
-		Transform m_localTrf;
+		Transform m_localTrf = Transform::getIdentity();
 	};
 
 	Sphere m_sphereW = Sphere(Vec4(0.0), 1.0);

+ 1 - 0
shaders/IsCommon.glsl

@@ -13,4 +13,5 @@ layout(std140, row_major, binding = 0) uniform _0
 	vec4 u_projectionParams;
 	vec4 u_sceneAmbientColor;
 	vec4 u_groundLightDir;
+	mat4 u_viewMat;
 };

+ 12 - 11
shaders/IsLp.frag.glsl

@@ -214,25 +214,25 @@ float computeShadowFactor(
 }
 
 //==============================================================================
-float computeShadowFactorOmni(
-	in vec3 frag2Light,
-	in float layer)
+float computeShadowFactorOmni(in vec3 frag2Light, in float layer,
+	in float radius)
 {
-	vec3 dir = -frag2Light;
-	float dist = length(dir);
-	dir /= dist;
+	vec3 dir = (u_viewMat * vec4(-frag2Light, 1.0)).xyz;
+	vec3 dirabs = abs(dir);
+	float dist = -max(dirabs.x, max(dirabs.y, dirabs.z));
+	dir = normalize(dir);
 
-	const float f = 1.0 / tan(90.0 * (PI / 180.0) * 0.5);
+	const float f = 1.0 / tan(PI / 2.0 * 0.5);
 	const float near = 0.1;
-	const float far = 5.0;
+	const float far = radius;
 	float g = near - far;
 
 	float z = (far + near) / g * dist + (2.0 * far * near) / g;
 	float w = -dist;
 	z /= w;
+	z = z * 0.5 + 0.5;
 
-	float shadowFactor = texture(u_omniMapArr, vec4(-frag2Light, layer), z);
-
+	float shadowFactor = texture(u_omniMapArr, vec4(dir, layer), z).r;
 	return shadowFactor;
 }
 
@@ -321,7 +321,8 @@ void main()
 		if(light.diffuseColorShadowmapId.w < 128.0)
 		{
 			shadow = computeShadowFactorOmni(frag2Light,
-				light.diffuseColorShadowmapId.w);
+				light.diffuseColorShadowmapId.w,
+				-1.0 / light.posRadius.w);
 		}
 
 		out_color += (specC + diffC)

+ 1 - 1
src/gr/gl/TextureImpl.cpp

@@ -236,6 +236,7 @@ void TextureImpl::create(const TextureInitializer& init)
 	switch(m_target)
 	{
 	case GL_TEXTURE_2D:
+	case GL_TEXTURE_CUBE_MAP:
 		glTexStorage2D(
 			m_target,
 			m_mipsCount,
@@ -252,7 +253,6 @@ void TextureImpl::create(const TextureInitializer& init)
 			m_height,
 			init.m_depth * 6);
 		break;
-	case GL_TEXTURE_CUBE_MAP:
 	case GL_TEXTURE_2D_ARRAY:
 	case GL_TEXTURE_3D:
 		glTexStorage3D(

+ 1 - 3
src/renderer/Drawer.cpp

@@ -276,7 +276,7 @@ void RenderableDrawer::setupUniforms(
 }
 
 //==============================================================================
-Error RenderableDrawer::render(SceneNode& frsn, VisibleNode& visibleNode)
+Error RenderableDrawer::render(FrustumComponent& fr, VisibleNode& visibleNode)
 {
 	RenderingBuildData build;
 
@@ -291,8 +291,6 @@ Error RenderableDrawer::render(SceneNode& frsn, VisibleNode& visibleNode)
 		return ErrorCode::NONE;
 	}
 
-	FrustumComponent& fr = frsn.getComponent<FrustumComponent>();
-
 	// Calculate the key
 	RenderingKey key;
 

+ 1 - 1
src/renderer/Fs.cpp

@@ -49,7 +49,7 @@ Error Fs::run(CommandBufferPtr& cmdb)
 	auto end = camFr.getVisibilityTestResults().getRenderablesEnd();
 	for(; !err && it != end; ++it)
 	{
-		err = drawer.render(cam, *it);
+		err = drawer.render(camFr, *it);
 	}
 
 	if(!err)

+ 4 - 2
src/renderer/Is.cpp

@@ -58,6 +58,7 @@ struct CommonUniforms
 	Vec4 m_projectionParams;
 	Vec4 m_sceneAmbientColor;
 	Vec4 m_groundLightDir;
+	Mat4 m_viewMat;
 };
 
 } // end namespace shader
@@ -461,7 +462,7 @@ Error Is::lightPass(CommandBufferPtr& cmdBuff)
 	setState(cmdBuff);
 
 	// Update uniforms
-	updateCommonBlock(cmdBuff);
+	updateCommonBlock(cmdBuff, fr);
 
 	// Sync
 	ANKI_CHECK(threadPool.waitForAllThreadsToFinish());
@@ -794,7 +795,7 @@ Error Is::run(CommandBufferPtr& cmdBuff)
 }
 
 //==============================================================================
-void Is::updateCommonBlock(CommandBufferPtr& cmdb)
+void Is::updateCommonBlock(CommandBufferPtr& cmdb, FrustumComponent& fr)
 {
 	shader::CommonUniforms* blk;
 	cmdb->updateDynamicUniforms(sizeof(*blk), blk);
@@ -802,6 +803,7 @@ void Is::updateCommonBlock(CommandBufferPtr& cmdb)
 	// Start writing
 	blk->m_projectionParams = m_r->getProjectionParameters();
 	blk->m_sceneAmbientColor = m_ambientColor;
+	blk->m_viewMat = fr.getViewMatrix().getTransposed();
 
 	Vec3 groundLightDir;
 	if(m_groundLightEnabled)

+ 3 - 3
src/renderer/Ms.cpp

@@ -115,14 +115,14 @@ Error Ms::run(CommandBufferPtr& cmdb)
 
 	SceneNode& cam = m_r->getActiveCamera();
 
-	VisibilityTestResults& vi =
-		cam.getComponent<FrustumComponent>().getVisibilityTestResults();
+	FrustumComponent& frc = cam.getComponent<FrustumComponent>();
+	VisibilityTestResults& vi = frc.getVisibilityTestResults();
 
 	auto it = vi.getRenderablesBegin();
 	auto end = vi.getRenderablesEnd();
 	for(; it != end; ++it)
 	{
-		ANKI_CHECK(m_r->getSceneDrawer().render(cam, *it));
+		ANKI_CHECK(m_r->getSceneDrawer().render(frc, *it));
 	}
 
 	m_r->getSceneDrawer().finishDraw();

+ 3 - 3
src/renderer/Sm.cpp

@@ -57,7 +57,7 @@ Error Sm::init(const ConfigSet& config)
 	m_spotTexArray = getGrManager().newInstance<Texture>(sminit);
 
 	sminit.m_type = TextureType::CUBE_ARRAY;
-	m_omniTexArray = getGrManager().newInstance<Texture>(sminit);;
+	m_omniTexArray = getGrManager().newInstance<Texture>(sminit);
 
 	// Init 2D layers
 	m_spots.create(getAllocator(), config.getNumber("is.sm.maxLights"));
@@ -252,7 +252,7 @@ Error Sm::doSpotLight(SceneNode& light, CommandBufferPtr& cmdBuff)
 	auto end = vi.getRenderablesEnd();
 	for(; it != end; ++it)
 	{
-		ANKI_CHECK(m_r->getSceneDrawer().render(light, *it));
+		ANKI_CHECK(m_r->getSceneDrawer().render(fr, *it));
 	}
 
 	ANKI_COUNTER_INC(RENDERER_SHADOW_PASSES, U64(1));
@@ -284,7 +284,7 @@ Error Sm::doOmniLight(SceneNode& light, CommandBufferPtr& cmdBuff)
 		auto end = vi.getRenderablesEnd();
 		for(; it != end; ++it)
 		{
-			ANKI_CHECK(m_r->getSceneDrawer().render(light, *it));
+			ANKI_CHECK(m_r->getSceneDrawer().render(fr, *it));
 		}
 
 		++frCount;

+ 28 - 19
src/scene/Light.cpp

@@ -199,10 +199,14 @@ void PointLight::onMoveUpdate(MoveComponent& move)
 	Error err = iterateComponentsOfType<FrustumComponent>(
 		[&](FrustumComponent& fr) -> Error
 	{
+		Transform trf = m_shadowData[count].m_localTrf;
+		trf.setOrigin(
+			move.getWorldTransform().getOrigin()
+			+ m_shadowData[count].m_localTrf.getOrigin());
+
+		fr.getFrustum().resetTransform(trf);
 		fr.markTransformForUpdate();
-		fr.getFrustum().resetTransform(
-			move.getWorldTransform().combineTransformations(
-			m_shadowData[count++].m_localTrf));
+		++count;
 
 		return ErrorCode::NONE;
 	});
@@ -229,7 +233,7 @@ void PointLight::onShapeUpdate(LightComponent& light)
 Error PointLight::frameUpdate(F32 prevUpdateTime, F32 crntTime)
 {
 	if(getComponent<LightComponent>().getShadowEnabled()
-		&& !m_shadowData.isEmpty())
+		&& m_shadowData.isEmpty())
 	{
 		m_shadowData.create(getSceneAllocator(), 6);
 
@@ -237,10 +241,29 @@ Error PointLight::frameUpdate(F32 prevUpdateTime, F32 crntTime)
 		const F32 dist = m_sphereW.getRadius();
 		const F32 zNear = 0.1;
 
+		Mat3 rot;
+		const F32 PI = getPi<F32>();
+
+		rot = Mat3(Euler(0.0, -PI / 2.0, 0.0)) * Mat3(Euler(0.0, 0.0, PI));
+		m_shadowData[0].m_localTrf.setRotation(Mat3x4(rot));
+		rot = Mat3(Euler(0.0, PI / 2.0, 0.0)) * Mat3(Euler(0.0, 0.0, PI));
+		m_shadowData[1].m_localTrf.setRotation(Mat3x4(rot));
+		rot = Mat3(Euler(PI / 2.0, 0.0, 0.0));
+		m_shadowData[2].m_localTrf.setRotation(Mat3x4(rot));
+		rot = Mat3(Euler(-PI / 2.0, 0.0, 0.0));
+		m_shadowData[3].m_localTrf.setRotation(Mat3x4(rot));
+		rot = Mat3(Euler(0.0, PI, 0.0)) * Mat3(Euler(0.0, 0.0, PI));
+		m_shadowData[4].m_localTrf.setRotation(Mat3x4(rot));
+		rot = Mat3(Euler(0.0, 0.0, PI));
+		m_shadowData[5].m_localTrf.setRotation(Mat3x4(rot));
+
+		const Transform& trf =
+			getComponent<MoveComponent>().getWorldTransform();
 		for(U i = 0; i < 6; i++)
 		{
 			m_shadowData[i].m_frustum.setAll(ang, ang, zNear, dist);
-			m_shadowData[i].m_localTrf = Transform::getIdentity();
+			m_shadowData[i].m_frustum.resetTransform(
+				trf.combineTransformations(m_shadowData[i].m_localTrf));
 
 			FrustumComponent* comp =
 				getSceneAllocator().newInstance<FrustumComponent>(this,
@@ -248,20 +271,6 @@ Error PointLight::frameUpdate(F32 prevUpdateTime, F32 crntTime)
 
 			addComponent(comp, true);
 		}
-
-		Vec3 axis = Vec3(0.0, 1.0, 0.0);
-		m_shadowData[1].m_localTrf.setRotation(
-			Mat3x4(Mat3(Axisang(ang, axis))));
-		m_shadowData[2].m_localTrf.setRotation(
-			Mat3x4(Mat3(Axisang(ang * 2.0, axis))));
-		m_shadowData[3].m_localTrf.setRotation(
-			Mat3x4(Mat3(Axisang(ang * 3.0, axis))));
-
-		axis = Vec3(1.0, 0.0, 0.0);
-		m_shadowData[4].m_localTrf.setRotation(
-			Mat3x4(Mat3(Axisang(ang, axis))));
-		m_shadowData[5].m_localTrf.setRotation(
-			Mat3x4(Mat3(Axisang(-ang, axis))));
 	}
 
 	frameUpdateCommon();

+ 4 - 4
testapp/Main.cpp

@@ -86,8 +86,8 @@ Error init()
 
 #if NO_PLAYER
 	cam->getComponent<MoveComponent>().
-		setLocalTransform(Transform(Vec4(-0.0, 4.0, -3.0, 0.0),
-		Mat3x4(Euler(toRad(-26.0), toRad(180.0), toRad(0.0))),
+		setLocalTransform(Transform(Vec4(-11.0, 2.5, 15.0, 0.0),
+		Mat3x4(Euler(toRad(0.0), toRad(0.0), toRad(0.0))),
 		1.0));
 #endif
 
@@ -123,13 +123,13 @@ Error init()
 	scene.newSceneNode<PointLight>("spot0", plight);
 
 	lightc = plight->tryGetComponent<LightComponent>();
-	lightc->setDiffuseColor(Vec4(0.0, 10.0, 0.0, 1.0));
+	lightc->setDiffuseColor(Vec4(0.0, 30.0, 0.0, 1.0));
 	lightc->setSpecularColor(Vec4(1.2));
 	lightc->setDistance(5.0);
 	lightc->setShadowEnabled(true);
 
 	move = plight->tryGetComponent<MoveComponent>();
-	move->setLocalTransform(Transform(Vec4(-0.0, 4.0, -3.0, 0.0),
+	move->setLocalTransform(Transform(Vec4(-11.0, 2.5, 12.0, 0.0),
 		Mat3x4::getIdentity(), 1.0));
 
 #endif