public static Material CreateMaterialDVR(VolumeDataset dataset) { Shader shader = Shader.Find("VolumeRendering/DirectVolumeRenderingShader"); Material material = new Material(shader); const int noiseDimX = 512; const int noiseDimY = 512; Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY); material.SetTexture("_NoiseTex", noiseTexture); material.SetTexture("_DataTex", dataset.GetDataTexture()); return(material); }
public static VolumeRenderedObject CreateObject(VolumeDataset dataset) { GameObject outerObject = new GameObject("VolumeRenderedObject_" + dataset.datasetName); VolumeRenderedObject volObj = outerObject.AddComponent <VolumeRenderedObject>(); GameObject meshContainer = GameObject.Instantiate((GameObject)Resources.Load("VolumeContainer")); meshContainer.transform.parent = outerObject.transform; meshContainer.transform.localScale = Vector3.one; meshContainer.transform.localPosition = Vector3.zero; meshContainer.transform.parent = outerObject.transform; outerObject.transform.localRotation = Quaternion.Euler(90.0f, 0.0f, 0.0f); MeshRenderer meshRenderer = meshContainer.GetComponent <MeshRenderer>(); meshRenderer.sharedMaterial = new Material(meshRenderer.sharedMaterial); volObj.meshRenderer = meshRenderer; volObj.dataset = dataset; const int noiseDimX = 512; const int noiseDimY = 512; Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY); TransferFunction tf = TransferFunctionDatabase.CreateTransferFunction(); Texture2D tfTexture = tf.GetTexture(); volObj.transferFunction = tf; TransferFunction2D tf2D = TransferFunctionDatabase.CreateTransferFunction2D(); volObj.transferFunction2D = tf2D; meshRenderer.sharedMaterial.SetTexture("_DataTex", dataset.GetDataTexture()); meshRenderer.sharedMaterial.SetTexture("_GradientTex", null); meshRenderer.sharedMaterial.SetTexture("_NoiseTex", noiseTexture); meshRenderer.sharedMaterial.SetTexture("_TFTex", tfTexture); meshRenderer.sharedMaterial.EnableKeyword("MODE_DVR"); meshRenderer.sharedMaterial.DisableKeyword("MODE_MIP"); meshRenderer.sharedMaterial.DisableKeyword("MODE_SURF"); if (dataset.scaleX != 0.0f && dataset.scaleY != 0.0f && dataset.scaleZ != 0.0f) { float maxScale = Mathf.Max(dataset.scaleX, dataset.scaleY, dataset.scaleZ); volObj.transform.localScale = new Vector3(dataset.scaleX / maxScale, dataset.scaleY / maxScale, dataset.scaleZ / maxScale); } return(volObj); }
/// <summary> /// Generates a histogram (but computaion is done on GPU) where: /// X-axis = the data sample (density) value /// Y-axis = the sample count (number of data samples with the specified density) /// </summary> /// <param name="dataset"></param> /// <returns></returns> public static Texture2D GenerateHistogramTextureOnGPU(VolumeDataset dataset) { double actualBound = dataset.GetMaxDataValue() - dataset.GetMinDataValue() + 1; int numValues = System.Convert.ToInt32(dataset.GetMaxDataValue() - dataset.GetMinDataValue() + 1); // removed +1 int sampleCount = System.Math.Min(numValues, 256); ComputeShader computeHistogram = Resources.Load("ComputeHistogram") as ComputeShader; int handleInitialize = computeHistogram.FindKernel("HistogramInitialize"); int handleMain = computeHistogram.FindKernel("HistogramMain"); ComputeBuffer histogramBuffer = new ComputeBuffer(sampleCount, sizeof(uint) * 1); uint[] histogramData = new uint[sampleCount]; Color32[] histogramCols = new Color32[sampleCount]; Texture3D dataTexture = dataset.GetDataTexture(); if (handleInitialize < 0 || handleMain < 0) { Debug.LogError("Histogram compute shader initialization failed."); } computeHistogram.SetFloat("ValueRange", (float)(numValues - 1)); computeHistogram.SetTexture(handleMain, "VolumeTexture", dataTexture); computeHistogram.SetBuffer(handleMain, "HistogramBuffer", histogramBuffer); computeHistogram.SetBuffer(handleInitialize, "HistogramBuffer", histogramBuffer); computeHistogram.Dispatch(handleInitialize, sampleCount / 8, 1, 1); computeHistogram.Dispatch(handleMain, (dataTexture.width + 7) / 8, (dataTexture.height + 7) / 8, (dataTexture.depth + 7) / 8); histogramBuffer.GetData(histogramData); int maxValue = (int)histogramData.Max(); Texture2D texture = new Texture2D(sampleCount, 1, TextureFormat.RGBA32, false); for (int iSample = 0; iSample < sampleCount; iSample++) { histogramCols[iSample] = new Color(Mathf.Log10((float)histogramData[iSample]) / Mathf.Log10((float)maxValue), 0.0f, 0.0f, 1.0f); } texture.SetPixels32(histogramCols); texture.Apply(); return(texture); }
public SlicingPlane CreateSlicingPlane() { GameObject sliceRenderingPlane = GameObject.Instantiate(Resources.Load <GameObject>("SlicingPlane")); sliceRenderingPlane.transform.parent = transform; sliceRenderingPlane.transform.localPosition = Vector3.zero; sliceRenderingPlane.transform.localRotation = Quaternion.identity; MeshRenderer sliceMeshRend = sliceRenderingPlane.GetComponent <MeshRenderer>(); sliceMeshRend.material = new Material(sliceMeshRend.sharedMaterial); Material sliceMat = sliceRenderingPlane.GetComponent <MeshRenderer>().sharedMaterial; sliceMat.SetTexture("_DataTex", dataset.GetDataTexture()); sliceMat.SetTexture("_TFTex", transferFunction.GetTexture()); sliceMat.SetMatrix("_parentInverseMat", transform.worldToLocalMatrix); sliceMat.SetMatrix("_planeMat", Matrix4x4.TRS(sliceRenderingPlane.transform.position, sliceRenderingPlane.transform.rotation, Vector3.one)); // TODO: allow changing scale return(sliceRenderingPlane.GetComponent <SlicingPlane>()); }
public static VolumeRenderedObject CreateObject(VolumeDataset dataset) { GameObject obj = GameObject.Instantiate((GameObject)Resources.Load("VolumeRenderedObject")); VolumeRenderedObject volObj = obj.GetComponent <VolumeRenderedObject>(); MeshRenderer meshRenderer = obj.GetComponent <MeshRenderer>(); meshRenderer.material = new Material(meshRenderer.sharedMaterial); volObj.dataset = dataset; const int noiseDimX = 512; const int noiseDimY = 512; Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY); TransferFunction tf = TransferFunctionDatabase.CreateTransferFunction(); Texture2D tfTexture = tf.GetTexture(); volObj.transferFunction = tf; tf.histogramTexture = HistogramTextureGenerator.GenerateHistogramTexture(dataset); TransferFunction2D tf2D = TransferFunctionDatabase.CreateTransferFunction2D(); volObj.transferFunction2D = tf2D; meshRenderer.sharedMaterial.SetTexture("_DataTex", dataset.GetDataTexture()); meshRenderer.sharedMaterial.SetTexture("_GradientTex", null); meshRenderer.sharedMaterial.SetTexture("_NoiseTex", noiseTexture); meshRenderer.sharedMaterial.SetTexture("_TFTex", tfTexture); meshRenderer.sharedMaterial.EnableKeyword("MODE_DVR"); meshRenderer.sharedMaterial.DisableKeyword("MODE_MIP"); meshRenderer.sharedMaterial.DisableKeyword("MODE_SURF"); return(volObj); }