コード例 #1
0
    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);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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);
    }