Exemple #1
0
        private Sampler GenerateTextureSampler(TextureCoordinateMode texCoordMode, SamplerFilter samplerFilter)
        {
            //Default to linear if not supported
            if (samplerFilter == SamplerFilter.Anisotropic && !_components.Device.SamplerAnisotropy)
            {
                samplerFilter = SamplerFilter.MinLinear_MagLinear_MipLinear;
            }

            SamplerAddressMode samplerAddressMode = SamplerAddressMode.Wrap;

            switch (texCoordMode)
            {
            case TextureCoordinateMode.Mirror:
                samplerAddressMode = SamplerAddressMode.Mirror;
                break;

            case TextureCoordinateMode.Wrap:
                samplerAddressMode = SamplerAddressMode.Wrap;
                break;
            }

            return(_components.Factory.CreateSampler(new SamplerDescription(
                                                         samplerAddressMode,
                                                         samplerAddressMode,
                                                         samplerAddressMode,
                                                         samplerFilter,
                                                         null,
                                                         MAXIMUM_ANISTROPHY,
                                                         0, 0, 0,
                                                         SamplerBorderColor.TransparentBlack
                                                         )));
        }
 private SamplerStateDescription(SamplerFilter filter, SamplerAddressMode addressMode)
 {
     Filter        = filter;
     AddressU      = addressMode;
     AddressV      = addressMode;
     MaxAnisotropy = 0;
 }
Exemple #3
0
 public static SamplerDescription AsDescription(this SamplerAddressMode addressMode, SamplerFilter filter) => new SamplerDescription()
 {
     AddressModeU = addressMode,
     AddressModeV = addressMode,
     AddressModeW = addressMode,
     Filter       = filter
 };
Exemple #4
0
 protected override SamplerState CreateSamplerStateCore(
     SamplerAddressMode addressU,
     SamplerAddressMode addressV,
     SamplerAddressMode addressW,
     SamplerFilter filter,
     int maxAnisotropy,
     RgbaFloat borderColor,
     DepthComparison comparison,
     int minimumLod,
     int maximumLod,
     int lodBias)
 {
     return(new VkSamplerState(
                _device,
                addressU,
                addressV,
                addressW,
                filter,
                maxAnisotropy,
                borderColor,
                comparison,
                minimumLod,
                maximumLod,
                lodBias));
 }
Exemple #5
0
        public D3DSamplerState(
            Device device,
            SamplerAddressMode addressU,
            SamplerAddressMode addressV,
            SamplerAddressMode addressW,
            SamplerFilter filter,
            int maxAnisotropy,
            RgbaFloat borderColor,
            DepthComparison comparison,
            int minimumLod,
            int maximumLod,
            int lodBias)
        {
            SamplerStateDescription ssd = new SamplerStateDescription();

            ssd.AddressU           = D3DFormats.VeldridToD3DSamplerAddressMode(addressU);
            ssd.AddressV           = D3DFormats.VeldridToD3DSamplerAddressMode(addressV);
            ssd.AddressW           = D3DFormats.VeldridToD3DSamplerAddressMode(addressW);
            ssd.Filter             = D3DFormats.VeldridToD3DSamplerFilter(filter);
            ssd.MaximumAnisotropy  = maxAnisotropy;
            ssd.BorderColor        = new RawColor4(borderColor.R, borderColor.G, borderColor.B, borderColor.A);
            ssd.ComparisonFunction = D3DFormats.VeldridToD3DDepthComparison(comparison);
            ssd.MinimumLod         = minimumLod;
            ssd.MaximumLod         = maximumLod;
            ssd.MipLodBias         = lodBias;
            _d3dSamplerState       = new SharpDX.Direct3D11.SamplerState(device, ssd);
        }
