private static void SetupPerFrameCameraConstants(CameraData cameraData) { }
public void RebuildLightsList(List <VisibleLight> visibleLights, CameraData cameraData, PipelineSettings pipelineSettings, ref RenderingData renderingData) { UnityEngine.Profiling.Profiler.BeginSample("RebuildLightsList"); lights.Clear(); var unityLights = visibleLights; VisibleLight = 0; LightsDataForShadow.Clear(); bool softShadow = false; int j = 0; int currentShadowIndex = 0; int maxShadowNum = pipelineSettings.MaxShadowLightsNum; for (int i = 0; i < unityLights.Count; ++i) { var ul = unityLights[i]; var pl = ul.light.GetComponent <ProjectorLight>(); if (pl == null) { continue; } lights.Add(pl); var ifLight = pl; if (ifLight.spritesAtlas != spritesAtlas) { spritesAtlas = ifLight.spritesAtlas; } //矩阵是从右向左乘的,view需要z取反 Matrix4x4 c2w = /*Camera.main*/ cameraData.camera.cameraToWorldMatrix * Matrix4x4.Scale(new Vector3(1, 1, -1));// Camera.main.transform.localToWorldMatrix; int shadowIndex = currentShadowIndex; if (currentShadowIndex >= maxShadowNum || !ifLight.lightParms_Shadow) { shadowIndex = -1; } LightDataInAll lightDataInAll = ifLight.GetLightData(c2w, shadowIndex); NativeLightsBoundList[i] = lightDataInAll.sFiniteLightBound; NativeLightsDataList[i] = lightDataInAll.lightData; ++VisibleLight; //for shadow // TODO frustum cull if (ifLight.lightParms_Shadow && currentShadowIndex < maxShadowNum) { LightDataForShadow lightDataForShadow = new LightDataForShadow(); lightDataForShadow.lightIndex = j++; lightDataForShadow.shadowData = lightDataInAll.shadowData; lightDataForShadow.visibleLight = ul; lightDataForShadow.projectorLight = ifLight; lightDataForShadow.unityLightIndex = i; //Matrix4x4 scaleMatrix = Matrix4x4.identity; ////scaleMatrix.m22 = -1.0f; //Matrix4x4 view = scaleMatrix * ul.localToWorld.inverse; //lightDataForShadow.shadowData.viewMatrix = view; LightsDataForShadow.Add(lightDataForShadow); softShadow |= ifLight.softShadow; ++currentShadowIndex; } } renderingData.shadowData.supportsSoftShadows = softShadow; culsterDataGenerator.Begin(pipelineSettings); culsterDataGenerator.Run(cameraData, pipelineSettings, this); lightLoopLightsData.LightsDatasBuf.SetData(LightsDataList); tileAndClusterData.itemsIDListBuf.SetData(culsterDataGenerator.ResultItemsIDList); tileAndClusterData.clusterNumItemsBuf.SetData(culsterDataGenerator.ResultClusterNumItems); culsterDataGenerator.End(); UnityEngine.Profiling.Profiler.EndSample(); }
private static void InitializeCameraData(PipelineSettings settings, Camera camera, out CameraData cameraData) { cameraData = new CameraData(); cameraData.camera = camera; bool msaaEnabled = camera.allowMSAA && settings.msaaSampleCount > 1; if (msaaEnabled) { cameraData.msaaSamples = (camera.targetTexture != null) ? camera.targetTexture.antiAliasing : settings.msaaSampleCount; } else { cameraData.msaaSamples = 1; } cameraData.isSceneViewCamera = camera.cameraType == CameraType.SceneView; //cameraData.isOffscreenRender = camera.targetTexture != null && !cameraData.isSceneViewCamera; //cameraData.isHdrEnabled = camera.allowHDR; Rect cameraRect = camera.rect; var commonOpaqueFlags = SortFlags.CommonOpaque; var noFrontToBackOpaqueFlags = SortFlags.SortingLayer | SortFlags.RenderQueue | SortFlags.OptimizeStateChanges | SortFlags.CanvasOrder; bool hasHSRGPU = SystemInfo.hasHiddenSurfaceRemovalOnGPU; bool canSkipFrontToBackSorting = (camera.opaqueSortMode == OpaqueSortMode.Default && hasHSRGPU) || camera.opaqueSortMode == OpaqueSortMode.NoDistanceSort; cameraData.defaultOpaqueSortFlags = canSkipFrontToBackSorting ? noFrontToBackOpaqueFlags : commonOpaqueFlags; cameraData.Refresh(camera, settings); }