提问人:Joshua Carmody 提问时间:9/16/2008 最后编辑:Joshua Carmody 更新时间:8/7/2015 访问量:12912
用于服务器端 3D 渲染的 API [已关闭]
API for server-side 3D rendering [closed]
问:
我们不允许向读者、工具、软件库等寻求推荐的问题。您可以编辑问题,以便用事实和引文来回答。
5年前关闭。
我正在开发一个应用程序,该应用程序需要在服务器上快速渲染简单的 3D 场景,然后通过 HTTP 将它们作为 JPEG 返回。基本上,我希望能够简单地在 HTML 页面中包含动态 3D 场景,方法是执行以下操作:
<img src="http://www.myserver.com/renderimage?scene=1&x=123&y=123&z=123">
我的问题是关于使用什么技术来进行渲染。在桌面应用程序中,我很自然地会使用 DirectX,但恐怕它不适合为数十甚至数百个用户同时创建图像的服务器端应用程序。有人有这方面的经验吗?是否有适合此应用程序的 3D API(最好是免费提供的)?从头开始编写软件渲染器更好吗?
我对使用 DirectX 或 OpenGL 的主要担忧是它是否能在虚拟化服务器环境中正常运行,以及它是否对典型的服务器硬件有意义(我几乎无法控制)。
答:
我说你最好的办法是在服务器上运行一个 Direct3D/OpenGL 应用(不停止)。让服务器页面向渲染应用程序发送请求,并让渲染应用程序返回 jpg/png/anything。
- 如果 Direct3D/OpenGL 在硬件中渲染场景的速度变慢,那么任何软件解决方案都会更糟
- 通过保持渲染应用程序运行,您可以避免创建/销毁纹理、反向缓冲区、顶点缓冲区等的开销。您可以每秒渲染 100 次的简单场景。
但是,许多服务器没有显卡。Direct3D 在软件中毫无用处(有 Ms 的模拟设备,但它只适合测试效果),从未在软件中尝试过 OpenGL。
与其说是 API,不如说是渲染器;波夫雷?似乎还存在一个http接口...
只有当场景由大量对象组成时,服务器端渲染才有意义,这样将数据集下载到客户端进行客户端渲染的速度太慢,并且渲染预计不会是实时的。如果将 jogl 之类的东西与渐进式场景下载结合使用(即下载前景对象并渲染,然后根据与视点的距离增量下载对象并重新渲染),则客户端渲染不会太困难。
如果你真的想做服务器端渲染,你可能想把 Web 服务器部分和渲染部分分开到两台计算机上,每台计算机都针对他们的任务进行了最佳配置(渲染器有 OpenGL 卡、最小的 HD 和刚好足够的 RAM,服务器有很多快速磁盘、大量的 RAM、备份,没有 OpenGL)。我非常怀疑你是否能够在虚拟化服务器上进行硬件渲染,因为该服务器可能没有GPU。
评论
Yafaray (http://www.yafaray.org/) 可能是一般 3D 渲染的首选。它的速度相当快,结果看起来很棒。它可以在其他软件中使用,例如 Blender 3D 建模器。许可证是LPGL。
如果服务器端软件恰好是用 Python 编写的,并且所需的 3D 场景是科学数据的可视化,请查看 MayaVi2 http://mayavi.sourceforge.net/,如果不是,请浏览 http://www.vrplumber.com/py3d.py
那些建议广泛流行的 POV-Ray 的人需要意识到它不是一个库或任何提供 API 的实体。服务器端进程需要编写一个文本场景文件,执行一个新进程以使用正确的选项运行 POV-Ray,并获取生成的图像文件。如果这很容易为特定应用程序进行设置,并且您在 POV-Ray 方面的专业知识比其他渲染器更多,那么那就去吧!
您还可以查看 Java3D (https://java3d.dev.java.net/),如果您的服务器架构已经是基于 Java 的,这将是一个优雅的解决方案。
如果可以的话,我还建议尝试使用纯软件渲染解决方案 - 尝试处理大量服务器进程,这些进程都对 3D 渲染硬件提出了并发需求,这听起来像是一项艰巨的工作。
心理图像的 RealityServer 旨在精确地执行此处描述的内容。有关更多详细信息,请访问产品页面(包括可下载的开发人员版)。
评论
您可以包装 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 这样的模板语言来插入您自己的相机坐标。
评论
查看 wgpu.net。
我认为这很有帮助。
评论