private void CreateScene() { List <Shape> allShapes = new List <Shape>(FindObjectsOfType <Shape>()); int numTransforms = FindObjectsOfType <AdvancedTransform>().Length; int transformIndex = 0; ShapeData[] shapeData; TransformData[] transformData = null; if (allShapes.Count > 0) { shapeData = new ShapeData[allShapes.Count]; if (numTransforms > 0) { transformData = new TransformData[numTransforms]; } for (int i = 0; i < allShapes.Count; i++) { Shape s = allShapes[i]; Vector3 col = new Vector3(s.color.r, s.color.g, s.color.b); Matrix4x4 transformationMatrix = (Matrix4x4.Translate(s.Position) * Matrix4x4.Rotate(s.Rotation)).inverse; List <AdvancedTransform> shapeTransforms = new List <AdvancedTransform>(s.GetComponentsInParent <AdvancedTransform>()); shapeData[i] = new ShapeData() { transformation = transformationMatrix, scale = new Vector3(Mathf.Abs(s.Scale.x), Mathf.Abs(s.Scale.y), Mathf.Abs(s.Scale.z)), color = col, shapeType = (int)s.shapeType, numTransforms = shapeTransforms.Count, roughness = s.roughness, metalness = s.metalness }; if (shapeTransforms.Count > 0) { foreach (AdvancedTransform t in shapeTransforms) { transformData[transformIndex] = new TransformData() { transformType = (int)t.transformType, scale = t.scale }; transformIndex++; } } } rayMarchingShader.SetInt("numShapes", shapeData.Length); } else { shapeData = new ShapeData[1]; rayMarchingShader.SetInt("numShapes", 0); } if (numTransforms == 0) { transformData = new TransformData[1]; } ComputeBuffer shapeBuffer = new ComputeBuffer(shapeData.Length, ShapeData.GetSize()); shapeBuffer.SetData(shapeData); rayMarchingShader.SetBuffer(0, "shapes", shapeBuffer); buffersToDispose.Add(shapeBuffer); ComputeBuffer transformBuffer = new ComputeBuffer(transformData.Length, TransformData.GetSize()); transformBuffer.SetData(transformData); rayMarchingShader.SetBuffer(0, "advancedTransforms", transformBuffer); buffersToDispose.Add(transformBuffer); }