private void UpdateRaytrace() { // make sure the canvas is correct int newWidth = (int)(Screen.width / _downsampling); if (_canvasTex == null || _canvasTex.width != newWidth) { _canvasTex = new Texture2D(newWidth, (int)(Screen.height / _downsampling)); _canvasTex.filterMode = FilterMode.Point; } // get main camera Camera cam = Camera.main; // get width and height int width = _canvasTex.width, height = _canvasTex.height; // get z pos float camZ = cam.transform.position.z; Color black = Color.black; // calculate color for each pixel on the canvas for (float i = 0; i < width; ++i) { for (float j = 0; j < height; ++j) { // Get Ray from pixel and zpos Vector3 pos = new Vector3(i / width, j / height, camZ); Ray ray = cam.ViewportPointToRay(pos); RaycastHit raycastHitInfo; bool didHit = Physics.Raycast(ray, out raycastHitInfo); if (didHit) { // get the color from the RayTraceRenderer RayTraceRenderer comp = raycastHitInfo.collider.GetComponent <RayTraceRenderer>(); if (comp != null) { _canvasTex.SetPixel((int)i, (int)j, comp.CalculateColor(raycastHitInfo, _recursionDepth, _ambience, ray)); } else { _canvasTex.SetPixel((int)i, (int)j, black); } } else { // otherwise just set the color to black _canvasTex.SetPixel((int)i, (int)j, black); } } } _canvasTex.Apply(); }
private Color Bounce(Ray ray, int depth) { RaycastHit raycastHitInfo; if (Physics.Raycast(ray, out raycastHitInfo)) { RayTraceRenderer comp = raycastHitInfo.collider.GetComponent <RayTraceRenderer>(); if (comp != null) { return(comp.CalculateColor(ray, raycastHitInfo, depth - 1)); } } return(Color.clear); }
protected Color Bounce(Ray inRay, int depth, float ambience) { if (depth > 0) { RaycastHit outHit; bool hit = Physics.Raycast(inRay, out outHit); if (hit) { RayTraceRenderer renderer = outHit.transform.gameObject.GetComponent <RayTraceRenderer>(); if (renderer) { return(renderer.CalculateColor(outHit, --depth, ambience, inRay)); } } } return(Color.clear); }
public void Init() { Instance = this; updateProgress(0); HaltonTool.InitHaltonSequence(); Debug.Log("Start Time : " + Time.realtimeSinceStartup); scene = new SimpleScene(); RayTrace.Init(); SimpleMaterial.textures.Clear(); scene.lights = GameObject.FindObjectsOfType <Light>(); Camera cam = GetComponent <Camera>(); if (cam) { MeshRenderer[] renderers = GameObject.FindObjectsOfType <MeshRenderer>(); foreach (MeshRenderer r in renderers) { bool isLayerVisible = ((1 << r.gameObject.layer) & cam.cullingMask) != 0; if (r.isVisible && isLayerVisible) { MeshFilter filter = r.gameObject.GetComponent <MeshFilter>(); if (filter && filter.sharedMesh) { for (int i = 0; i < filter.sharedMesh.subMeshCount; i++) { Mesh mesh = filter.sharedMesh; int[] triangles = filter.sharedMesh.GetTriangles(i); RayTrace.AddMesh(filter.gameObject.transform, mesh.vertexCount, triangles.Length, mesh.vertices, triangles, 1); SimpleModel model = new SimpleModel(r.gameObject.transform, filter.sharedMesh, i, r.sharedMaterials[i]); model.lights = RayTraceTool.GetActivityLights(r, scene); scene.models.Add(model); } } } } Terrain[] terrains = GameObject.FindObjectsOfType <Terrain>(); foreach (Terrain terrain in terrains) { bool isLayerVisible = ((1 << terrain.gameObject.layer) & cam.cullingMask) != 0; if (terrain.gameObject.activeInHierarchy && isLayerVisible) { int w = terrain.terrainData.heightmapWidth; int h = terrain.terrainData.heightmapHeight; float realWidth = terrain.terrainData.size.x * (1 + 1f / w); float realHeight = terrain.terrainData.size.z * (1 + 1f / h); float[,] heights = terrain.terrainData.GetHeights(0, 0, w, h); Vector3[] vertices = new Vector3[w * h]; Vector2[] uvs = new Vector2[vertices.Length]; Vector3[] normals = new Vector3[vertices.Length]; int[] triangles = new int[(w - 1) * (h - 1) * 2 * 3]; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { Vector3 pos = new Vector3(i * realWidth / w, heights[j, i] * terrain.terrainData.size.y, j * realHeight / h); vertices[j * w + i] = pos; uvs[j * w + i] = new Vector2(i / (float)w, j / (float)h); normals[j * w + i] = terrain.terrainData.GetInterpolatedNormal(i / (float)w, j / (float)h); } } for (int i = 0; i < w - 1; i++) { for (int j = 0; j < h - 1; j++) { int index = (j * (w - 1) + i) * 6; triangles[index + 0] = (i + 0) + (j + 0) * w; triangles[index + 1] = (i + 1) + (j + 1) * w; triangles[index + 2] = (i + 1) + (j + 0) * w; triangles[index + 3] = (i + 0) + (j + 0) * w; triangles[index + 4] = (i + 0) + (j + 1) * w; triangles[index + 5] = (i + 1) + (j + 1) * w; } } RayTrace.AddMesh(terrain.transform, vertices.Length, triangles.Length, vertices, triangles, 1); SimpleModel model = new SimpleModel(); model.mesh = new SimpleMesh(triangles, uvs, vertices, normals); model.material = new SimpleTerrainMaterial(terrain.terrainData); model.rst = new RayTrace.RST(terrain.transform.rotation, terrain.transform.lossyScale, terrain.transform.position); model.lights.AddRange(scene.lights); scene.models.Add(model); } } } RayTrace.Commit(); texture = new Texture2D(width, height, TextureFormat.ARGB32, true); //viewResult.sharedMaterial.mainTexture = texture; }
void OnEnable() { renderer = target as RayTraceRenderer; EditorUtility.ClearProgressBar(); }