Рендер на PS для текстур разного размера

Тема в разделе "WASM.DirectX", создана пользователем Max, 17 фев 2008.

  1. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    Есть некий пиксельный шейдер, который берет на вход цвет пикселя из текстуры 1xN и выдает в выходную текстуру тот же цвет (размер RenderTarget также составляет 1xN), то есть по сути должен выполнять копирование одной текстуры в другую.
    Рендер выполняется для текстур _разного_ размера, т.е. один кадр для для текстуры скажем 1x10, другой для 1x100 (размер RenderTarget аналогичный).

    Как известно, в IDirect3D9.CreateDevice() передается HWND.
    Насколько я понимаю, если я создам окно размером 1x10 и дам на вход текстуру 1x100, то пиксельный шейдер будет вызван для рендеринга пикселей (из исходной текстуры) с номерами 1, 10, 20,..., 100 (все фильтрации выключены!), то есть имеет место быть пропуск пикселей исходной текстуры.
    Наоборот, если я создам окно 1x100 и дам на вход текстуру 1x10, то пиксельный шейдер будет вызван 10 раз с входными текстурными координатами 1x1, 10 раз с координатами 1x2 и т.д., то есть имеет место быть избыточный рендер одних и тех-же пикселей входной текстуры.

    Вопрос, как сделать так, что бы рендер тупо выполнялся для _каждого_ пикселя исходной тектуры, невзирая на размер окна, для которого создан Device.
    В SDK прочитал про ID3DXRenderToSurface, который "...can be used in a variety of ways including render targets, off-screen rendering, or rendering to textures". Может в его сторону стоит копать?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.862
    Max
    Ну имхо размеры окна тут конечно причём, но не совсем. PS выполняется для каждого пикселя объекта отправленного на рендеринг, да и он ещё наверно и клипуется окном.
    Вижу такое решение: Использовать формат вершин D3DFVF_XYZRHW, и рисовать объект размером в текстуру. А вот чтобы он не клипанулся и размер окна был меньше, тут действительно хз. Хотя точно не знаю на какой стадии происходит клип пикселей по окну, может и после PS.
     
  3. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    Попробовал сделал окно 5x5 и RenderTarget 10x10.
    Пиксельный шейдер просто возвращает константу.

    Так вот, после рендера весь RenderTarget заполнен этой самой константой.
    Получается, что PS вызывается для каждого пикселя из RenderTarget, а потом уже делается типа StretchBlt в окно.
    Так ли это?

    Просто знающие люди объясняли, что все наоборот - типа окно скейлится на RenderTarget и потом для каждого как бы полученного пикселя вызывается PS.
    Но в этом случае (для окна 5x5) шейдер должен будет вызваться 25 раз и в RenderTarget должны быть незаполненные дырки.
    Лишний раз убеждаюсь, что никому нельзя верить :D
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.862
    AFAIK никакого скейла по окну не происходит. Происходит масштабирование изображения по вьюпорту. Опять таки PS вызывается для каждого пиксела отображаемого объекта в RenderTarget. Тебе как понимаю действительно нужно рендерить в текстуру размером в DestTex. И использовать либо ортографическую проекцию либо D3DFVF_XYZRHW. И тогда искажений почти не будет.
     
  5. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    16
    если я правельно понял когда Max ренедерит в рендертаргет размером 1*100 текстуру 1*10 то соответсвенно пикселов будет в 10 раз больше и соответсвенно рендер вызовится в 10 раз больше тут нет избыточного рендера:-)

    и наоборот если таргет 1*10 а текстура 1*100 то соответствено пиксел шейдер вызовится 10 раз с пропуском через 10 пикселов а как еще в 10 пикселов затолкнуть 100 пикселов текстуры:-D
     
  6. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    16
    Max
    Вопрос, как сделать так, что бы рендер тупо выполнялся для _каждого_ пикселя исходной тектуры, невзирая на размер окна, для которого создан Device.

    Можно попробывать рендер таргет оставить 100*1, а стенчел и z буфер поставить 10*1 и по идеии получится как ты хочеш.
    А полностью аппаратно можно это оганизовать в шейдерах 4.0 но наверняка не знаю.
     
  7. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    16
    Дело в том, что рендер таргет задает сколько раз вызвать шейдер
    Не зависимо от размера текстуры.

    Если ты хочеш скопировать текстуру 1*100 в обьем 1*10 как ты представляеш это без пропуска?
    А если надо обработать 1*100 значений и зписать в 1*10 результат то в шейдере делаеш цикл для каждого пикселя 10циклов и вот все 1*100 без пропуска
    --- Сообщение объединено, 13 ноя 2018 ---
    Если есть рендертаргет или массив 1*100 пикселей записывать туда текстуру - массив 1*10 пикселей, как тут не обойтись без "избыточных" повторений :acute:.
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.058
    Адрес:
    Russia
    Sashasan,
    чисто любопытно, это вы за 10 лет смогли понять:?) ну просто тема 2008 года

    А повторять не нужно, есть специальные алгоритмы ресайза, например гаусса.
     
  9. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    16
    нет просто недавно по форуму пробежал :derisive:
    --- Сообщение объединено, 13 ноя 2018 ---
    В связи с выше сказанным - повторять нужно обязательно!:dirol: