/// <summary> /// Applies the sampler state to the device. /// </summary> /// <param name="sampler">The sampler index on which to set the state.</param> internal void Apply(Int32 sampler) { Contract.EnsureNotDisposed(this, Disposed); if (Ultraviolet.GetGraphics().Capabilities.SupportsIndependentSamplerState) { throw new InvalidOperationException(UltravioletStrings.GenericError); } OpenGLState.ActiveTexture((uint)(gl.GL_TEXTURE0 + sampler)); gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, GetTextureAddressModeGL(AddressU)); gl.ThrowIfError(); gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, GetTextureAddressModeGL(AddressV)); gl.ThrowIfError(); if (MipMapLevelOfDetailBias != 0) { gl.ThrowIfGLES(OpenGLStrings.UnsupportedLODBiasGLES); gl.TexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_LOD_BIAS, MipMapLevelOfDetailBias); gl.ThrowIfError(); } switch (Filter) { case TextureFilter.Point: gl.TexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAX_ANISOTROPY_EXT, 1f); gl.ThrowIfError(); gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, (int)gl.GL_NEAREST); gl.ThrowIfError(); gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, (int)gl.GL_NEAREST); gl.ThrowIfError(); break; case TextureFilter.Linear: if (gl.IsAnisotropicFilteringAvailable) { gl.TexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAX_ANISOTROPY_EXT, 1f); gl.ThrowIfError(); } gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, (int)gl.GL_LINEAR); gl.ThrowIfError(); gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, (int)gl.GL_LINEAR); gl.ThrowIfError(); break; case TextureFilter.Anisotropic: if (gl.IsAnisotropicFilteringAvailable) { gl.TexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAX_ANISOTROPY_EXT, Math.Min(1f, MaxAnisotropy)); gl.ThrowIfError(); } gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, (int)gl.GL_LINEAR); gl.ThrowIfError(); gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, (int)gl.GL_LINEAR); gl.ThrowIfError(); break; default: throw new NotSupportedException(); } }