/// <inheritdoc/> public override void Reset() { base.Reset(); // Initialize the helper methods. _helperULR = GeneralToolkit.GetOrAddComponent <Helper_ULR>(gameObject); _helperULR.Reset(); }
/// <summary> /// Updates the values of the blending materials used by the helper ULR classes of objects rendering to this camera. /// </summary> public void UpdateValuesOnPreRender() { // Compute the increment and starting index based on whether the attached camera is stereo. int increment = _isStereo ? 2 : 1; int renderedObjIndex = (_isStereo && _attachedCam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Right) ? 1 : 0; // Loop over all the helper ULR classes. while (renderedObjIndex < _helperULRList.Count) { // If this helper ULR class is null, remove it from the list and skip. Helper_ULR helperULR = _helperULRList[renderedObjIndex]; if (helperULR == null) { _helperULRList.RemoveAt(renderedObjIndex); } else { // Otherwise, if its blending material is also not null, update this material's properties. Material currentBlendingMat = helperULR.currentBlendingMaterial; if (currentBlendingMat != null) { // Compute the number of vertices to process this frame, based on the current framerate. Vector3 vertexFrontIndexAndCountPerFrame = _vertexFrontIndexAndCountPerFrameList[renderedObjIndex]; int blendFieldFrontVertexIndex = (int)vertexFrontIndexAndCountPerFrame.x; int blendFieldVertexCountPerFrame = (int)vertexFrontIndexAndCountPerFrame.y; int totalVertexCount = (int)vertexFrontIndexAndCountPerFrame.z; float minVertexCountForTotalRendering = totalVertexCount * 1f / helperULR.maxFrameCountForProcessing; blendFieldFrontVertexIndex = (blendFieldFrontVertexIndex + blendFieldVertexCountPerFrame) % totalVertexCount; float blendFieldFrameRatio = 1f / (helperULR.targetFramerate * Time.smoothDeltaTime); blendFieldVertexCountPerFrame = Mathf.RoundToInt(Mathf.Max(blendFieldFrameRatio * blendFieldVertexCountPerFrame, minVertexCountForTotalRendering)); blendFieldVertexCountPerFrame = Mathf.Clamp(blendFieldVertexCountPerFrame, 1, totalVertexCount); int nextBlendFieldFrontVertexIndex = (blendFieldFrontVertexIndex + blendFieldVertexCountPerFrame) % totalVertexCount; Vector2 blendFieldComputationParams = new Vector2(blendFieldFrontVertexIndex, nextBlendFieldFrontVertexIndex); _vertexFrontIndexAndCountPerFrameList[renderedObjIndex] = new Vector3(blendFieldFrontVertexIndex, blendFieldVertexCountPerFrame, totalVertexCount); // Update the blending material's properties. Graphics.ClearRandomWriteTargets(); Graphics.SetRandomWriteTarget(1, _vertexCamWeightsBufferList[renderedObjIndex]); Graphics.SetRandomWriteTarget(2, _vertexCamIndicesBufferList[renderedObjIndex]); currentBlendingMat.SetBuffer(_shaderNameVertexCamWeightsBuffer, _vertexCamWeightsBufferList[renderedObjIndex]); currentBlendingMat.SetBuffer(_shaderNameVertexCamIndicesBuffer, _vertexCamIndicesBufferList[renderedObjIndex]); currentBlendingMat.SetVector(_shaderNameBlendFieldComputationParams, blendFieldComputationParams); currentBlendingMat.SetInt(_shaderNameIsSceneViewCamera, _isSceneViewCamera ? 1 : 0); } renderedObjIndex += increment; } } }
/// <summary> /// Adds an object rendered with ULR to the list of objects currently rendering to this camera. /// </summary> /// <param name="helperULR"></param> The helper ULR method attached to the object rendering to this camera. /// <param name="totalVertexCount"></param> The total vertex count of the mesh attached to the object rendering to this camera. public void AddRenderedObject(Helper_ULR helperULR, int totalVertexCount) { if (!_initialized) { Initialize(); } if (_initialized) { int addCount = _isStereo ? 2 : 1; for (int addIter = 0; addIter < addCount; addIter++) { _helperULRList.Add(helperULR); _vertexCamWeightsBufferList.Add(new ComputeBuffer(totalVertexCount, 4 * sizeof(float))); _vertexCamIndicesBufferList.Add(new ComputeBuffer(totalVertexCount, 4 * sizeof(uint))); _vertexFrontIndexAndCountPerFrameList.Add(new Vector3(0, totalVertexCount, totalVertexCount)); } OnPreRender(); } }