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; } } } } var texture = Renderer.CreateTexture3D(bSize, gSize, rSize, TextureFormat.Unorm16); Renderer.UpdateTexture3D(texture, data); m_Texture3D = texture.GetManaged(); m_CurrentFileName = FileName; }
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 Half[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 = (float)((1 << header.OutputBitDepth) - 1); data[b, g, r *channelCount + 0] = lut[lutOffset + 2] / max; data[b, g, r *channelCount + 1] = lut[lutOffset + 1] / max; data[b, g, r *channelCount + 2] = lut[lutOffset + 0] / max; data[b, g, r *channelCount + 3] = 1; } } } } m_Texture3D = Renderer.CreateTexture3D(bSize, gSize, rSize); Renderer.UpdateTexture3D(m_Texture3D, data); }