public LocalCloudData GetData() { var shapeData = new LocalCloudData(); shapeData.Position = transform.position; shapeData.Bounds = transform.lossyScale * .5f; shapeData.TextureScale = m_textureScale; shapeData.DensityThreshold = m_densityThreshold; shapeData.DensityMultiplier = m_densityMultiplier; shapeData.EdgeFadeDistance = m_edgeFadeDistance; return(shapeData); }
private void OnDrawGizmos() { Vector3 center = transform.position; Vector3 extents = transform.lossyScale * .5f; Color color = Color.white; Debug.DrawLine(center + new Vector3(extents.x, extents.y, extents.z), center + new Vector3(-extents.x, extents.y, extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, -extents.y, extents.z), center + new Vector3(-extents.x, -extents.y, extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, extents.y, -extents.z), center + new Vector3(-extents.x, extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, -extents.y, -extents.z), center + new Vector3(-extents.x, -extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, extents.y, extents.z), center + new Vector3(extents.x, extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(-extents.x, extents.y, extents.z), center + new Vector3(-extents.x, extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, -extents.y, extents.z), center + new Vector3(extents.x, -extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(-extents.x, -extents.y, extents.z), center + new Vector3(-extents.x, -extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, extents.y, extents.z), center + new Vector3(extents.x, -extents.y, extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(-extents.x, extents.y, extents.z), center + new Vector3(-extents.x, -extents.y, extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(extents.x, extents.y, -extents.z), center + new Vector3(extents.x, -extents.y, -extents.z), color, 0, true); Debug.DrawLine(center + new Vector3(-extents.x, extents.y, -extents.z), center + new Vector3(-extents.x, -extents.y, -extents.z), color, 0, true); if (m_tester == null) { return; } LocalCloudData data = GetData(); Vector2 result = SlabTest(data.Position - data.Bounds, data.Position + data.Bounds, m_tester.position, m_tester.forward); Debug.DrawLine(m_tester.position, m_tester.position + m_tester.forward * result.y, Color.red); Debug.DrawLine(m_tester.position, m_tester.position + m_tester.forward * result.x, Color.green); //falloff test Vector3 boundsMin = data.Position - data.Bounds; Vector3 boundsMax = data.Position + data.Bounds; Vector3 testPos = m_tester.position + m_tester.forward * Mathf.Lerp(result.x, result.y, .05f); const float containerEdgeFadeDst = 1f; float dstFromEdgeX = Mathf.Min(containerEdgeFadeDst, Mathf.Min(testPos.x - boundsMin.x, boundsMax.x - testPos.x)); float dstFromEdgeY = Mathf.Min(containerEdgeFadeDst, Mathf.Min(testPos.y - boundsMin.y, boundsMax.y - testPos.y)); float dstFromEdgeZ = Mathf.Min(containerEdgeFadeDst, Mathf.Min(testPos.z - boundsMin.z, boundsMax.z - testPos.z)); float falloff = Mathf.Min(dstFromEdgeY, Mathf.Min(dstFromEdgeZ, dstFromEdgeX)) / containerEdgeFadeDst; Debug.DrawLine(m_tester.position + m_tester.forward * result.x, testPos, Color.yellow); }
private void OnRenderImage(RenderTexture source, RenderTexture destination) { if (m_target == null || m_target.width != Screen.width || m_target.height != Screen.height) { if (m_target != null) { m_target.Release(); } m_target = new RenderTexture(Screen.width, Screen.height, 1); m_target.enableRandomWrite = true; m_target.Create(); } //apply settings m_computeShader.SetInt("MaxRaySteps", m_maxRaySteps); m_computeShader.SetFloat("DensityThreshold", m_densityThreshold); m_computeShader.SetFloat("DensityMultiplier", m_densityMultiplier); m_computeShader.SetFloat("GlobalCloudSize", m_globalCloudSize); m_computeShader.SetFloat("GlobalCloudHeight", m_globalCloudHeight); m_computeShader.SetVector("CloudScale", m_cloudScale); //Generate scene if (m_localCloudsdata == null || m_localClouds.Length > m_localCloudsdata.Length) { m_localCloudsdata = new LocalCloudData[m_localClouds.Length]; } int numLocalClouds = 0; for (int i = 0; i < m_localClouds.Length; ++i) { if (m_localClouds[i].isActiveAndEnabled) { m_localCloudsdata[numLocalClouds] = m_localClouds[i].GetData(); numLocalClouds++; } } ComputeBuffer localCloudsBuffer = new ComputeBuffer(m_localCloudsdata.Length, LocalCloudData.GetSize()); localCloudsBuffer.SetData(m_localCloudsdata, 0, 0, Mathf.Max(numLocalClouds, 1)); m_computeShader.SetBuffer(0, "LocalClouds", localCloudsBuffer); m_computeShader.SetInt("NumLocalClouds", numLocalClouds); uint threadGroupX, threadGroupY, threadGroupZ; m_computeShader.GetKernelThreadGroupSizes(0, out threadGroupX, out threadGroupY, out threadGroupZ); m_computeShader.SetMatrix("CameraToWorldMatrix", m_camera.cameraToWorldMatrix); m_computeShader.SetMatrix("CameraInvProjectionMatrix", m_camera.projectionMatrix.inverse); m_computeShader.SetTexture(0, "CloudTexture", m_cloudTexture); m_computeShader.SetTexture(0, "CloudDetailTexture", m_cloudDetailTexture); m_computeShader.SetTexture(0, "RandomNoiseTexture", m_randomNoiseTexture); m_computeShader.SetTexture(0, "BlueNoiseTexture", m_blueNoiseTexture); m_computeShader.SetTexture(0, "CloudFormationMapTexture", m_cloudFormationTexture); m_computeShader.SetTextureFromGlobal(0, "_CameraDepthTexture", "_CameraDepthTexture"); m_computeShader.SetTexture(0, "Source", source); m_computeShader.SetTexture(0, "Target", m_target); m_computeShader.Dispatch(0, Mathf.CeilToInt(m_target.width / threadGroupX), Mathf.CeilToInt(m_target.width / threadGroupY), (int)threadGroupZ); localCloudsBuffer.Dispose(); Graphics.Blit(m_target, destination); }