Exemple #1
0
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            if (Water.visibles.Count == 0)
            {
                return;
            }
            var cmd = CommandBufferPool.Get(COMMAND_BUFFER_TAG);

            try{
                foreach (var w in Water.visibles)
                {
                    //只做Demo,因此只构造一个水平的镜面反射。在实际应用中,假如存在多个不同平面的水体,需要为不同平面分别生成反射贴图。
                    var descriptor = new PlanarDescriptor()
                    {
                        position = w.transform.position,
                        normal   = w.transform.up
                    };
                    _generator.Render(cmd, ref renderingData, ref descriptor);
                    context.ExecuteCommandBuffer(cmd);
                    break;
                }
            }finally{
                CommandBufferPool.Release(cmd);
            }
        }
Exemple #2
0
        public void AddRender(Renderer renderer)
        {
            var position         = renderer.transform.position;
            var normal           = renderer.transform.up;
            var planarDescriptor = new PlanarDescriptor()
            {
                position = position,
                normal   = normal
            };

            foreach (var renderers in _planarRenderers)
            {
                if (renderers.descriptor == planarDescriptor)
                {
                    renderers.renderers.Add(renderer);
                    return;
                }
            }
            {
                var renderers = AllocateGroup();
                renderers.descriptor = planarDescriptor;
                renderers.renderers.Add(renderer);
                _planarRenderers.Add(renderers);
            }
        }
        public void Render(CommandBuffer cmd, ref RenderingData renderingData, ref PlanarDescriptor planarDescriptor)
        {
            if (!_computeShader)
            {
                return;
            }

            var reflectionTexDes = renderingData.cameraData.cameraTargetDescriptor;

            reflectionTexDes.enableRandomWrite = true;
            reflectionTexDes.msaaSamples       = 1;
            cmd.GetTemporaryRT(_reflectionTexID, reflectionTexDes);

            var rtWidth  = reflectionTexDes.width;
            var rtHeight = reflectionTexDes.height;

            ///==== Compute Shader Begin ===== ///

            var cameraData = renderingData.cameraData;
            var viewMatrix = cameraData.camera.worldToCameraMatrix;
            //不知道为什么,第二个参数是false才能正常得到世界坐标
            var projectMatrix = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrix(), false);
            var matrixVP      = projectMatrix * viewMatrix;
            var invMatrixVP   = matrixVP.inverse;

            var threadGroupX = reflectionTexDes.width / 8;
            var threadGroupY = reflectionTexDes.height / 8;

            RenderTargetIdentifier cameraColorTex = ShaderProperties.CameraColorTexture;

            cmd.SetComputeVectorParam(_computeShader, ShaderProperties.MainTexelSize, new Vector4(1.0f / rtWidth, 1.0f / rtHeight, rtWidth, rtHeight));
            cmd.SetComputeMatrixParam(_computeShader, ShaderProperties.MatrixVP, matrixVP);
            cmd.SetComputeMatrixParam(_computeShader, ShaderProperties.MatrixInvVP, invMatrixVP);
            cmd.SetComputeVectorParam(_computeShader, ShaderProperties.PlanarPosition, planarDescriptor.position);
            cmd.SetComputeVectorParam(_computeShader, ShaderProperties.PlanarNormal, planarDescriptor.normal);

            //clear the reflection texture
            cmd.SetComputeTextureParam(_computeShader, _kernelClear, ShaderProperties.Result, _reflectionTexID);
            cmd.DispatchCompute(_computeShader, _kernelClear, threadGroupX, threadGroupY, 1);

            cmd.SetComputeTextureParam(_computeShader, _kernalPass1, ShaderProperties.CameraColorTexture, cameraColorTex);
            cmd.SetComputeTextureParam(_computeShader, _kernalPass1, ShaderProperties.Result, _reflectionTexID);
            cmd.DispatchCompute(_computeShader, _kernalPass1, threadGroupX, threadGroupY, 1);

            cmd.SetComputeTextureParam(_computeShader, _kernalPass2, ShaderProperties.CameraColorTexture, cameraColorTex);
            cmd.SetComputeTextureParam(_computeShader, _kernalPass2, ShaderProperties.Result, _reflectionTexID);
            cmd.DispatchCompute(_computeShader, _kernalPass2, threadGroupX, threadGroupY, 1);

            // ====== blur begin ===== ///
            _blurBlitter.SetSource(_reflectionTexID, reflectionTexDes);
            _blurBlitter.blurType      = BlurType.BoxBilinear;
            _blurBlitter.iteratorCount = 1;
            _blurBlitter.downSample    = 1;
            _blurBlitter.Render(cmd);

            cmd.SetGlobalTexture(ShaderProperties.ReflectionTexture, _reflectionTexID);
        }
Exemple #4
0
 private static bool IsPositionInPlanar(Vector3 checkPos, PlanarDescriptor planar)
 {
     return(Vector3.Dot(planar.position - checkPos, planar.normal) < 0.01f);
 }