private static void CalculateCubemapMatrix(float3 position, float farClipPlane, float nearClipPlane, out NativeList <float4x4> viewMatrices, out NativeList <float4x4> projMatrices) { viewMatrices = new NativeList <float4x4>(6, 6, Allocator.Temp); projMatrices = new NativeList <float4x4>(6, 6, Allocator.Temp); PerspCam cam = new PerspCam(); cam.aspect = 1; cam.farClipPlane = farClipPlane; cam.nearClipPlane = nearClipPlane; cam.position = position; cam.fov = 90f; //Forward cam.right = float3(1, 0, 0); cam.up = float3(0, 1, 0); cam.forward = float3(0, 0, 1); cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); for (int i = 0; i < 6; ++i) { projMatrices[i] = cam.projectionMatrix; } viewMatrices[5] = cam.worldToCameraMatrix; //Back cam.right = float3(-1, 0, 0); cam.up = float3(0, 1, 0); cam.forward = float3(0, 0, -1); cam.UpdateTRSMatrix(); viewMatrices[4] = cam.worldToCameraMatrix; //Up cam.right = float3(-1, 0, 0); cam.up = float3(0, 0, 1); cam.forward = float3(0, 1, 0); cam.UpdateTRSMatrix(); viewMatrices[3] = cam.worldToCameraMatrix; //Down cam.right = float3(-1, 0, 0); cam.up = float3(0, 0, -1); cam.forward = float3(0, -1, 0); cam.UpdateTRSMatrix(); viewMatrices[2] = cam.worldToCameraMatrix; //Right cam.up = float3(0, 1, 0); cam.right = float3(0, 0, -1); cam.forward = float3(1, 0, 0); cam.UpdateTRSMatrix(); viewMatrices[1] = cam.worldToCameraMatrix; //Left cam.up = float3(0, 1, 0); cam.right = float3(0, 0, 1); cam.forward = float3(-1, 0, 0); cam.UpdateTRSMatrix(); viewMatrices[0] = cam.worldToCameraMatrix; }
private void BakeCubemap() { PerspCam persp = new PerspCam(); persp.aspect = 1; persp.farClipPlane = considerRange; persp.nearClipPlane = 0.1f; persp.fov = 90f; NativeList <float4x4> worldToCameras = new NativeList <float4x4>(6, 6, Allocator.TempJob); NativeList <float4x4> projection = new NativeList <float4x4>(6, 6, Allocator.TempJob); GetMatrix(worldToCameras.unsafePtr, ref persp, transform.position); persp.UpdateProjectionMatrix(); for (int i = 0; i < 6; ++i) { projection[i] = persp.projectionMatrix; } RenderTexture rt = new RenderTexture(new RenderTextureDescriptor { autoGenerateMips = false, bindMS = false, colorFormat = RenderTextureFormat.ARGBHalf, depthBufferBits = 16, dimension = TextureDimension.Tex2DArray, enableRandomWrite = false, height = 128, width = 128, volumeDepth = 6, msaaSamples = 1, useMipMap = true }); rt.filterMode = FilterMode.Trilinear; rt.Create(); RenderTexture tempRT = new RenderTexture(new RenderTextureDescriptor { autoGenerateMips = false, bindMS = false, colorFormat = RenderTextureFormat.ARGBHalf, depthBufferBits = 16, dimension = TextureDimension.Tex2D, enableRandomWrite = false, height = 128, width = 128, volumeDepth = 1, msaaSamples = 1 }); cbuffer.Clear(); cbuffer.SetGlobalTexture("_Cubemap", rt); cbuffer.GenerateMips(rt); RenderPipeline.AddRenderingMissionInEditor(worldToCameras, projection, targetCamera, rt, tempRT, cbuffer); }
private void BakeMap(int3 index, RenderTexture texArray, RenderTexture tempTex) { float3 left = transform.position - transform.lossyScale * 0.5f; float3 right = transform.position + transform.lossyScale * 0.5f; float3 position = lerp(left, right, ((float3)index + 0.5f) / probeCount); PerspCam persp = new PerspCam(); persp.aspect = 1; persp.farClipPlane = considerRange; persp.nearClipPlane = 0.1f; persp.fov = 90f; NativeList <float4x4> worldToCameras = new NativeList <float4x4>(6, 6, Allocator.TempJob); NativeList <float4x4> projection = new NativeList <float4x4>(6, 6, Allocator.TempJob); GetMatrix(worldToCameras.unsafePtr, ref persp, position); persp.UpdateProjectionMatrix(); for (int i = 0; i < 6; ++i) { projection[i] = persp.projectionMatrix; } RenderPipeline.AddRenderingMissionInEditor(worldToCameras, projection, targetCamera, texArray, tempTex, cbuffer); }
public override void DrawCubeMap(MPointLight lit, ref RenderClusterOptions opts, ref CubeCullingBuffer buffer, int offset) { CommandBuffer cb = opts.command; ComputeShader shader = opts.cullingShader; Material depthMaterial = opts.proceduralMaterial; cb.SetComputeIntParam(shader, ShaderIDs._LightOffset, offset); ComputeShaderUtility.Dispatch(shader, cb, CubeFunction.RunFrustumCull, baseBuffer.clusterCount, 256); PerspCam cam = new PerspCam(); cam.aspect = 1; cam.farClipPlane = lit.range; cam.nearClipPlane = 0.3f; cam.position = lit.position; cam.fov = 90f; Matrix4x4 vpMatrix; cb.SetGlobalVector(ShaderIDs._LightPos, new Vector4(lit.position.x, lit.position.y, lit.position.z, lit.range)); cb.SetGlobalBuffer(ShaderIDs.verticesBuffer, baseBuffer.verticesBuffer); cb.SetGlobalBuffer(ShaderIDs.resultBuffer, baseBuffer.resultBuffer); //Forward cam.forward = Vector3.forward; cam.up = Vector3.down; cam.right = Vector3.left; cam.position = lit.position; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.NegativeZ); cb.ClearRenderTarget(true, true, Color.white); cb.SetGlobalMatrix(ShaderIDs._VP, vpMatrix); offset = offset * 20; cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset); //Back cam.forward = Vector3.back; cam.up = Vector3.down; cam.right = Vector3.right; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.PositiveZ); cb.ClearRenderTarget(true, true, Color.white); cb.SetGlobalMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset); //Up cam.forward = Vector3.up; cam.up = Vector3.back; cam.right = Vector3.right; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.PositiveY); cb.ClearRenderTarget(true, true, Color.white); cb.SetGlobalMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset); //Down cam.forward = Vector3.down; cam.up = Vector3.forward; cam.right = Vector3.right; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.NegativeY); cb.ClearRenderTarget(true, true, Color.white); cb.SetGlobalMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset); //Right cam.forward = Vector3.right; cam.up = Vector3.down; cam.right = Vector3.forward; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.PositiveX); cb.ClearRenderTarget(true, true, Color.white); cb.SetGlobalMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset); //Left cam.forward = Vector3.left; cam.up = Vector3.down; cam.right = Vector3.back; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.NegativeX); cb.ClearRenderTarget(true, true, Color.white); cb.SetGlobalMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset); }
public static void DrawShadow(MPointLight lit, CommandBuffer cb, MaterialPropertyBlock block, ref CubeCullingBuffer buffer, ref PipelineBaseBuffer baseBuffer, ComputeShader shader, int offset, Material depthMaterial) { cb.SetComputeIntParam(shader, ShaderIDs._LightOffset, offset); ComputeShaderUtility.Dispatch(shader, cb, RunFrustumCull, baseBuffer.clusterCount, 64); PerspCam cam = new PerspCam(); cam.aspect = 1; cam.farClipPlane = lit.range; cam.nearClipPlane = 0.3f; cam.position = lit.position; cam.fov = 90f; Matrix4x4 vpMatrix; block.SetVector(ShaderIDs._LightPos, new Vector4(lit.position.x, lit.position.y, lit.position.z, lit.range)); PipelineFunctions.SetShaderBuffer(ref baseBuffer, block); //Forward cam.forward = Vector3.forward; cam.up = Vector3.down; cam.right = Vector3.left; cam.position = lit.position; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.NegativeZ); cb.ClearRenderTarget(true, true, Color.white); block.SetMatrix(ShaderIDs._VP, vpMatrix); offset = offset * 20; cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset, block); //Back cam.forward = Vector3.back; cam.up = Vector3.down; cam.right = Vector3.right; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.PositiveZ); cb.ClearRenderTarget(true, true, Color.white); block.SetMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset, block); //Up cam.forward = Vector3.up; cam.up = Vector3.back; cam.right = Vector3.right; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.PositiveY); cb.ClearRenderTarget(true, true, Color.white); block.SetMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset, block); //Down cam.forward = Vector3.down; cam.up = Vector3.forward; cam.right = Vector3.right; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.NegativeY); cb.ClearRenderTarget(true, true, Color.white); block.SetMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset, block); //Right cam.forward = Vector3.right; cam.up = Vector3.down; cam.right = Vector3.forward; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.PositiveX); cb.ClearRenderTarget(true, true, Color.white); block.SetMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset, block); //Left cam.forward = Vector3.left; cam.up = Vector3.down; cam.right = Vector3.back; cam.UpdateTRSMatrix(); cam.UpdateProjectionMatrix(); vpMatrix = GL.GetGPUProjectionMatrix(cam.projectionMatrix, true) * cam.worldToCameraMatrix; cb.SetRenderTarget(lit.shadowmapTexture, 0, CubemapFace.NegativeX); cb.ClearRenderTarget(true, true, Color.white); block.SetMatrix(ShaderIDs._VP, vpMatrix); cb.DrawProceduralIndirect(Matrix4x4.identity, depthMaterial, 0, MeshTopology.Triangles, buffer.indirectDrawBuffer, offset, block); }