C #, XNA, Как выбрать фильтр минимизации изображения в режиме 2D? - PullRequest
1 голос
/ 28 апреля 2010

Проблема в том, что я не могу выбрать фильтр минимизации для Texture2D масштабирования. Есть MinFilter

GraphicsDevice.SamplerStates[0].MinFilter

Но это не работает. Когда я пытаюсь назначить какой-то фильтр, он просто меняется на Линейный.

Есть ли способ реализовать мой собственный фильтр или как выбрать один из доступных?

Ответы [ 4 ]

3 голосов
/ 29 апреля 2010

Некоторое время назад я прочитал статью в блоге Шона Харгривза, в которой говорилось, что «SpriteBatch автоматически установит то, что ему нужно для рисования в 2D ...», что включает установку MinFilter на Linear.

Итак, вы можете попробовать то, что говорится в статье , и установить для SpriteSortMode значение Immediate. Затем после вызова SpriteBatch.Begin вы можете установить MinFilter на то, что вам нужно, и он должен сохранить этот параметр при рисовании спрайта.

0 голосов
/ 16 сентября 2013

Лучший способ, который я вижу при использовании spriteBatch (2D-режим), - это использовать одну из более длинных перегрузок spriteBatch.Begin (), в частности, та, которая здесь у меня работает:

spriteBatch.Begin (SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone);

важной частью является SamplerState.PointClamp, который сообщает всем вызовам draw () до следующего spriteBatch.end () использовать выборку точек как для минимальной, так и для максимальной. В SamplerState есть несколько других опций, которые, я уверен, intelisense может описать лучше, чем я.

для справки: http://msdn.microsoft.com/en-us/library/ff433699.aspx

0 голосов
/ 30 апреля 2010

Лучший подход к минимизации - создать mipmaps для текстур, поскольку аппаратное обеспечение и конвейер directx оптимизированы для наилучшего использования mipmaps в зависимости от конечного размера рисунка текстуры.

Вот цитата из MSDN на mipmaps

Самый популярный подход к минимизация заключается в создании мипмапов для каждая текстура. MipMap является предварительно сжатым текстуры, как правило, в два раза меньше оригинал. Сам MipMap затем получает mipmapped, и этот процесс продолжается пока не будет создана текстура 1x1. это является окончательным MIPMAP для текстуры. Вы можете думать о мипмапах как о цепочке, начиная с оригинальной текстуры и становится все меньше и меньше, пока 1 текстурная текстура достигнута. когда минификация необходима, сначала соответствующая миппированная текстура выбран, то этот MIPMAP применяется к объект, с текстурой в реальном времени фильтрация при необходимости. По умолчанию Текстурный процессор для Контента Трубопровод имеет возможность генерировать мипмапы автоматически.

Вы можете включить автоматическую генерацию mipmap , используя конвейер содержимого, или Texture.GenerateMipMaps для генерации mipmaps во время выполнения для рендеринга целевой текстуры.

0 голосов
/ 29 апреля 2010

У меня есть один ответ на мой собственный вопрос, и я думаю, что будет лучше опубликовать новый ответ для удобства чтения.

    private Texture2D Scale(GraphicsDevice gd, Texture2D texture, float scale)
    {

        int sourceWidth = texture.Width;
        int sourceHeight = texture.Height;

        int destWidth = (int)(sourceWidth * scale);
        int destHeight = (int)(sourceHeight * scale);

        //convert texture into bitmap
        byte[] textureData = new byte[4 * sourceWidth * sourceHeight];
        texture.GetData<byte>(textureData);

        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(sourceWidth, sourceHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new System.Drawing.Rectangle(0, 0, sourceWidth, sourceHeight), System.Drawing.Imaging.ImageLockMode.WriteOnly,
                       System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        IntPtr safePtr = bmpData.Scan0;
        System.Runtime.InteropServices.Marshal.Copy(textureData, 0, safePtr, textureData.Length);
        bmp.UnlockBits(bmpData);


        //output bitmap
        System.Drawing.Image outputImage = new System.Drawing.Bitmap(destWidth, destHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(outputImage);
        grPhoto.InterpolationMode = (System.Drawing.Drawing2D.InterpolationMode)(interpolationMode);


        grPhoto.DrawImage((System.Drawing.Image)bmp, new System.Drawing.Rectangle(0, 0, destWidth, destHeight),
            new System.Drawing.Rectangle(0, 0, sourceWidth, sourceHeight), System.Drawing.GraphicsUnit.Pixel);

        grPhoto.Dispose();

        textureData = new byte[4 * sourceWidth * sourceHeight];

        MemoryStream ms = new MemoryStream();
        ((System.Drawing.Bitmap)outputImage).Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        ms.Seek(0, SeekOrigin.Begin);
        Texture2D result = Texture2D.FromFile(gd, ms);
        ms.Dispose();

        return result;
    }

Этот метод работает в течение примерно 20 мс - 100 мс в зависимости от режима интерполяции, может быть, кто-тонайдет это полезным.Есть ли способ оптимизировать его?Мне не нужна 32-битная поддержка, но, похоже, нет возможности установить ее на 24. Я нашел разные алгоритмы определения размера http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx, но они медленные.

Есть ли способ реализовать эти методы с использованием скоростиграфической карты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...