private void Create3DTexture() { if (m_Texture3D != null) { return; } const int cubeSize = 256; const int width = cubeSize; const int height = cubeSize; const int depth = cubeSize; m_Texture3D = Renderer.CreateTexture3D(width, height, depth, TextureFormat.Unorm16); Renderer.UpdateTexture3D(m_Texture3D, Create3DLut(width, height, depth)); }
private unsafe void Upload3DLut(Lut3DHeader header, byte[] lutBuffer) { int inputBitsR = header.InputBitDepth[2]; int inputBitsG = header.InputBitDepth[1]; int inputBitsB = header.InputBitDepth[0]; int rSize = 1 << inputBitsR; int gSize = 1 << inputBitsG; int bSize = 1 << inputBitsB; const int channelCount = 4; var data = new ushort[bSize, gSize, rSize *channelCount]; fixed(void *lutByte = lutBuffer) { var lut = (ushort *)lutByte; for (int b = 0; b < bSize; b++) { for (int g = 0; g < gSize; g++) { for (int r = 0; r < rSize; r++) { var lutOffset = ((r << (inputBitsG + inputBitsB)) + (g << inputBitsB) + b) * 3; var max = (1 << header.OutputBitDepth) - 1; var n = ushort.MaxValue / max; data[b, g, r *channelCount + 0] = (ushort)(lut[lutOffset + 2] * n); data[b, g, r *channelCount + 1] = (ushort)(lut[lutOffset + 1] * n); data[b, g, r *channelCount + 2] = (ushort)(lut[lutOffset + 0] * n); data[b, g, r *channelCount + 3] = ushort.MaxValue; } } } } m_Texture3D = Renderer.CreateTexture3D(bSize, gSize, rSize, TextureFormat.Unorm16); Renderer.UpdateTexture3D(m_Texture3D, data); }