예제 #1
0
        //private GltfTextureContainer AllocateTextures(int bucketSize, Texture[] textures, GltfImageData[] images)
        //{
        //    return new GltfTextureContainer
        //    {
        //        BucketSize = bucketSize,
        //    };
        //}

        private IMgSampler[] ExtractSamplers(IMgDevice device, Sampler[] samplers)
        {
            var noOfSamplers = samplers != null ? samplers.Length : 0;

            var output = new IMgSampler[noOfSamplers];

            for (var i = 0; i < noOfSamplers; i += 1)
            {
                var src = samplers[i];

                var createInfo = new MgSamplerCreateInfo
                {
                    AddressModeU = GetAddressModeU(src.WrapS),
                    AddressModeV = GetAddressModeV(src.WrapT),
                    MinFilter    = GetMinFilter(src.MinFilter),
                    MagFilter    = GetMagFilter(src.MagFilter),
                    MipmapMode   = GetMipmapMode(src.MinFilter),
                };

                var err = device.CreateSampler(createInfo, null, out IMgSampler pSampler);
                if (err != Result.SUCCESS)
                {
                    throw new InvalidOperationException();
                }
                output[i] = pSampler;
            }
            return(output);
        }
예제 #2
0
        public AmtSampler(IMTLDevice mDevice, MgSamplerCreateInfo pCreateInfo)
        {
            if (pCreateInfo == null)
            {
                throw new ArgumentNullException(nameof(pCreateInfo));
            }

            var descriptor = new MTLSamplerDescriptor
            {
                SAddressMode          = TranslateAddressMode(pCreateInfo.AddressModeU),
                TAddressMode          = TranslateAddressMode(pCreateInfo.AddressModeV),
                RAddressMode          = TranslateAddressMode(pCreateInfo.AddressModeW),
                MinFilter             = TranslateMinFilter(pCreateInfo.MinFilter),
                MagFilter             = TranslateMagFilter(pCreateInfo.MagFilter),
                MipFilter             = TranslateMipFilter(pCreateInfo.MipmapMode),
                LodMinClamp           = pCreateInfo.MinLod,
                LodMaxClamp           = pCreateInfo.MaxLod,
                MaxAnisotropy         = (nuint)pCreateInfo.MaxAnisotropy,
                CompareFunction       = TranslateCompareFunction(pCreateInfo.CompareOp),
                NormalizedCoordinates = !pCreateInfo.UnnormalizedCoordinates,
            };

            Sampler = mDevice.CreateSamplerState(descriptor);
        }
예제 #3
0
 public Result CreateSampler(MgSamplerCreateInfo pCreateInfo, IMgAllocationCallbacks allocator, out IMgSampler pSampler)
 {
     pSampler = new AmtSampler(mDevice, pCreateInfo);
     return(Result.SUCCESS);
 }
