Fix issues with empty compute buffers.

This commit is contained in:
Robert Cupisz 2018-07-09 20:32:21 +02:00
parent 65f66084db
commit fe8a53f50a

View File

@ -145,6 +145,8 @@ public class VolumetricFog : MonoBehaviour
FogEllipsoidParams[] m_FogEllipsoidParams; FogEllipsoidParams[] m_FogEllipsoidParams;
ComputeBuffer m_FogEllipsoidParamsCB; ComputeBuffer m_FogEllipsoidParamsCB;
ComputeBuffer m_DummyCB;
Camera cam{ get { if (m_Camera == null) m_Camera = GetComponent<Camera>(); return m_Camera; }} Camera cam{ get { if (m_Camera == null) m_Camera = GetComponent<Camera>(); return m_Camera; }}
float nearClip { get { return Mathf.Max(0, m_NearClip); } } float nearClip { get { return Mathf.Max(0, m_NearClip); } }
@ -176,6 +178,7 @@ public class VolumetricFog : MonoBehaviour
ReleaseComputeBuffer(ref m_TubeLightShadowPlaneParamsCB); ReleaseComputeBuffer(ref m_TubeLightShadowPlaneParamsCB);
ReleaseComputeBuffer(ref m_AreaLightParamsCB); ReleaseComputeBuffer(ref m_AreaLightParamsCB);
ReleaseComputeBuffer(ref m_FogEllipsoidParamsCB); ReleaseComputeBuffer(ref m_FogEllipsoidParamsCB);
ReleaseComputeBuffer(ref m_DummyCB);
m_VolumeInject = null; m_VolumeInject = null;
m_VolumeScatter = null; m_VolumeScatter = null;
} }
@ -192,7 +195,11 @@ public class VolumetricFog : MonoBehaviour
int count = m_PointLightParamsCB == null ? 0 : m_PointLightParamsCB.count; int count = m_PointLightParamsCB == null ? 0 : m_PointLightParamsCB.count;
m_InjectLightingAndDensity.SetFloat("_PointLightsCount", count); m_InjectLightingAndDensity.SetFloat("_PointLightsCount", count);
if (count == 0) if (count == 0)
{
// Can't not set the buffer
m_InjectLightingAndDensity.SetBuffer(kernel, "_PointLights", m_DummyCB);
return; return;
}
if (m_PointLightParams == null || m_PointLightParams.Length != count) if (m_PointLightParams == null || m_PointLightParams.Length != count)
m_PointLightParams = new PointLightParams[count]; m_PointLightParams = new PointLightParams[count];
@ -226,7 +233,12 @@ public class VolumetricFog : MonoBehaviour
int count = m_TubeLightParamsCB == null ? 0 : m_TubeLightParamsCB.count; int count = m_TubeLightParamsCB == null ? 0 : m_TubeLightParamsCB.count;
m_InjectLightingAndDensity.SetFloat("_TubeLightsCount", count); m_InjectLightingAndDensity.SetFloat("_TubeLightsCount", count);
if (count == 0) if (count == 0)
{
// Can't not set the buffer
m_InjectLightingAndDensity.SetBuffer(kernel, "_TubeLights", m_DummyCB);
m_InjectLightingAndDensity.SetBuffer(kernel, "_TubeLightShadowPlanes", m_DummyCB);
return; return;
}
if (m_TubeLightParams == null || m_TubeLightParams.Length != count) if (m_TubeLightParams == null || m_TubeLightParams.Length != count)
m_TubeLightParams = new TubeLightParams[count]; m_TubeLightParams = new TubeLightParams[count];
@ -277,7 +289,11 @@ public class VolumetricFog : MonoBehaviour
int count = m_AreaLightParamsCB == null ? 0 : m_AreaLightParamsCB.count; int count = m_AreaLightParamsCB == null ? 0 : m_AreaLightParamsCB.count;
m_InjectLightingAndDensity.SetFloat("_AreaLightsCount", count); m_InjectLightingAndDensity.SetFloat("_AreaLightsCount", count);
if (count == 0) if (count == 0)
{
// Can't not set the buffer
m_InjectLightingAndDensity.SetBuffer(kernel, "_AreaLights", m_DummyCB);
return; return;
}
if (m_AreaLightParams == null || m_AreaLightParams.Length != count) if (m_AreaLightParams == null || m_AreaLightParams.Length != count)
m_AreaLightParams = new AreaLightParams[count]; m_AreaLightParams = new AreaLightParams[count];
@ -330,7 +346,11 @@ public class VolumetricFog : MonoBehaviour
m_InjectLightingAndDensity.SetFloat("_FogEllipsoidsCount", count); m_InjectLightingAndDensity.SetFloat("_FogEllipsoidsCount", count);
if (count == 0) if (count == 0)
{
// Can't not set the buffer
m_InjectLightingAndDensity.SetBuffer(kernel, "_FogEllipsoids", m_DummyCB);
return; return;
}
if (m_FogEllipsoidParams == null || m_FogEllipsoidParams.Length != count) if (m_FogEllipsoidParams == null || m_FogEllipsoidParams.Length != count)
m_FogEllipsoidParams = new FogEllipsoidParams[count]; m_FogEllipsoidParams = new FogEllipsoidParams[count];
@ -473,6 +493,8 @@ public class VolumetricFog : MonoBehaviour
m_ambientLight[2] = ambient.b; m_ambientLight[2] = ambient.b;
m_InjectLightingAndDensity.SetFloats("_AmbientLight", m_ambientLight); m_InjectLightingAndDensity.SetFloats("_AmbientLight", m_ambientLight);
m_DummyCB = new ComputeBuffer(1, 4);
SetUpPointLightBuffers(kernel); SetUpPointLightBuffers(kernel);
SetUpTubeLightBuffers(kernel); SetUpTubeLightBuffers(kernel);
SetUpAreaLightBuffers(kernel); SetUpAreaLightBuffers(kernel);