void OnPostRender() { if (!CheckResources()) { return; } Camera cam = Camera.main; if (cam == null) { return; } //NOTE kind of overkill for just 2 volumes... but keeps it together _volumesData[0].WorldToLocal = volumeATransform.worldToLocalMatrix; _volumesData[0].Extents = volumeA.bounds.extents; _volumesData[1].WorldToLocal = volumeBTransform.worldToLocalMatrix; _volumesData[1].Extents = volumeB.bounds.extents; // Note: Assuming sphere and box are children! // If using single game object then scale is applied to bounds and localmatrix meaning its applied twice in shader! // Sphere _volumesData[2].WorldToLocal = sphere.worldToLocalMatrix; _volumesData[2].Extents = sphere.GetChild(0).GetComponent <MeshRenderer>().bounds.extents; // Box _volumesData[3].WorldToLocal = box.worldToLocalMatrix; _volumesData[3].Extents = box.GetChild(0).GetComponent <MeshRenderer>().bounds.extents; _volumes.SetData(_volumesData); AVolumeUtils.SetupRaymarchingMatrix(cam.fieldOfView, cam.worldToCameraMatrix, new Vector2(cam.pixelWidth, cam.pixelHeight)); _cmd.Clear(); _cmd.SetGlobalVector("_BlitScaleBiasRt", new Vector4(1f, 1f, 0f, 0f)); _cmd.SetGlobalVector("_BlitScaleBias", new Vector4(1f, 1f, 0f, 0f)); _cmd.SetGlobalBuffer("_VolumeBuffer", _volumes); _cmd.SetGlobalTexture("_VolumeATex", volumeA.sdfTexture); _cmd.SetGlobalTexture("_VolumeBTex", volumeB.sdfTexture); Vector4 sphereData = sphere.transform.position; sphereData.w = sphereRadius; _cmd.SetGlobalVector("_Sphere", sphereData); Vector4 boxData = box.transform.position; boxData.w = boxSize; _cmd.SetGlobalVector("_Box", boxData); _cmd.DrawProcedural(Matrix4x4.identity, _material, 0, MeshTopology.Quads, 4, 1); Graphics.ExecuteCommandBuffer(_cmd); }
private void OnRenderObject() { if (data == null || data.sdfTexture == null) { return; } //render preview - only for testing! //try to get active camera... Camera cam = Camera.main; #if UNITY_EDITOR if (UnityEditor.SceneView.lastActiveSceneView != null) { cam = UnityEditor.SceneView.lastActiveSceneView.camera; } #endif if (_material == null) { Shader shader = Shader.Find("XRA/SDFr"); if (shader != null) { _material = new Material(shader); } } if (_material == null) { return; } CommandBuffer _cmd = new CommandBuffer(); _material.SetTexture("_SDFVolumeTex", data.sdfTexture); _material.SetVector("_SDFVolumeExtents", Vector3.one * 0.5f); //_material.SetMatrix(_SDFVolumeLocalToWorld, _volume.LocalToWorldNoScale); _material.SetMatrix("_SDFVolumeWorldToLocal", volMatrixLocalToWorld.inverse); //_material.SetFloat(_SDFVolumeFlip, flip ? -1f : 1f); _material.SetVector("_BlitScaleBiasRt", new Vector4(1f, 1f, 0f, 0f)); _material.SetVector("_BlitScaleBias", new Vector4(1f, 1f, 0f, 0f)); _material.SetFloat("_SDFPreviewEpsilon", epsilon); _material.SetFloat("_SDFPreviewNormalDelta", normalDelta); AVolumeUtils.SetupRaymarchingMatrix( cam.fieldOfView, cam.worldToCameraMatrix, new Vector2(cam.pixelWidth, cam.pixelHeight)); _cmd.DrawProcedural(Matrix4x4.identity, _material, 0, MeshTopology.Quads, 4, 1); Graphics.ExecuteCommandBuffer(_cmd); _cmd.Release(); }
void OnPostRender() { if (!CheckResources()) { return; } Camera cam = Camera.main; if (cam == null) { return; } //NOTE kind of overkill for just 2 volumes... but keeps it together _volumesData[0].WorldToLocal = volumeATransform.worldToLocalMatrix; _volumesData[0].Extents = volumeA.bounds.extents; _volumesData[1].WorldToLocal = volumeBTransform.worldToLocalMatrix; _volumesData[1].Extents = volumeB.bounds.extents; _volumes.SetData(_volumesData); AVolumeUtils.SetupRaymarchingMatrix(cam.fieldOfView, cam.worldToCameraMatrix, new Vector2(cam.pixelWidth, cam.pixelHeight)); _cmd.Clear(); _cmd.SetGlobalVector("_BlitScaleBiasRt", new Vector4(1f, 1f, 0f, 0f)); _cmd.SetGlobalVector("_BlitScaleBias", new Vector4(1f, 1f, 0f, 0f)); _cmd.SetGlobalBuffer("_VolumeBuffer", _volumes); _cmd.SetGlobalTexture("_VolumeATex", volumeA.sdfTexture); _cmd.SetGlobalTexture("_VolumeBTex", volumeB.sdfTexture); Vector4 sphereData = sphere.transform.position; sphereData.w = sphereRadius; _cmd.SetGlobalVector("_Sphere", sphereData); Vector4 boxData = box.transform.position; boxData.w = boxSize; _cmd.SetGlobalVector("_Box", boxData); _cmd.DrawProcedural(Matrix4x4.identity, _material, 0, MeshTopology.Quads, 4, 1); Graphics.ExecuteCommandBuffer(_cmd); }