예제 #4
0
        void loadTexture(string fileName, MgFormat format)
        {
            IMgImageTools       imageTools = new Magnesium.MgImageTools();
            IMgTextureGenerator optimizer  = new Magnesium.MgStagingBufferOptimizer(mManager.Configuration, imageTools);
            IKTXTextureLoader   loader     = new KTXTextureManager(optimizer, mManager.Configuration);

            using (var fs = System.IO.File.OpenRead(fileName))
            {
                var result = loader.Load(fs);

                // Create sampler
                // In Vulkan textures are accessed by samplers
                // This separates all the sampling information from the
                // texture data
                // This means you could have multiple sampler objects
                // for the same texture with different settings
                // Similar to the samplers available with OpenGL 3.3
                var samplerCreateInfo = new MgSamplerCreateInfo
                {
                    MagFilter    = MgFilter.LINEAR,
                    MinFilter    = MgFilter.LINEAR,
                    MipmapMode   = MgSamplerMipmapMode.LINEAR,
                    AddressModeU = MgSamplerAddressMode.REPEAT,
                    AddressModeV = MgSamplerAddressMode.REPEAT,
                    AddressModeW = MgSamplerAddressMode.REPEAT,
                    MipLodBias   = 0.0f,
                    CompareOp    = MgCompareOp.NEVER,
                    MinLod       = 0.0f,
                    BorderColor  = MgBorderColor.FLOAT_OPAQUE_WHITE,
                };

                // Set max level-of-detail to mip level count of the texture
                var mipLevels = (uint)result.Source.Mipmaps.Length;
                samplerCreateInfo.MaxLod = (float)mipLevels;
                // Enable anisotropic filtering
                // This feature is optional, so we must check if it's supported on the device
                //mManager.Configuration.Partition.


                if (mFeatures.SamplerAnisotropy)
                {
                    // Use max. level of anisotropy for this example
                    samplerCreateInfo.MaxAnisotropy    = mPhysicalDeviceProperties.Limits.MaxSamplerAnisotropy;
                    samplerCreateInfo.AnisotropyEnable = true;
                }
                else
                {
                    // The device does not support anisotropic filtering
                    samplerCreateInfo.MaxAnisotropy    = 1.0f;
                    samplerCreateInfo.AnisotropyEnable = false;
                }

                IMgSampler sampler;
                var        err = mManager.Configuration.Device.CreateSampler(samplerCreateInfo, null, out sampler);
                Debug.Assert(err == Result.SUCCESS);

                // Create image view
                // Textures are not directly accessed by the shaders and
                // are abstracted by image views containing additional
                // information and sub resource ranges
                var viewCreateInfo = new MgImageViewCreateInfo
                {
                    Image = result.TextureInfo.Image,
                    // TODO : FETCH VIEW TYPE FROM KTX
                    ViewType   = MgImageViewType.TYPE_2D,
                    Format     = result.Source.Format,
                    Components = new MgComponentMapping
                    {
                        R = MgComponentSwizzle.R,
                        G = MgComponentSwizzle.G,
                        B = MgComponentSwizzle.B,
                        A = MgComponentSwizzle.A,
                    },
                    // The subresource range describes the set of mip levels (and array layers) that can be accessed through this image view
                    // It's possible to create multiple image views for a single image referring to different (and/or overlapping) ranges of the image
                    SubresourceRange = new MgImageSubresourceRange
                    {
                        AspectMask     = MgImageAspectFlagBits.COLOR_BIT,
                        BaseMipLevel   = 0,
                        BaseArrayLayer = 0,
                        LayerCount     = 1,
                        LevelCount     = mipLevels,
                    }
                };

                IMgImageView view;
                err = mManager.Configuration.Device.CreateImageView(viewCreateInfo, null, out view);
                Debug.Assert(err == Result.SUCCESS);

                texture = new Texture
                {
                    image        = result.TextureInfo.Image,
                    imageLayout  = result.TextureInfo.ImageLayout,
                    deviceMemory = result.TextureInfo.DeviceMemory,
                    sampler      = sampler,
                    width        = result.Source.Width,
                    height       = result.Source.Height,
                    mipLevels    = mipLevels,
                    view         = view,
                    descriptor   = new MgDescriptorImageInfo
                    {
                        ImageLayout = MgImageLayout.GENERAL,
                        ImageView   = view,
                        Sampler     = sampler,
                    }
                };
            }
        }
예제 #5
0
 public Result CreateSampler(MgSamplerCreateInfo pCreateInfo, IMgAllocationCallbacks allocator, out IMgSampler pSampler)
 {
     throw new NotImplementedException();
 }
예제 #6
0
 public Result CreateSampler(MgSamplerCreateInfo pCreateInfo, IMgAllocationCallbacks allocator, out IMgSampler pSampler)
 {
     pSampler = new GLSampler(mEntrypoint.Sampler.CreateSampler(), pCreateInfo, mEntrypoint.Sampler);
     return(Result.SUCCESS);
 }
