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); } }
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); }
private static bool IsPositionInPlanar(Vector3 checkPos, PlanarDescriptor planar) { return(Vector3.Dot(planar.position - checkPos, planar.normal) < 0.01f); }