Exemple #6
0
            public unsafe InternalSamplerState(
                SamplerAddressMode addressU,
                SamplerAddressMode addressV,
                SamplerAddressMode addressW,
                SamplerFilter filter,
                int maxAnisotropy,
                RgbaFloat borderColor,
                DepthComparison comparison,
                int minLod,
                int maxLod,
                int lodBias,
                bool mip)
            {
                _samplerID = GL.GenSampler();

                GL.SamplerParameter(_samplerID, SamplerParameterName.TextureWrapR, (int)OpenGLFormats.VeldridToGLTextureWrapMode(addressU));
                Utilities.CheckLastGLError();
                GL.SamplerParameter(_samplerID, SamplerParameterName.TextureWrapS, (int)OpenGLFormats.VeldridToGLTextureWrapMode(addressV));
                Utilities.CheckLastGLError();
                GL.SamplerParameter(_samplerID, SamplerParameterName.TextureWrapT, (int)OpenGLFormats.VeldridToGLTextureWrapMode(addressW));
                Utilities.CheckLastGLError();

                if (addressU == SamplerAddressMode.Border || addressV == SamplerAddressMode.Border || addressW == SamplerAddressMode.Border)
                {
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureBorderColor, (float *)&borderColor);
                    Utilities.CheckLastGLError();
                }

                GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMinLod, (float)minLod);
                Utilities.CheckLastGLError();
                GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMaxLod, (float)maxLod);
                Utilities.CheckLastGLError();
                GL.SamplerParameter(_samplerID, SamplerParameterName.TextureLodBias, (float)lodBias);
                Utilities.CheckLastGLError();

                if (filter == SamplerFilter.Anisotropic || filter == SamplerFilter.ComparisonAnisotropic)
                {
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMaxAnisotropyExt, (float)maxAnisotropy);
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMinFilter, mip ? (int)TextureMinFilter.LinearMipmapLinear : (int)TextureMinFilter.Linear);
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
                    Utilities.CheckLastGLError();
                }
                else
                {
                    OpenGLFormats.VeldridToGLTextureMinMagFilter(filter, mip, out TextureMinFilter min, out TextureMagFilter mag);
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMinFilter, (int)min);
                    Utilities.CheckLastGLError();
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureMagFilter, (int)mag);
                    Utilities.CheckLastGLError();
                }

                if (s_comparisonFilters.Contains(filter))
                {
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureCompareMode, (int)TextureCompareMode.CompareRefToTexture);
                    Utilities.CheckLastGLError();
                    GL.SamplerParameter(_samplerID, SamplerParameterName.TextureCompareFunc, (int)OpenGLFormats.ConvertDepthComparison(comparison));
                    Utilities.CheckLastGLError();
                }
            }
Exemple #7
0
 protected abstract SamplerState CreateSamplerStateCore(
     SamplerAddressMode addressU,
     SamplerAddressMode addressV,
     SamplerAddressMode addressW,
     SamplerFilter filter,
     int maxAnisotropy,
     RgbaFloat borderColor,
     DepthComparison comparison,
     int minimumLod,
     int maximumLod,
     int lodBias);
Exemple #8
0
        public VkSamplerState(
            VkDevice device,
            SamplerAddressMode addressU,
            SamplerAddressMode addressV,
            SamplerAddressMode addressW,
            SamplerFilter filter,
            int maxAnisotropy,
            RgbaFloat borderColor,
            DepthComparison comparison,
            int minimumLod,
            int maximumLod,
            int lodBias)
        {
            _device           = device;
            AddressU          = addressU;
            AddressV          = addressV;
            AddressW          = addressW;
            Filter            = filter;
            MaximumAnisotropy = maxAnisotropy;
            BorderColor       = borderColor;
            Comparison        = comparison;
            MinimumLod        = minimumLod;
            MaximumLod        = maximumLod;
            LodBias           = lodBias;

            VkSamplerCreateInfo samplerCI = VkSamplerCreateInfo.New();

            samplerCI.addressModeU = VkFormats.VeldridToVkSamplerAddressMode(addressU);
            samplerCI.addressModeV = VkFormats.VeldridToVkSamplerAddressMode(addressV);
            samplerCI.addressModeW = VkFormats.VeldridToVkSamplerAddressMode(addressW);
            VkFormats.GetFilterProperties(
                filter,
                out VkFilter minFilter,
                out VkFilter magFilter,
                out VkSamplerMipmapMode mipmapMode,
                out bool anisotropyEnable,
                out bool compareEnable);
            samplerCI.minFilter        = minFilter;
            samplerCI.magFilter        = magFilter;
            samplerCI.mipmapMode       = mipmapMode;
            samplerCI.maxAnisotropy    = maxAnisotropy;
            samplerCI.anisotropyEnable = anisotropyEnable;
            samplerCI.compareEnable    = compareEnable;
            samplerCI.minLod           = minimumLod;
            samplerCI.maxLod           = maximumLod;
            samplerCI.mipLodBias       = lodBias;
            samplerCI.compareOp        = VkFormats.VeldridToVkDepthComparison(comparison);
            samplerCI.borderColor      = VkBorderColor.FloatOpaqueWhite;
            VkResult result = vkCreateSampler(_device, ref samplerCI, null, out VkSampler sampler);

            CheckResult(result);
            Sampler = sampler;
        }
        public static MTLSamplerAddressMode ToMTLSamplerAddressMode(this SamplerAddressMode value)
        {
            switch (value)
            {
            case SamplerAddressMode.Clamp:
                return(MTLSamplerAddressMode.ClampToEdge);

            case SamplerAddressMode.Wrap:
                return(MTLSamplerAddressMode.Repeat);

            default:
                throw new ArgumentOutOfRangeException(nameof(value));
            }
        }
