Panagiotis Christopoulos Charitos 6 years ago
parent
commit
7432c46a30

+ 4 - 4
shaders/TraditionalDeferredShading.glslp

@@ -77,8 +77,8 @@ layout(set = 0, binding = 8) uniform texture2D u_shadowMap;
 void main()
 {
 	// Compute UV coordinates
-	const Vec2 uv = Vec2(gl_FragCoord.xy) / u_unis.m_fbSize;
-	const Vec2 uvToRead = fma(uv, u_unis.m_inputTexUvScale, u_unis.m_inputTexUvOffset);
+	const Vec2 uvToRead = fma(Vec2(gl_FragCoord.xy), u_unis.m_inputTexUvScale, u_unis.m_inputTexUvBias);
+	const Vec2 uvToWrite = fma(Vec2(gl_FragCoord.xy), u_unis.m_fbUvScale, u_unis.m_fbUvBias);
 
 	const F32 depth = textureLod(u_msDepthRt, u_msSampler, uvToRead, 0.0).r;
 
@@ -95,7 +95,7 @@ void main()
 	readGBuffer(u_msRt0, u_msRt1, u_msRt2, u_msSampler, uvToRead, 0.0, gbuffer);
 	gbuffer.m_subsurface = max(gbuffer.m_subsurface, SUBSURFACE_MIN * 8.0);
 
-	const Vec4 worldPos4 = u_unis.m_invViewProjMat * Vec4(UV_TO_NDC(uv), depth, 1.0);
+	const Vec4 worldPos4 = u_unis.m_invViewProjMat * Vec4(UV_TO_NDC(uvToWrite), depth, 1.0);
 	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;
 
 	// Compute diff
@@ -144,4 +144,4 @@ void main()
 	out_color += (specC + diffC) * u_unis.m_diffuseColor * factor;
 }
 
-#pragma anki end
+#pragma anki end

+ 13 - 14
shaders/glsl_cpp_common/TraditionalDeferredShading.h

