Есть некий пиксельный шейдер, который берет на вход цвет пикселя из текстуры 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". Может в его сторону стоит копать?
Max Ну имхо размеры окна тут конечно причём, но не совсем. PS выполняется для каждого пикселя объекта отправленного на рендеринг, да и он ещё наверно и клипуется окном. Вижу такое решение: Использовать формат вершин D3DFVF_XYZRHW, и рисовать объект размером в текстуру. А вот чтобы он не клипанулся и размер окна был меньше, тут действительно хз. Хотя точно не знаю на какой стадии происходит клип пикселей по окну, может и после PS.
Попробовал сделал окно 5x5 и RenderTarget 10x10. Пиксельный шейдер просто возвращает константу. Так вот, после рендера весь RenderTarget заполнен этой самой константой. Получается, что PS вызывается для каждого пикселя из RenderTarget, а потом уже делается типа StretchBlt в окно. Так ли это? Просто знающие люди объясняли, что все наоборот - типа окно скейлится на RenderTarget и потом для каждого как бы полученного пикселя вызывается PS. Но в этом случае (для окна 5x5) шейдер должен будет вызваться 25 раз и в RenderTarget должны быть незаполненные дырки. Лишний раз убеждаюсь, что никому нельзя верить
AFAIK никакого скейла по окну не происходит. Происходит масштабирование изображения по вьюпорту. Опять таки PS вызывается для каждого пиксела отображаемого объекта в RenderTarget. Тебе как понимаю действительно нужно рендерить в текстуру размером в DestTex. И использовать либо ортографическую проекцию либо D3DFVF_XYZRHW. И тогда искажений почти не будет.
если я правельно понял когда Max ренедерит в рендертаргет размером 1*100 текстуру 1*10 то соответсвенно пикселов будет в 10 раз больше и соответсвенно рендер вызовится в 10 раз больше тут нет избыточного рендера и наоборот если таргет 1*10 а текстура 1*100 то соответствено пиксел шейдер вызовится 10 раз с пропуском через 10 пикселов а как еще в 10 пикселов затолкнуть 100 пикселов текстуры:-D
Max Вопрос, как сделать так, что бы рендер тупо выполнялся для _каждого_ пикселя исходной тектуры, невзирая на размер окна, для которого создан Device. Можно попробывать рендер таргет оставить 100*1, а стенчел и z буфер поставить 10*1 и по идеии получится как ты хочеш. А полностью аппаратно можно это оганизовать в шейдерах 4.0 но наверняка не знаю.
Дело в том, что рендер таргет задает сколько раз вызвать шейдер Не зависимо от размера текстуры. Если ты хочеш скопировать текстуру 1*100 в обьем 1*10 как ты представляеш это без пропуска? А если надо обработать 1*100 значений и зписать в 1*10 результат то в шейдере делаеш цикл для каждого пикселя 10циклов и вот все 1*100 без пропуска --- Сообщение объединено, 13 ноя 2018 --- Если есть рендертаргет или массив 1*100 пикселей записывать туда текстуру - массив 1*10 пикселей, как тут не обойтись без "избыточных" повторений .
Sashasan, чисто любопытно, это вы за 10 лет смогли понять:?) ну просто тема 2008 года А повторять не нужно, есть специальные алгоритмы ресайза, например гаусса.
нет просто недавно по форуму пробежал --- Сообщение объединено, 13 ноя 2018 --- В связи с выше сказанным - повторять нужно обязательно!