API для 3D-рендеринга на стороне сервера [закрыт]
-
09-06-2019 - |
Вопрос
Я работаю над приложением, которому необходимо быстро отрисовывать простые 3D-сцены на сервере, а затем возвращать их в формате JPEG через HTTP.По сути, я хочу иметь возможность просто включить динамическую 3D-сцену в HTML-страницу, выполнив что-то вроде:
<img src="http://www.myserver.com/renderimage?scene=1&x=123&y=123&z=123">
Мой вопрос заключается в том, какие технологии использовать для выполнения рендеринга.В настольном приложении я бы, естественно, использовал DirectX, но, боюсь, он может оказаться не идеальным для серверного приложения, которое будет создавать изображения для десятков или даже сотен пользователей в тандеме.Есть ли у кого-нибудь какой-нибудь опыт в этом?Существует ли 3D API (желательно в свободном доступе), который идеально подходил бы для этого приложения?Не лучше ли написать программный рендерер с нуля?
Мои основные опасения по поводу использования DirectX или OpenGL заключаются в том, будут ли они хорошо функционировать в виртуализированной серверной среде и имеет ли это смысл при использовании обычного серверного оборудования (которое я практически не контролирую).
Решение
RealityServer by mental images предназначен для выполнения именно того, что описано здесь.Более подробная информация доступна на странице продукта (включая загружаемую версию для разработчиков).
Другие советы
Я бы сказал, что вам лучше всего запустить приложение Direct3D / OpenGL на сервере (без остановки).Затем заставляем серверную страницу отправить запрос в приложение для рендеринга, и пусть приложение для рендеринга вернет jpg / png / что угодно обратно.
- Если Direct3D / OpenGL будет замедлять рендеринг сцены на аппаратном уровне, то любое программное решение будет хуже
- Поддерживая приложение для рендеринга запущенным, вы избегаете накладных расходов на создание / уничтожение текстур, обратных буферов, вершинных буферов и т.д.Потенциально вы могли бы рендерить простую сцену 100 раз в секунду.
Однако многие серверы не имеют видеокарт.Direct3D практически бесполезен в программном обеспечении (есть эмулируемое устройство от Ms, но оно годится только для тестирования эффектов), никогда не пробовал OpenGL в программном обеспечении.
Вы могли бы обернуть Pov-ray (здесь используя POSIX и сборку Windows).Пример PHP:
<?php
chdir("/tmp");
@unlink("demo.png");
system("~janus/.wine/drive_c/POV-Ray-v3.7-RC6/bin/pvengine-sse2.exe /render demo.pov /exit");
header("Content-type: image/png");
fpassthru($f = fopen("demo.png","r"));
fclose($f);
?>
demo.pov
Доступно здесь.
Вы могли бы использовать язык шаблонов, такой как Jinja2, чтобы вставить свои собственные координаты камеры.
Вы также могли бы посмотреть на Java3D (https://java3d.dev.java.net/), что было бы элегантным решением, если бы архитектура вашего сервера уже была основана на Java.
Я бы также порекомендовал попробовать обойтись программным решением для рендеринга, если это возможно - пытаться управлять множеством серверных процессов, которые одновременно предъявляют требования к оборудованию для 3D-рендеринга, звучит как большая работа.
Яфарай (http://www.yafaray.org/) может быть хорошим первым выбором для общего 3D-рендеринга.Это достаточно быстро, и результаты выглядят великолепно.Он может быть использован в рамках другого программного обеспечения, например3D-моделист Blender.Лицензия называется LPGL.
Если серверное программное обеспечение написано на Python, а желаемая 3D-сцена представляет собой визуализацию научных данных, загляните в MayaVi2 http://mayavi.sourceforge.net/, или, если нет, перейдите для просмотра по адресу http://www.vrplumber.com/py3d.py
Те, кто предлагает широко популярный POV-Ray, должны понимать, что это не библиотека или какая-либо другая организация, предлагающая API.Серверному процессу потребуется записать текстовый файл сцены, выполнить новый процесс для запуска POV-Ray с нужными параметрами и получить результирующий файл изображения.Если это легко настроить для конкретного приложения, и если у вас больше опыта работы с POV-Ray, чем с другими средствами визуализации, что ж, дерзайте!
Рендеринг на стороне сервера имеет смысл только в том случае, если сцена состоит из огромного количества объектов, так что загрузка набора данных клиенту для рендеринга клиента была бы слишком медленной, и ожидается, что рендеринг не будет осуществляться в реальном времени.Рендеринг на стороне клиента не слишком сложен, если вы используете что-то вроде бег трусцой в сочетании с прогрессивной загрузкой сцены (т.е.загружайте объекты переднего плана и выполняйте рендеринг, затем постепенно загружайте объекты в зависимости от расстояния от точки обзора и выполняйте повторный рендеринг).
Если вы действительно хотите выполнять рендеринг на стороне сервера, вы можете разделить часть веб-сервера и часть рендеринга на два компьютера, каждый из которых оптимально настроен для своей задачи (у рендерера есть карта OpenGL, минимальный HD и ровно столько оперативной памяти, на сервере много быстрых дисков, много оперативной памяти, резервных копий и нет OpenGL).Я очень сомневаюсь, что вы сможете выполнять аппаратный рендеринг на виртуализированном сервере, поскольку на сервере, вероятно, нет графического процессора.
Проверьте wgpu.net.
Я думаю, это очень полезно.