Ejemplo n.º 1
0
            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;
            }
Ejemplo n.º 2
0
            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);
            }