Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        /// <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;
            }
        }