Как сделать рендер без текстур

Добавил пользователь Валентин П.
Обновлено: 05.10.2024

Я нашел несколько мест, где об этом спрашивали, но пока не нашел хорошего ответа.

Проблема: я хочу визуализировать в текстуру, а затем я хочу нарисовать эту визуализированную текстуру на экране одинаково как бы это выглядело, если бы я пропустил шаг рендеринга к текстуре и просто рендерил прямо на экран. В настоящее время я использую режим смешивания glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). У меня есть glBlendFuncSeparate, чтобы поиграть также.

Пока что ради этого вопроса предположим, что мы не используем изображения, вместо этого я просто использую полноцветные квадраты с альфа-каналом.

Как только я рендерил свою сцену в текстуру, мне нужно рендерить эту текстуру в другую сцену, и мне снова нужно СЛИВАТЬ текстуру, предполагая частичную прозрачность. Здесь вещи разваливаются. В предыдущих шагах наложения я четко изменял значения RGB на основе альфа-канала, повторяя его, все в порядке, если альфа-значение равно 0 или 1, но если оно находится между ними, результатом является дальнейшее затемнение этих частично полупрозрачных пикселей.

Играя с режимами смешивания, мне очень мало повезло. Лучшее, что я могу сделать, это рендерить текстуру с помощью:

glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);

