/// <summary> /// Update sampler parameters, accorndly to <see cref="Texture"/> and <see cref="Sampler"/> properties. /// </summary> /// <param name="ctx"> /// The <see cref="GraphicsContext"/> managing this TextureUnit. /// </param> public void SamplerParameters(GraphicsContext ctx) { GraphicsResource.CheckCurrentContext(ctx); Texture texture = Texture; if (texture == null) { throw new InvalidOperationException("no texture bound"); } SamplerParameters samplerParams = texture.SamplerParams; Sampler sampler = Sampler; // Sampler parameters always overrides texture unit parameters if (sampler != null) { if (ctx.Extensions.SamplerObjects_ARB) { // Ensure sampler parameters in sync sampler.Bind(ctx, this); // Fast path? No need to update texture unit parameters return; } else { // Note: even if ARB_sampler_objects is not supported, a Sampler overrides samplerParams = sampler.Parameters; } } // Set texture unit parameters TexParameters(texture.TextureTarget, samplerParams); }
private void TexParameters(SamplerParameters samplerParams) { if (samplerParams.MinFilter != _ObjectParams.MinFilter) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureMinFilter, (int)samplerParams.MinFilter); _ObjectParams.MinFilter = samplerParams.MinFilter; } if (samplerParams.MagFilter != _ObjectParams.MagFilter) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureMagFilter, (int)samplerParams.MagFilter); _ObjectParams.MagFilter = samplerParams.MagFilter; } if (samplerParams.WrapCoordR != _ObjectParams.WrapCoordR) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureWrapR, (int)samplerParams.WrapCoordR); _ObjectParams.WrapCoordR = samplerParams.WrapCoordR; } if (samplerParams.WrapCoordS != _ObjectParams.WrapCoordS) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureWrapS, (int)samplerParams.WrapCoordS); _ObjectParams.WrapCoordS = samplerParams.WrapCoordS; } if (samplerParams.WrapCoordT != _ObjectParams.WrapCoordT) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureWrapT, (int)samplerParams.WrapCoordT); _ObjectParams.WrapCoordT = samplerParams.WrapCoordT; } #if !MONODROID if (samplerParams.CompareMode != _ObjectParams.CompareMode) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureCompareMode, samplerParams.CompareMode ? Gl.COMPARE_R_TO_TEXTURE : Gl.NONE); _ObjectParams.CompareMode = samplerParams.CompareMode; } #endif if (samplerParams.CompareFunc != _ObjectParams.CompareFunc) { Gl.SamplerParameter(ObjectName, SamplerParameterName.TextureCompareFunc, (int)samplerParams.CompareFunc); _ObjectParams.CompareFunc = samplerParams.CompareFunc; } }
/// <summary> /// Apply texture unit sampler parameteres, using compatibility methods. /// </summary> /// <param name="textureTarget"> /// The <see cref="TextureTarget"/> that specifies the texture target to apply sampler. /// </param> /// <param name="texParameters"> /// The <see cref="SamplerParameters"/> that specifies the parameters to be applied. /// </param> private void TexParameters(TextureTarget textureTarget, SamplerParameters texParameters) { if (texParameters.MinFilter != _CurrentSamplerParams.MinFilter) { Gl.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)texParameters.MinFilter); _CurrentSamplerParams.MinFilter = texParameters.MinFilter; } if (texParameters.MagFilter != _CurrentSamplerParams.MagFilter) { Gl.TexParameter(textureTarget, TextureParameterName.TextureMagFilter, (int)texParameters.MagFilter); _CurrentSamplerParams.MagFilter = texParameters.MagFilter; } if (texParameters.WrapCoordR != _CurrentSamplerParams.WrapCoordR) { Gl.TexParameter(textureTarget, TextureParameterName.TextureWrapR, (int)texParameters.WrapCoordR); _CurrentSamplerParams.WrapCoordR = texParameters.WrapCoordR; } if (texParameters.WrapCoordS != _CurrentSamplerParams.WrapCoordS) { Gl.TexParameter(textureTarget, TextureParameterName.TextureWrapS, (int)texParameters.WrapCoordS); _CurrentSamplerParams.WrapCoordS = texParameters.WrapCoordS; } if (texParameters.WrapCoordT != _CurrentSamplerParams.WrapCoordT) { Gl.TexParameter(textureTarget, TextureParameterName.TextureWrapT, (int)texParameters.WrapCoordT); _CurrentSamplerParams.WrapCoordT = texParameters.WrapCoordT; } #if !MONODROID if (texParameters.CompareMode != _CurrentSamplerParams.CompareMode) { Gl.TexParameter(textureTarget, TextureParameterName.TextureCompareMode, texParameters.CompareMode ? Gl.COMPARE_R_TO_TEXTURE : Gl.NONE); _CurrentSamplerParams.CompareMode = texParameters.CompareMode; } #endif if (texParameters.CompareFunc != _CurrentSamplerParams.CompareFunc) { Gl.TexParameter(textureTarget, TextureParameterName.TextureCompareFunc, (int)texParameters.CompareFunc); _CurrentSamplerParams.CompareFunc = texParameters.CompareFunc; } }