예제 #7
0
        private void Populate(MgSamplerCreateInfo pCreateInfo)
        {
            Debug.Assert(mEntrypoint != null);
            Debug.Assert(pCreateInfo != null);
            // ARB_SAMPLER_OBJECTS
            mEntrypoint.SetTextureWrapS(SamplerId, pCreateInfo.AddressModeU);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureWrapS, (int) GetAddressMode(pCreateInfo.AddressModeU));

            mEntrypoint.SetTextureWrapT(SamplerId, pCreateInfo.AddressModeV);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureWrapT, (int) GetAddressMode(pCreateInfo.AddressModeV));

            mEntrypoint.SetTextureWrapR(SamplerId, pCreateInfo.AddressModeW);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureWrapR, (int) GetAddressMode(pCreateInfo.AddressModeW));

            mEntrypoint.SetTextureMinLod(SamplerId, pCreateInfo.MinLod);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureMinLod, pCreateInfo.MinLod);

            mEntrypoint.SetTextureMaxLod(SamplerId, pCreateInfo.MaxLod);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureMaxLod, pCreateInfo.MaxLod);

            mEntrypoint.SetTextureMinFilter(SamplerId, pCreateInfo.MinFilter, pCreateInfo.MipmapMode);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureMinFilter, (int) GetMinFilterValue(pCreateInfo.MinFilter, pCreateInfo.MipmapMode));

            mEntrypoint.SetTextureMagFilter(SamplerId, pCreateInfo.MagFilter);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureMagFilter, (int) GetMagFilterValue(pCreateInfo.MagFilter));

            mEntrypoint.SetTextureCompareFunc(SamplerId, pCreateInfo.CompareOp);
            //GL.SamplerParameter (SamplerId, SamplerParameterName.TextureCompareFunc, (int) GetCompareOp(pCreateInfo.CompareOp) );

            // EXT_texture_filter_anisotropic
            //GL.SamplerParameter (samplerId, SamplerParameterName.TextureMaxAnisotropyExt, pCreateInfo.MaxAnisotropy);

            switch (pCreateInfo.BorderColor)
            {
            case MgBorderColor.FLOAT_OPAQUE_BLACK:
                var FLOAT_OPAQUE_BLACK = new float[] {
                    0f,
                    0f,
                    0f,
                    1f
                };
                mEntrypoint.SetTextureBorderColorF(SamplerId, FLOAT_OPAQUE_BLACK);
                break;

            case MgBorderColor.FLOAT_OPAQUE_WHITE:
                var FLOAT_OPAQUE_WHITE = new float[] {
                    1f,
                    1f,
                    1f,
                    1f
                };
                mEntrypoint.SetTextureBorderColorF(SamplerId, FLOAT_OPAQUE_WHITE);
                break;

            case MgBorderColor.FLOAT_TRANSPARENT_BLACK:
                var FLOAT_TRANSPARENT_BLACK = new float[] {
                    0f,
                    0f,
                    0f,
                    0f
                };
                mEntrypoint.SetTextureBorderColorF(SamplerId, FLOAT_TRANSPARENT_BLACK);
                break;

            case MgBorderColor.INT_OPAQUE_BLACK:
                var INT_OPAQUE_BLACK = new int[] {
                    0,
                    0,
                    0,
                    255
                };
                mEntrypoint.SetTextureBorderColorI(SamplerId, INT_OPAQUE_BLACK);
                break;

            case MgBorderColor.INT_OPAQUE_WHITE:
                var INT_OPAQUE_WHITE = new int[] {
                    255,
                    255,
                    255,
                    255
                };
                mEntrypoint.SetTextureBorderColorI(SamplerId, INT_OPAQUE_WHITE);
                break;

            case MgBorderColor.INT_TRANSPARENT_BLACK:
                var INT_TRANSPARENT_BLACK = new int[] {
                    0,
                    0,
                    0,
                    0
                };
                mEntrypoint.SetTextureBorderColorI(SamplerId, INT_TRANSPARENT_BLACK);
                break;
            }
        }
예제 #8
0
 public GLSampler(int samplerId, MgSamplerCreateInfo pCreateInfo, IGLSamplerEntrypoint entrypoint)
 {
     SamplerId   = samplerId;
     mEntrypoint = entrypoint;
     Populate(pCreateInfo);
 }