//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); }
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); }
public Result CreateSampler(MgSamplerCreateInfo pCreateInfo, IMgAllocationCallbacks allocator, out IMgSampler pSampler) { pSampler = new AmtSampler(mDevice, pCreateInfo); return(Result.SUCCESS); }
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, } }; } }
public Result CreateSampler(MgSamplerCreateInfo pCreateInfo, IMgAllocationCallbacks allocator, out IMgSampler pSampler) { throw new NotImplementedException(); }
public Result CreateSampler(MgSamplerCreateInfo pCreateInfo, IMgAllocationCallbacks allocator, out IMgSampler pSampler) { pSampler = new GLSampler(mEntrypoint.Sampler.CreateSampler(), pCreateInfo, mEntrypoint.Sampler); return(Result.SUCCESS); }
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; } }
public GLSampler(int samplerId, MgSamplerCreateInfo pCreateInfo, IGLSamplerEntrypoint entrypoint) { SamplerId = samplerId; mEntrypoint = entrypoint; Populate(pCreateInfo); }