Exemple #10
0
 /// <summary>
 /// Default SamplerStateDescription values.
 /// </summary>
 public void SetDefault()
 {
     AddressModeU    = SamplerAddressMode.ClampToEdge;
     AddressModeV    = SamplerAddressMode.ClampToEdge;
     AddressModeW    = SamplerAddressMode.ClampToEdge;
     MagFilter       = SamplerMinMagFilter.Nearest;
     MinFilter       = SamplerMinMagFilter.Nearest;
     MipmapFilter    = SamplerMipFilter.Nearest;
     MaxAnisotropy   = 1;
     LodMinClamp     = 0.0f;
     LodMaxClamp     = float.MaxValue;
     CompareFunction = CompareFunction.Never;
     BorderColor     = SamplerBorderColor.TransparentBlack;
 }
        public static TextureAddressMode ToTextureAddressMode(this SamplerAddressMode value)
        {
            switch (value)
            {
            case SamplerAddressMode.Clamp:
                return(TextureAddressMode.Clamp);

            case SamplerAddressMode.Wrap:
                return(TextureAddressMode.Wrap);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemple #12
0
 internal static VkSamplerAddressMode VdToVkSamplerAddressMode(SamplerAddressMode mode)
 {
     switch (mode)
     {
         case SamplerAddressMode.Wrap:
             return VkSamplerAddressMode.Repeat;
         case SamplerAddressMode.Mirror:
             return VkSamplerAddressMode.MirroredRepeat;
         case SamplerAddressMode.Clamp:
             return VkSamplerAddressMode.ClampToEdge;
         case SamplerAddressMode.Border:
             return VkSamplerAddressMode.ClampToBorder;
         default:
             throw Illegal.Value<SamplerAddressMode>();
     }
 }
Exemple #13
0
        internal static TextureWrapMode VdToGLTextureWrapMode(SamplerAddressMode mode)
        {
            switch (mode)
            {
            case SamplerAddressMode.Wrap:
                return(TextureWrapMode.Repeat);

            case SamplerAddressMode.Mirror:
                return(TextureWrapMode.MirroredRepeat);

            case SamplerAddressMode.Clamp:
                return(TextureWrapMode.Clamp);

            case SamplerAddressMode.Border:
                return(TextureWrapMode.ClampToBorder);

            default:
                throw Illegal.Value <SamplerAddressMode>();
            }
        }
Exemple #14
0
        public static VkSamplerAddressMode VeldridToVkSamplerAddressMode(SamplerAddressMode mode)
        {
            switch (mode)
            {
            case SamplerAddressMode.Wrap:
                return(VkSamplerAddressMode.Repeat);

            case SamplerAddressMode.Mirror:
                return(VkSamplerAddressMode.MirroredRepeat);

            case SamplerAddressMode.Clamp:
                return(VkSamplerAddressMode.ClampToEdge);

            case SamplerAddressMode.Border:
                return(VkSamplerAddressMode.ClampToBorder);

            default:
                throw Illegal.Value <SamplerAddressMode>();
            }
        }
Exemple #15
0
        internal static TextureAddressMode VdToD3D11AddressMode(SamplerAddressMode mode)
        {
            switch (mode)
            {
            case SamplerAddressMode.Wrap:
                return(TextureAddressMode.Wrap);

            case SamplerAddressMode.Mirror:
                return(TextureAddressMode.Mirror);

            case SamplerAddressMode.Clamp:
                return(TextureAddressMode.Clamp);

            case SamplerAddressMode.Border:
                return(TextureAddressMode.Border);

            default:
                throw Illegal.Value <SamplerAddressMode>();
            }
        }
Exemple #16
0
        internal static MTLSamplerAddressMode VdToMTLAddressMode(SamplerAddressMode mode)
        {
            switch (mode)
            {
            case SamplerAddressMode.Border:
                return(MTLSamplerAddressMode.ClampToBorderColor);

            case SamplerAddressMode.Clamp:
                return(MTLSamplerAddressMode.ClampToEdge);

            case SamplerAddressMode.Mirror:
                return(MTLSamplerAddressMode.MirrorRepeat);

            case SamplerAddressMode.Wrap:
                return(MTLSamplerAddressMode.Repeat);

            default:
                throw Illegal.Value <SamplerAddressMode>();
            }
        }
 public SamplerCreateInfo
 (
     StructureType sType             = StructureType.SamplerCreateInfo,
     void *pNext                     = default,
     SamplerCreateFlags flags        = default,
     Filter magFilter                = default,
     Filter minFilter                = default,
     SamplerMipmapMode mipmapMode    = default,
     SamplerAddressMode addressModeU = default,
     SamplerAddressMode addressModeV = default,
     SamplerAddressMode addressModeW = default,
     float mipLodBias                = default,
     Bool32 anisotropyEnable         = default,
     float maxAnisotropy             = default,
     Bool32 compareEnable            = default,
     CompareOp compareOp             = default,
     float minLod                    = default,
     float maxLod                    = default,
     BorderColor borderColor         = default,
     Bool32 unnormalizedCoordinates  = default
 )
 {
     SType                   = sType;
     PNext                   = pNext;
     Flags                   = flags;
     MagFilter               = magFilter;
     MinFilter               = minFilter;
     MipmapMode              = mipmapMode;
     AddressModeU            = addressModeU;
     AddressModeV            = addressModeV;
     AddressModeW            = addressModeW;
     MipLodBias              = mipLodBias;
     AnisotropyEnable        = anisotropyEnable;
     MaxAnisotropy           = maxAnisotropy;
     CompareEnable           = compareEnable;
     CompareOp               = compareOp;
     MinLod                  = minLod;
     MaxLod                  = maxLod;
     BorderColor             = borderColor;
     UnnormalizedCoordinates = unnormalizedCoordinates;
 }
        internal static TextureWrapMode VeldridToGLTextureWrapMode(SamplerAddressMode mode)
        {
            switch (mode)
            {
            case SamplerAddressMode.Wrap:
                return(TextureWrapMode.Repeat);

            case SamplerAddressMode.Mirror:
                Debug.WriteLine("SamplerAddressMode.Mirror is not supported on OpenGL ES.");
                return(TextureWrapMode.Clamp);

            case SamplerAddressMode.Clamp:
                return(TextureWrapMode.Clamp);

            case SamplerAddressMode.Border:
                return(TextureWrapMode.ClampToBorder);

            default:
                throw Illegal.Value <SamplerAddressMode>();
            }
        }
 /// <summary>
 /// Constructs a new SamplerDescription.
 /// </summary>
 /// <param name="addressModeU">The <see cref="SamplerAddressMode"/> mode to use for the U (or R) coordinate.</param>
 /// <param name="addressModeV">The <see cref="SamplerAddressMode"/> mode to use for the V (or S) coordinate.</param>
 /// <param name="addressModeW">The <see cref="SamplerAddressMode"/> mode to use for the W (or T) coordinate.</param>
 /// <param name="filter">The filter used when sampling.</param>
 /// <param name="comparisonKind">An optional value controlling the kind of comparison to use when sampling. If null,
 /// comparison sampling is not used.</param>
 /// <param name="maximumAnisotropy">The maximum anisotropy of the filter, when <see cref="SamplerFilter.Anisotropic"/> is
 /// used, or otherwise ignored.</param>
 /// <param name="minimumLod">The minimum level of detail.</param>
 /// <param name="maximumLod">The maximum level of detail.</param>
 /// <param name="lodBias">The level of detail bias.</param>
 /// <param name="borderColor">The constant color that is sampled when <see cref="SamplerAddressMode.Border"/> is used, or
 /// otherwise ignored.</param>
 public SamplerDescription(
     SamplerAddressMode addressModeU,
     SamplerAddressMode addressModeV,
     SamplerAddressMode addressModeW,
     SamplerFilter filter,
     ComparisonKind?comparisonKind,
     uint maximumAnisotropy,
     uint minimumLod,
     uint maximumLod,
     int lodBias,
     SamplerBorderColor borderColor)
 {
     AddressModeU      = addressModeU;
     AddressModeV      = addressModeV;
     AddressModeW      = addressModeW;
     Filter            = filter;
     ComparisonKind    = comparisonKind;
     MaximumAnisotropy = maximumAnisotropy;
     MinimumLod        = minimumLod;
     MaximumLod        = maximumLod;
     LodBias           = lodBias;
     BorderColor       = borderColor;
 }
Exemple #20
0
 public unsafe OpenGLSamplerState(
     SamplerAddressMode addressU,
     SamplerAddressMode addressV,
     SamplerAddressMode addressW,
     SamplerFilter filter,
     int maxAnisotropy,
     RgbaFloat borderColor,
     DepthComparison comparison,
     int minLod,
     int maxLod,
     int lodBias)
 {
     AddressU          = addressU;
     AddressV          = addressV;
     AddressW          = addressW;
     Filter            = filter;
     MaximumAnisotropy = maxAnisotropy;
     BorderColor       = borderColor;
     Comparison        = comparison;
     MinimumLod        = minLod;
     MaximumLod        = maxLod;
     LodBias           = lodBias;
 }
Exemple #21
0
 /// <summary>
 /// Creates a new <see cref="SamplerState"/> with the given properties.
 /// </summary>
 /// <param name="addressU">A value controlling U-coordinate (R-coordinate in OpenGL) sampling.</param>
 /// <param name="addressV">A value controlling V-coordinate (S-coordinate in OpenGL) sampling.</param>
 /// <param name="addressW">A value controlling W-coordinate (T-coordinate in OpenGL) sampling.</param>
 /// <param name="filter">The filter kind to use.</param>
 /// <param name="maxAnisotropy">If <paramref name="filter"/> is equal to Anisotropic, then this parameter
 /// controls the level of anisotropic filtering used.</param>
 /// <param name="borderColor">When a border-type filter is used, this controls the sampled border color.</param>
 /// <param name="comparison">Controls the comparison used when a Comparison-type filter is used.</param>
 /// <param name="minimumLod">The highest-quality LOD level (lowest level) the sampler will access.</param>
 /// <param name="maximumLod">The lowerst-quality LOD level (lowest level) the sampler will access.</param>
 /// <param name="lodBias">A bias to use when choosing which LOD level to sample from.</param>
 /// <returns>A new <see cref="SamplerState"/> which supports the given properties.</returns>
 public SamplerState CreateSamplerState(
     SamplerAddressMode addressU,
     SamplerAddressMode addressV,
     SamplerAddressMode addressW,
     SamplerFilter filter,
     int maxAnisotropy,
     RgbaFloat borderColor,
     DepthComparison comparison,
     int minimumLod,
     int maximumLod,
     int lodBias)
 {
     return(CreateSamplerStateCore(
                addressU,
                addressV,
                addressW,
                filter,
                maxAnisotropy,
                borderColor,
                comparison,
                minimumLod,
                maximumLod,
                lodBias));
 }
Exemple #22
0
        public Sampler(Filter magFilter, Filter minFilter, SamplerMipmapMode mipmapMode, SamplerAddressMode addressModeU, SamplerAddressMode addressModeV, SamplerAddressMode addressModeW, float mipLodBias, float maxAnisotropy, float minLod, float maxLod, BorderColor aBorderColor)
        {
            SamplerCreateInfo sampler = new SamplerCreateInfo();

            sampler.MagFilter     = magFilter;
            sampler.MinFilter     = minFilter;
            sampler.MipmapMode    = mipmapMode;
            sampler.AddressModeU  = addressModeU;
            sampler.AddressModeV  = addressModeV;
            sampler.AddressModeW  = addressModeW;
            sampler.MipLodBias    = mipLodBias;
            sampler.MaxAnisotropy = maxAnisotropy;
            sampler.MinLod        = minLod;
            sampler.MaxLod        = maxLod;
            sampler.BorderColor   = aBorderColor;
            VulkanRenderer.SelectedLogicalDevice.CreateSampler(this, sampler);
        }
Exemple #23
0
 /// <param name="MagFilter">Filter mode for magnification</param>
 /// <param name="MinFilter">Filter mode for minifiation</param>
 /// <param name="MipmapMode">Mipmap selection mode</param>
 public SamplerCreateInfo(Filter MagFilter, Filter MinFilter, SamplerMipmapMode MipmapMode, SamplerAddressMode AddressModeU, SamplerAddressMode AddressModeV, SamplerAddressMode AddressModeW, Single MipLodBias, Bool32 AnisotropyEnable, Single MaxAnisotropy, Bool32 CompareEnable, CompareOp CompareOp, Single MinLod, Single MaxLod, BorderColor BorderColor, Bool32 UnnormalizedCoordinates) : this()
 {
     this.MagFilter               = MagFilter;
     this.MinFilter               = MinFilter;
     this.MipmapMode              = MipmapMode;
     this.AddressModeU            = AddressModeU;
     this.AddressModeV            = AddressModeV;
     this.AddressModeW            = AddressModeW;
     this.MipLodBias              = MipLodBias;
     this.AnisotropyEnable        = AnisotropyEnable;
     this.MaxAnisotropy           = MaxAnisotropy;
     this.CompareEnable           = CompareEnable;
     this.CompareOp               = CompareOp;
     this.MinLod                  = MinLod;
     this.MaxLod                  = MaxLod;
     this.BorderColor             = BorderColor;
     this.UnnormalizedCoordinates = UnnormalizedCoordinates;
 }