@@ -13,16 +13,16 @@ struct DeferredPointLightUniforms
 {
 	// Use these to get the correct face UVs
 	Vec2 m_inputTexUvScale;
-	Vec2 m_inputTexUvOffset;
+	Vec2 m_inputTexUvBias;
+
+	Vec2 m_fbUvScale;
+	Vec2 m_fbUvBias;
 
 	Mat4 m_invViewProjMat;
 
 	Vec3 m_camPos;
 	F32 m_padding;
 
-	Vec2 m_fbSize;
-	Vec2 m_padding1;
-
 	// Light props
 	Vec3 m_position;
 	F32 m_oneOverSquareRadius; // 1/radius^2
@@ -35,16 +35,16 @@ struct DeferredSpotLightUniforms
 {
 	// Use these to get the correct face UVs
 	Vec2 m_inputTexUvScale;
-	Vec2 m_inputTexUvOffset;
+	Vec2 m_inputTexUvBias;
+
+	Vec2 m_fbUvScale;
+	Vec2 m_fbUvBias;
 
 	Mat4 m_invViewProjMat;
 
 	Vec3 m_camPos;
 	F32 m_padding;
 
-	Vec2 m_fbSize;
-	Vec2 m_padding1;
-
 	// Light props
 	Vec3 m_position;
 	F32 m_oneOverSquareRadius; // 1/radius^2
@@ -60,20 +60,19 @@ struct DeferredDirectionalLightUniforms
 {
 	// Use these to get the correct face UVs
 	Vec2 m_inputTexUvScale;
-	Vec2 m_inputTexUvOffset;
+	Vec2 m_inputTexUvBias;
+
+	Vec2 m_fbUvScale;
+	Vec2 m_fbUvBias;
 
 	Mat4 m_invViewProjMat;
 
 	Vec3 m_camPos;
-	F32 m_padding;
-
-	Vec2 m_fbSize;
 	F32 m_near;
-	F32 m_far;
 
 	// Light props
 	Vec3 m_diffuseColor;
-	F32 m_padding2;
+	F32 m_far;
 
 	Vec3 m_lightDir;
 	F32 m_effectiveShadowDistance;

+ 4 - 2
src/anki/renderer/GlobalIllumination.cpp

@@ -705,8 +705,10 @@ void GlobalIllumination::runLightShading(RenderPassWorkContext& rgraphCtx, Inter
 		rqueue.m_viewProjectionMatrix.getInverse(),
 		rqueue.m_cameraTransform.getTranslationPart(),
 		UVec4(faceIdx * m_tileSize, 0, m_tileSize, m_tileSize),
-		Vec2(faceIdx * (1.0f / 6.0f), 0.0f),
-		Vec2((faceIdx + 1) * (1.0f / 6.0f), 1.0f),
+		Vec2(1.0f / F32(m_tileSize * 6), 1.0f / F32(m_tileSize)),
+		Vec2(0.0f, 0.0f),
+		Vec2(1.0f / F32(m_tileSize), 1.0f / F32(m_tileSize)),
+		Vec2(-F32(faceIdx), 0.0f),
 		probe.m_renderQueues[faceIdx]->m_cameraNear,
 		probe.m_renderQueues[faceIdx]->m_cameraFar,
 		(hasDirLight) ? &probe.m_renderQueues[faceIdx]->m_directionalLight : nullptr,

+ 4 - 2
src/anki/renderer/Indirect.cpp

@@ -435,8 +435,10 @@ void Indirect::runLightShading(U32 faceIdx, RenderPassWorkContext& rgraphCtx)
 		rqueue.m_viewProjectionMatrix.getInverse(),
 		rqueue.m_cameraTransform.getTranslationPart(),
 		UVec4(0, 0, m_lightShading.m_tileSize, m_lightShading.m_tileSize),
-		Vec2(faceIdx * (1.0f / 6.0f), 0.0f),
-		Vec2((faceIdx + 1) * (1.0f / 6.0f), 1.0f),
+		Vec2(1.0f / F32(m_lightShading.m_tileSize * 6), 1.0f / F32(m_lightShading.m_tileSize)),
+		Vec2(F32(faceIdx) * (1.0f / 6.0f), 0.0f),
+		Vec2(1.0f / F32(m_lightShading.m_tileSize), 1.0f / F32(m_lightShading.m_tileSize)),
+		Vec2(0.0f, 0.0f),
 		probe.m_renderQueues[faceIdx]->m_cameraNear,
 		probe.m_renderQueues[faceIdx]->m_cameraFar,
 		(hasDirLight) ? &probe.m_renderQueues[faceIdx]->m_directionalLight : nullptr,

+ 17 - 21
src/anki/renderer/TraditionalDeferredShading.cpp

@@ -80,8 +80,10 @@ void TraditionalDeferredLightShading::drawLights(const Mat4& vpMat,
 	const Mat4& invViewProjMat,
 	const Vec4& cameraPosWSpace,
 	const UVec4& viewport,
-	const Vec2& gbufferTexCoordsMin,
-	const Vec2& gbufferTexCoordsMax,
+	const Vec2& gbufferTexCoordsScale,
+	const Vec2& gbufferTexCoordsBias,
+	const Vec2& lightbufferTexCoordsScale,
+	const Vec2& lightbufferTexCoordsBias,
 	F32 cameraNear,
 	F32 cameraFar,
 	DirectionalLightQueueElement* directionalLight,
@@ -89,15 +91,6 @@ void TraditionalDeferredLightShading::drawLights(const Mat4& vpMat,
 	ConstWeakArray<SpotLightQueueElement> slights,
 	CommandBufferPtr& cmdb)
 {
-	ANKI_ASSERT(gbufferTexCoordsMin < gbufferTexCoordsMax);
-
-	// Compute coords
-	Vec4 inputTexUvScaleAndOffset;
-	inputTexUvScaleAndOffset.x() = gbufferTexCoordsMax.x() - gbufferTexCoordsMin.x();
-	inputTexUvScaleAndOffset.y() = gbufferTexCoordsMax.y() - gbufferTexCoordsMin.y();
-	inputTexUvScaleAndOffset.z() = gbufferTexCoordsMin.x();
-	inputTexUvScaleAndOffset.w() = gbufferTexCoordsMin.y();
-
 	// Set common state for all lights
 	cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ONE);
 	cmdb->setViewport(viewport.x(), viewport.y(), viewport.z(), viewport.w());
@@ -112,11 +105,12 @@ void TraditionalDeferredLightShading::drawLights(const Mat4& vpMat,
 		DeferredDirectionalLightUniforms* unis = allocateAndBindUniforms<DeferredDirectionalLightUniforms*>(
 			sizeof(DeferredDirectionalLightUniforms), cmdb, 0, 1);
 
-		unis->m_inputTexUvScale = inputTexUvScaleAndOffset.xy();
-		unis->m_inputTexUvOffset = inputTexUvScaleAndOffset.zw();
+		unis->m_inputTexUvScale = gbufferTexCoordsScale;
+		unis->m_inputTexUvBias = gbufferTexCoordsBias;
+		unis->m_fbUvScale = lightbufferTexCoordsScale;
+		unis->m_fbUvBias = lightbufferTexCoordsBias;
 		unis->m_invViewProjMat = invViewProjMat;
 		unis->m_camPos = cameraPosWSpace.xyz();
-		unis->m_fbSize = Vec2(viewport.z(), viewport.w());
 
 		unis->m_diffuseColor = directionalLight->m_diffuseColor;
 		unis->m_lightDir = directionalLight->m_direction;
@@ -158,11 +152,12 @@ void TraditionalDeferredLightShading::drawLights(const Mat4& vpMat,
 		DeferredPointLightUniforms* light =
 			allocateAndBindUniforms<DeferredPointLightUniforms*>(sizeof(DeferredPointLightUniforms), cmdb, 0, 1);
 
-		light->m_inputTexUvScale = inputTexUvScaleAndOffset.xy();
-		light->m_inputTexUvOffset = inputTexUvScaleAndOffset.zw();
+		light->m_inputTexUvScale = gbufferTexCoordsScale;
+		light->m_inputTexUvBias = gbufferTexCoordsBias;
+		light->m_fbUvScale = lightbufferTexCoordsScale;
+		light->m_fbUvBias = lightbufferTexCoordsBias;
 		light->m_invViewProjMat = invViewProjMat;
 		light->m_camPos = cameraPosWSpace.xyz();
-		light->m_fbSize = Vec2(viewport.z(), viewport.w());
 		light->m_position = plightEl.m_worldPosition;
 		light->m_oneOverSquareRadius = 1.0f / (plightEl.m_radius * plightEl.m_radius);
 		light->m_diffuseColor = plightEl.m_diffuseColor;
@@ -199,11 +194,12 @@ void TraditionalDeferredLightShading::drawLights(const Mat4& vpMat,
 		DeferredSpotLightUniforms* light =
 			allocateAndBindUniforms<DeferredSpotLightUniforms*>(sizeof(DeferredSpotLightUniforms), cmdb, 0, 1);
 
-		light->m_inputTexUvScale = inputTexUvScaleAndOffset.xy();
-		light->m_inputTexUvOffset = inputTexUvScaleAndOffset.zw();
+		light->m_inputTexUvScale = gbufferTexCoordsScale;
+		light->m_inputTexUvBias = gbufferTexCoordsBias;
+		light->m_fbUvScale = lightbufferTexCoordsScale;
+		light->m_fbUvBias = lightbufferTexCoordsBias;
 		light->m_invViewProjMat = invViewProjMat;
 		light->m_camPos = cameraPosWSpace.xyz();
-		light->m_fbSize = Vec2(viewport.z(), viewport.w());
 
 		light->m_position = splightEl.m_worldTransform.getTranslationPart().xyz();
 		light->m_oneOverSquareRadius = 1.0f / (splightEl.m_distance * splightEl.m_distance);
@@ -223,4 +219,4 @@ void TraditionalDeferredLightShading::drawLights(const Mat4& vpMat,
 	cmdb->setCullMode(FaceSelectionBit::BACK);
 }
 
-} // end namespace anki
+} // end namespace anki

+ 4 - 2
src/anki/renderer/TraditionalDeferredShading.h

@@ -29,8 +29,10 @@ public:
 		const Mat4& invViewProjMat,
 		const Vec4& cameraPosWSpace,
 		const UVec4& viewport,
-		const Vec2& gbufferTexCoordsMin,
-		const Vec2& gbufferTexCoordsMax,
+		const Vec2& gbufferTexCoordsScale,
+		const Vec2& gbufferTexCoordsBias,
+		const Vec2& lightbufferTexCoordsScale,
+		const Vec2& lightbufferTexCoordsBias,
 		F32 cameraNear,
 		F32 cameraFar,
 		DirectionalLightQueueElement* directionalLight,