Я обнаружил, что рендеринг несколько раз с помощью glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) будет приближаться к правильному цвету (если вещи не перекрываются). Но это не совсем идеально (как вы можете видеть на следующем изображении, участки, где зеленые / красные / синие прямоугольники перекрываются, становятся темнее или накапливают альфа. (РЕДАКТИРОВАТЬ: если я выполняю многократное рисование на рендере на часть экрана и только При рендеринге один раз в текстуру проблема накопления альфа исчезает и это работает, но почему ?! Я не хочу, чтобы одна и та же текстура сотня раз появлялась на экране, чтобы заставить ее накапливаться правильно)

введите описание изображения здесь

Вот некоторые изображения, детализирующие проблему (несколько проходов рендеринга с базовым смешиванием (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), и они визуализируются несколько раз на этапе рендеринга текстуры. 3 поля справа отображаются на 100% красным, зеленым или синим цветом (0-255), но при альфа-значениях 50% для синего, 25% для красного и 75% для зеленого:

Итак, разбивка того, что я хочу знать:

  1. Я установил режим смешивания на: Икс?
  2. Я отрисовываю свою сцену в текстуру. (Может быть, я должен сделать несколько режимов смешивания или несколько раз?)
  3. Я установил режим смешивания на: Y?
  4. Я рендерил свою текстуру на экран поверх существующей сцены. (Может быть, мне нужен другой шейдер? Может быть, мне нужно визуализировать текстуру несколько раз?)

Желаемое поведение заключается в том, что в конце этого шага конечный результат в пикселях будет таким же, как если бы я просто сделал это:

  1. Я установил режим смешивания на: (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
  2. Я отрисовываю свою сцену на экране.

И, для полноты, вот мой код с моей первоначальной наивной попыткой (просто регулярное смешивание):

Вот код, который я использую для настройки сцены:

И код для рендеринга сцены:

И вот мой скриншот:

* РЕДАКТИРОВАТЬ: НАСТРОЙКА КАДРА / КАРТА ТЕАРДОНА:

И мой четкий код экрана:

Решение

Основываясь на некоторых вычислениях и симуляциях, которые я провел, я нашел два довольно похожих решения, которые, кажется, делают свое дело. Один использует предварительно умноженные цвета в сочетании с одной (отдельной) функцией смешивания, другой работает без предварительно умноженных цветов, но требует изменения функции смешивания пару раз в процессе.

Вариант 1: одна функция смешивания, предварительное умножение

Этот подход работает с единственной функцией смешивания на протяжении всего процесса. Функция смешивания:

Это требует предварительно умноженных цветов, что означает, что если ваш входной цвет будет обычно (r, g, b, a) , ты используешь (r * a, g * a, b * a, a) вместо. Вы можете выполнить предварительное умножение в фрагментном шейдере.

  1. Установите функцию смешивания на (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE) ,
  2. Установите цель рендеринга на FBO.
  3. Визуализируйте слои, которые вы хотите визуализировать в FBO, используя предварительно умноженные цвета.
  4. Установите цель рендеринга в кадровый буфер по умолчанию.
  5. Рендеринг слоев, которые вы хотите ниже содержимого FBO, используя предварительно умноженные цвета.
  6. Визуализировать приложение FBO, без применение предварительного умножения, так как цвета в FBO уже предварительно умножены.
  7. Отрисовывайте нужные слои поверх содержимого FBO, используя предварительно умноженные цвета.

Вариант 2. Переключение функций смешивания без предварительного умножения

Этот подход не требует предварительного умножения цветов для любого шага. Недостатком является то, что функция смешивания должна быть переключена несколько раз во время процесса.

  1. Установите функцию смешивания на (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE) ,
  2. Установите цель рендеринга на FBO.
  3. Рендеринг слоев, которые вы хотите визуализировать в FBO.
  4. Установите цель рендеринга в кадровый буфер по умолчанию.
  5. (необязательно) Установите функцию смешивания на (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ,
  6. Рендеринг слоев, которые вы хотите ниже содержимого FBO.
  7. Установите функцию смешивания на (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) ,
  8. Рендер FBO вложения.
  9. Установите функцию смешивания на (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ,
  10. Рендеринг слоев, которые вы хотите поверх содержимого FBO.

Объяснение и доказательство

Я думаю, что Вариант 1 лучше и, возможно, более эффективен, потому что он не требует переключения функций наложения во время рендеринга. Таким образом, подробное объяснение ниже для Варианта 1. Математика для Варианта 2 почти такая же. Единственная реальная разница в том, что Вариант 2 использует GL_SOURCE_ALPHA для первого члена функции наложения, чтобы выполнить предварительное умножение, где это необходимо, где Вариант 1 ожидает, что предварительно умноженные цвета войдут в функцию наложения.

Чтобы проиллюстрировать, что это работает, давайте рассмотрим пример, где визуализируются 3 слоя. Я сделаю все расчеты для r а также a компоненты. Расчеты для g а также b будет эквивалентно тем для r , Мы будем рендерить три слоя в следующем порядке:

Для эталонного расчета мы смешаем эти 3 слоя со стандартным GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA смешанная функция. Нам не нужно отслеживать полученную альфа здесь, так как DST_ALPHA не используется в функции смешивания, и мы еще не используем предварительно умноженные цвета:

Таким образом, последний срок является нашей целью для конечного результата. Теперь мы рендерим слои 2 и 3 в FBO. Позже мы будем рендерить слой 1 в буфер кадра, а затем смешивать FBO поверх него. Цель состоит в том, чтобы получить тот же результат.

С этого момента мы будем применять функцию смешивания, указанную в начале, и использовать предварительно умноженные цвета. Нам также нужно будет рассчитать альфы, так как DST_ALPHA используется в функции смешивания. Сначала мы рендерим слои 2 и 3 в FBO:

Теперь мы визуализируем первичный кадровый буфер. Так как мы не заботимся о получающейся альфе, я вычислю только r компонент снова:

Сравните последний член с контрольным значением, которое мы вычислили выше для стандартного случая смешивания, и вы можете сказать, что он точно такой же.

Этот ответ на похожий вопрос имеет более GL_ONE_MINUS_DST_ALPHA, GL_ONE часть функции смешивания: OpenGL ReadPixels (Скриншот) Альфа .

Другие решения

Я достиг своей цели. Теперь позвольте мне поделиться этой информацией с Интернетом, поскольку она существует нигде еще что я мог найти.

введите описание изображения здесь

  1. Создайте свой фрейм-буфер (вслепую и т. Д.)
  2. Очистить кадровый буфер до 0, 0, 0, 0
  3. Установите ваш видовой экран правильно. Это все основные вещи, которые я принял как должное в вопросе, но хочу включить сюда.
  4. Теперь визуализируйте вашу сцену в буфер кадров с помощью glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Убедитесь, что сцена отсортирована (как обычно).
  5. Теперь свяжите включенный фрагментный шейдер. Это устранит ущерб, нанесенный значениям цвета изображения через функцию наложения.
  6. Визуализируйте текстуру на экране с помощью glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
  7. Вернитесь к обычному рендерингу с обычным шейдером.

Почему я делаю textureColor / = sqrt (textureColor.a)? Потому что оригинальный цвет изображен так:

resultR = r * a, resultG = g * a, resultB = b * a, resultA = a * a

результат A = a * a

Если a .25 при первоначальном рендеринге мы имеем:

результат A = .25 * .25

результат A = 0,0625

textureColor / = SQRT (textureColor.a);

И это все исправляет, отменяя смешение!

* РЕДАКТИРОВАТЬ: Ну … Вроде как. Там является неточность ловкости, в этом случае я могу показать это, отображая более чистый цвет, который не идентичен чистому цвету кадрового буфера. Некоторая альфа-информация, похоже, потеряна, вероятно, в каналах RGB. Это еще достаточно хорошо для меня, но я хотел посмотреть на скриншот, показывающий неточность перед выходом из системы. Если у кого-то есть решение, пожалуйста, предоставьте его!

Я открыл щедрость, чтобы довести этот ответ до канонического 100% правильного решения. Прямо сейчас, если я визуализирую более частично прозрачные объекты поверх существующей прозрачности, прозрачность накапливается иначе, чем справа, что приводит к осветлению окончательной текстуры за пределами того, что показано справа. Аналогично, при визуализации на не черном фоне ясно, что результаты существующего решения отличаются немного как показано выше.

Правильное решение будет идентичным во всех случаях. Мое существующее решение не может учитывать смешивание назначения при коррекции шейдера, только альфа-источник.

введите описание изображения здесь

Для того, чтобы сделать это за один проход, вам нужна поддержка для отдельного цвета & альфа-смешивание функций. Сначала вы визуализируете текстуру, в которой вклад переднего плана хранится в альфа-канале (т.е. 1 = полностью непрозрачный, 0 = полностью прозрачный) и предварительно умноженное значение исходного цвета в цветовом канале RGB. Для создания этой текстуры выполните следующие операции:

  1. очистить текстуру до RGBA = [0, 0, 0, 0]
  2. установить смешивание цветового канала на src_color * src_alpha + dst_color * (1-src_alpha)
  3. установите смешивание альфа-канала на src_alpha * (1-dst_alpha) + dst_alpha
  4. визуализировать сцену в текстуру

Чтобы установить режим, указанный в 2) и 3), вы можете сделать: glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE) а также glBlendEquation(GL_FUNC_ADD)

Затем визуализируйте эту текстуру на сцене, установив смешивание цветов на:
src_color + dst_color * (1-src_alpha), т.е. glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) а также glBlendEquation(GL_FUNC_ADD)

Ваша проблема старше, чем OpenGL, или персональные компьютеры, или вообще любого живого человека. Вы пытаетесь смешать два изображения вместе, чтобы они выглядели так, как будто они не были смешаны вообще. Печатные машины сталкиваются с этой проблемой. Когда чернила наносятся на бумагу, получается сочетание цвета чернил и цвета бумаги.

Решение на бумаге такое же, как и в OpenGL. Вы должны изменить исходное изображение, чтобы контролировать свой конечный результат. Это достаточно легко понять, если вы изучите математику, использованную для смешивания.

Для каждого из R, G, B результирующий цвет (old * (1-opacity)) + (new * opacity) , Основной сценарий, который вы хотели бы эмулировать, — это рисование цвета непосредственно в конечном обратном буфере с непрозрачностью A.

Например, непрозрачность составляет 50%, а ваш зеленый канал имеет 0xFF , Результат должен быть 0x7F на черном фоне (включая неизбежную ошибку округления). Вы, вероятно, не можете предположить, что фон черный, поэтому ожидайте, что зеленый канал будет меняться между 0x7F а также 0xFF ,

пожалуйста советоваться эти Ресурсы для лучшего понимания. Я и большинство других знакомы с этой техникой в ​​DirectX, поэтому вам, возможно, придется искать соответствующие флаги OGL.

nr_pushkin2_948

Это все одна большая сцена, из фотошопа только цветокоррекция.

nr_pushkin7_952


Фрагмент рендера.

Нет, железо у нас самое обычное. Но мы работаем на основе двух важных принципов:

Мы не прорабатываем то, чего не будет видно.

Подход к организации работы над проектом. Мы заранее учитываем возможность работы со сложными сценами.

После прочтения этой статьи, вам может показаться, что эти правила только замедляют работу. Но это обманчивое предположение. Эти принципы быстро входят в привычку, нужно только постоянно им следовать. В итоге вы сможете работать со сценой любого объема в сжатые сроки.

Конфигурация железа.

Начнем с типовой конфигурации компьютеров, на которых собираются наши проекты.


  • Процессор Intell i7 3770k
  • 32 GB Ram (память сейчас недорогая, не экономьте на ней)
  • SSD жесткий диск
  • Видеокарта GTX 650 2 ГБ
  • x64 Windows, позволяет обойти ограничение в 3Gb памяти.

Как видите, компьютеры мощные, но ничего особенного (актуально в начале 2015г.)

Секрет успеха кроется в организации сцены и правилах работы. Пройдемся по главным моментам:

Поликаунт.

nr_polycount_946

Количество полигонов, из которых собирается основная сцена, редко превышает показатель в 16 миллионов. Главное правило — количество полигонов должно быть оправданным. Мы не моделируем мелкие детали, не снимаем фаски на объектах, которые будут показаны издалека. В среднем, на один многоэтажный дом мы закладываем не более 200 тыс. полигонов.

nr_faces_942

VrayProxy.

объект будет активно копироваться в сцене

объект имеет в себе слишком много полигонов

Это очень важно, особенно это касается деревьев, кустов и автомобилей, так как в них больше всего полигонов и чаще всего мы активно копируем их в сцене.

nr_bounding_box_0937

Копирование объектов.

MultiScatter.

Общий совет: по максимуму используйте готовое.

nr_controllers2_939

File > References > Xref scene

собирать сцену из нескольких частей

каждый сотрудник сможет работать над своей частью сцены, независимо от коллег

nr_folders_943

nr_xref1_964

nr_xref_off_963

nr_pushkin3_949


Один из ракурсов проекта

Для удобства и оптимизации работы мы активно используем слои. Они позволяют временно отключить группу объектов, которая в данный момент не нужна.

nr_Layers_944

Всегда отключайте слои, с которыми вы в данный момент не работаете.

Текстуры

Мы используем только текстуры в формате JPEG. Мы не рекомендуем использовать текстуры в формате TIFF и PNG, так как они занимают много памяти и сильно снижают общую производительность.

Материалы

Оптимизация вьюпорта

Оптимизированный вьюпорт — залог быстрой и эффективной работы.

Для удобства работы с большими сценами во вьюпорте, мы используем следующие правила:

Отключаем отображение текстур, если в данный момент не требуется работать с UVW Map. Все текстуры можно отключить во вкладке Display > Shaded: object Color.

nr_shaded_961

Отключаем отображение всех Xref, с которыми мы в данный момент не работаем.

nr_display_as_box_941

nr_controllers2_939

nr_multiscatter_box_945

nr_degradation_940

Рендер. Превью.

Подготовка сцены к рендеру.

Совет: при импорте или мердже модели из библиотек в рабочую сцену, проверяйте и оптимизируйте ее в отдельной чистой сцене. Это позволит исключить проблемные материалы, потерянные текстуры и прочие неприятности.

2. Сцена не должна содержать кириллицу или любой другой язык в названиях объектов, материалов, названии сцены и т. д. Только латинские символы. Сетевой рендер не поддерживает кириллицу, это приведет к ошибкам при сетевом рендеринге.

3. Сцена не должна содержать стандартные и Raytrace материалы. Это приводит к зависаниям сцены, вылетам или пятнам.

nr_vrat_convert_962

Мы используем рендеринг по сети, поэтому все рабочие файлы должны быть на сервере. Мы не храним файлы на локальном компьютере, т. к. в этом случае на рендере появятся места без текстур или потерянные прокси.

Типовые настройки рендера выглядят так:

render_settings_4

Vray Global switches:

Reflection/refraction max depth: 3 — этого параметра хватает для большинства сцен. Не рендерятся лишние переотражения. При необходимости, можно увеличить.

Vray: System

Default geometry: Static

Dynamic memory limit: 30000Mb

Это значительно ускоряет рендер.

Надеюсь мои советы помогут вам работать с очень большими проектами.
Проект рендерила и собирала наш ведущий визуализатор Анна Литовец.

С удовольствием представляю вам новый урок Сергея Романова. Тема урока: Vray – рендер на фоне изображения. Передаю слово Сергею.

Сергей Романов

В прошлом уроке я вам показывал, как отрендерить чайник с тенью на прозрачном фоне. В начале урока чайник был на фоне уходящей в даль дороги.

В этом уроке я покажу, как отрендерить чайник на фоне изображения-бэкграунда. В качестве бэкграунда я буду использовать всё ту же дорогу.

Открываем файл с чайником:

Vray - рендер на фоне изображения

Открываем MaterialEditor, выбираем свободный слот и жмем кнопку GetMaterials.

В открывшемся Material/MapBrowserоткрываем Maps/Standartи выбираем там Bitmap(то есть растровое изображение).

Выбираем Bitmap


В открывшемся окне браузера выбираем нашу фотографию Бэкграунда. (просто скачайте это изображение):

Бэкграунд


Теперь внесем некоторые изменения:

Вместо Texture ставим Environ (то есть среда), а в поле Mapping, ставим Screen (то есть экранный).

Настройки бэкграунда


Далее заходим в Environment and Exposure Settings (Rendering/Environment and Exposure Settings) или просто нажимаем на клавиатуре цифру 8. И перетаскиваем по методу Drag&Drop получившуюся у нас карту среды в поле Environment Map, ставим Instanсe.

Environment Map


Далее закрываем окно Material Editor и окно Environment and Exposure Settings.

И заходим в настройки Вьюпорта.

Открывается у вас вот такое окно конфигурации вьюпорта:

окно конфигурации вьюпорта


И там нам нужна вкладка Background (то есть задний фон).

Фоном по умолчанию стоит градиентный цвет. Меняем его на фон окружения Use Enviroment Background (использовать фон окружения).

Use Enviroment Background


Жмем кнопку ОК. Фоном вьюпорта у нас становится та самая картинка, которую мы выбрали в самом начале урока.

Но вот незадачка: наш плейн для отбрасывания тени (про это можно почитать в моём прошлом уроке) перекрывает нам видимость фона.

Теряется видимость фона


А нам же надо позиционировать наш чайник (точнее сказать нашу сцену) относительно фона, который мы не видим из-за плейна.

Есть несколько решений данной проблемы.

Решение 1: Можно зайти в палитру слоев и отключить видимость данного фона:

отключаем видимость фона


Но, как показывает практика, способ этот не самый удачный, т.к. в последний момент, когда вы уже отрендрили сцену, а рендриться она может оооооочень долго (нашу сценку я в расчет не беру), вы можете понять что забыли включить данный плейн и ваши тени отключились вместе с ним.

Соответственно предлагаю ВАРИАНТ 2: При выделенном нашем плейне заходим во вкладку Display и в меню Display Properties ставим галку в чекбокс, напротив пункта See-Trough, то есть Смотреть насквозь (или жмем сочетание клавиш Alt+X)

See-Trough


На выходе получаем неотключенный, но прозрачный плейн:

прозрачный плейн


Далее дело техники! Подгоняем нашу сцену под фоновое изображение: уменьшаем, увеличиваем, крутим! Изображение наше статично стоит на бэкграунде, так что подгонять можем только нашу сцену.

У меня получилось нечто вот такое:

Результат


Далее все просто: Рендрим, как говориться, и получаем результат:

Финальный рендер


К слову говоря, при таком методе рендера Альфа-канал наш сохраняется без фонового изображения (как если бы мы натянули наш фон на какую-нибудь фигуру и рендерили на реальном плейне, скажем, загнутом кверху с натянутой картинкой!

Альфа


Теперь вы можете работать с чайником (вырезАть, делать цветокоррекцию) независимо от фона:

работа с чайником независимо от фона


За сим разрешите откланяться и до новых встреч!

Хочу поблагодарить Сергея за его простые и понятные уроки. Надеюсь, вам они тоже нравятся.

Главная › Форумы › Общие темы › Не видно текстуры при рендере.

  • В этой теме 2 ответа, 2 участника, последнее обновление 3 года, 11 месяцев назад сделано evilcat .

Здравствуйте! У меня такая проблема- загружаю в блендер текстурированный объект, во вкладке текстуры они есть, а при рендере отображается только чёрный силуэт. Я в одной из вкладок объекта выбрал объект- текстурированный, но при рендере его все равно виден лишь силуэт.Объясните пожалуйста почему и куда нужно залезть и что покрутить чтобы текстуры тоже отображались при рендере. Буду очень благодарен всем кто поможет.

все зависит от того, что ты загружаешь в блендер.
Но судя по описанию, тебе надо после импорта текстуру и объект еще связать между собой текстурными координатами (в материале объекта)

На данный момент все материалы в 3d Hamster в формате 3ds max и настроены для использования в Corona render. Для использования V-Ray, F-Strom или другого рендера Вы можете воспользоваться конвертерами. Однако, для конвертации вам понадобится установленный Corona render.

Для того чтобы перенести материал в 3ds max сначала вам нужно его скачать. Для этого наведите мышь на материал и нажмите на кнопку скачать (скачивать материал нужно только один раз). После скачивания перетащите материал в окно 3ds max. Материал нужно переносить на тот объект, на который Вы хотите его назначить.

Также Вы можете назначить материал сразу на все выбранные объекты или в редактор материалов. Для этого зажмите на клавиатуре Ctrl при переносе у вас появится меню, где Вы сможете выбрать нужный вариант:


Где хранятся текстуры и как их не потерять

Все пути к текстурам материала назначаются автоматически при переносе в 3ds max. Все текстуры хранятся в папке библиотеки 3d hamster, путь к этой папке Вы указали при первом запуске программы.

Рекомендуется периодически собирать все используемые текстуры в вашей сцене с помощью Collect Asset или архивации, чтобы гарантировано сохранить все текстуры сцены. Инструкция по сбору.

Что такое маппинг и какой он бывает

Маппинг — отвечает за наложение текстур, за их положение на объекте и их масштаб, важно знать, что существует несколько типов маппинга и каждый их них хорош в определенной ситуации. Мы постарались применить для каждого материала оптимальный тип маппинга. Тип материала видн здесь:




Данным типом пользуются чаще всего, Вы часто встретите его на чужих моделях. Однако, он требует максимум настроек и в 3D Hamster такие материалы в меньшинстве. В классическом режиме масштаб, положение и поворот текстуры на объекте будет полностью зависеть от имеющихся текстурных координат объекта. Их можно задать модификатор UVW Map. Если Вы используете готовую модель, то, возможно, на ней уже заранее настроены текстурные координаты.

Как пользоваться: Назначьте материал на объект. При необходимости отрегулируйте положение текстуры модификатором UVW Map. Выберите режим Box в модификаторе UVW Map – он подходит для большинства ситуаций.

Важно: когда Вы используете классический маппинг, галочку Real-World Map Size в модификаторе или свойствах примитива нужно выключить ! Иначе текстура будет отображаться некорректно.

Читайте также: