1. ANARI为什么我们需要一个新的3D渲染API标准如果你在过去十年里开发过任何需要3D图形显示的应用程序——无论是用于分子动力学模拟的科学可视化工具还是用于流体力学分析的工程软件甚至是用于医学影像处理的系统——你大概率都曾与OpenGL、DirectX或者更近一些的Vulkan打过交道。这些底层图形API给了我们无与伦比的灵活性和控制力让我们能榨干每一分硬件性能。但硬币的另一面是为了渲染一个简单的场景我们需要管理着色器管线、分配命令缓冲区、同步内存访问、处理多线程渲染……代码量动辄成千上万行而且一旦硬件架构或驱动模型发生变化维护和升级的成本高得吓人。更具体地说在科学可视化领域我们面临的挑战尤为独特。我们的“场景”可能包含数亿个原子、数万亿个体素或者复杂到令人发指的有限元网格。用户不仅要求实时交互还要求渲染结果具备物理准确性——比如光线在生物组织中的散射、材料表面的次表面散射效果这些对于医学影像或材料科学至关重要。传统的、基于光栅化的实时渲染管线Rasterization Pipeline为了追求速度做了大量近似和简化难以满足这种对物理真实性的高要求。而能提供物理精确渲染的路径追踪Path Tracing技术又因其巨大的计算开销长期被视为“离线渲染”的专属与交互式应用无缘。这就是ANARIAnalytic Rendering Interface诞生的背景。它不是另一个试图取代Vulkan或DirectX的底层API而是一个更高层次的抽象层。你可以把它想象成图形学领域的“JDBC”或“ODBC”。ANARI定义了一套标准的、与具体渲染引擎无关的接口。作为应用开发者你只需要用ANARI的API来描述你的场景有哪些几何体、用什么材质、光源在哪里、相机怎么摆然后告诉ANARI“渲染吧”。至于这个场景最终是通过CPU上的OSPRay进行路径追踪还是通过GPU上的NVIDIA OptiX进行硬件加速光线追踪亦或是通过某个尚未问世的全新渲染器来绘制ANARI帮你搞定。你的应用代码无需为每一种后端重写。这种设计直接击中了科学可视化应用的痛点解耦。应用开发者可以专注于领域核心逻辑——数据加载、分析算法、用户交互——而将复杂的、日新月异的渲染技术实现交给专业的渲染引擎团队。当新的GPU硬件带来了实时光线追踪加速核心RT Core或者新的降噪算法将路径追踪的收敛速度提升了一个数量级时你的应用只需要更新一下ANARI的后端库就能立即享受到这些技术进步带来的红利而无需重写一行渲染代码。2. ANARI的核心设计哲学与架构定位2.1 高层抽象描述“是什么”而非“怎么做”ANARI最根本的设计哲学是声明式Declarative而非命令式Imperative。底层API如Vulkan是命令式的你需要精确地发出一系列指令“创建缓冲区”、“绑定管线”、“提交绘制命令”告诉GPU每一步具体做什么。ANARI则是声明式的你创建一个“球体”对象设置它的半径和中心位置创建一个“漫反射材质”对象设置它的颜色然后将材质赋予球体最后将球体添加到“世界”中。你声明了场景的构成和状态至于这个球体是用三角形网格拟合还是用光线-球体求交公式来渲染是ANARI后端实现的事情。这种抽象层级带来了几个关键优势代码简洁实现相同视觉效果的代码量通常比直接使用底层API少一个数量级。后端无感同一份应用代码可以在运行时动态切换不同的渲染后端从CPU路径追踪切换到GPU硬件光追通常只需更改一个加载库的名称。关注点分离科学家和领域专家可以更专注于如何表达数据而不是如何绘制数据。2.2 在生态系统中的位置理解ANARI必须把它放在整个图形软件栈里来看。下图清晰地展示了它的定位[你的可视化应用 (如ParaView, VMD, VisIt)] | | 调用ANARI API v [ANARI API 层 (标准化接口)] | | 由具体后端实现 v [各种渲染后端实现 (如OSPRay, VisRTX, 未来其他引擎)] | | 可能调用底层API v [底层图形API (如Vulkan, DirectX 12, Metal) 或专用API (如OptiX)] | v [GPU/CPU硬件]ANARI填补了高层可视化应用与底层图形硬件/API之间一个关键的空白。它不像OpenGL那样试图成为硬件抽象层也不像Unity或Unreal Engine那样是一个完整的、包含资源管理、物理模拟的“游戏引擎”。它是一个轻量级的、专门为可视化渲染设计的桥梁。2.3 面向对象的C99 API设计ANARI的API设计遵循了Khronos组织的一贯风格如OpenGL、Vulkan采用纯C99语言定义。选择C语言并非因为其现代而是出于最广泛的兼容性和易绑定性考虑。C API可以轻松地被C、Python、Java、Julia等几乎所有主流科学计算语言调用极大降低了生态构建的门槛。其核心是面向对象的设计模型尽管是用C语言实现的。主要对象类型包括设备 (Device)渲染后端的入口点。所有其他对象都通过特定的设备创建。一个应用可以同时加载多个设备例如一个用于高质量离线渲染一个用于实时预览。数组 (Array)数据容器。用于传递顶点坐标、颜色、法线、索引等任何数据。ANARI的数组对象设计得非常灵活支持应用托管内存和设备托管内存两种模式以平衡性能与控制力。几何体 (Geometry)表示可渲染的物体形状。ANARI核心规范定义了三角形网格(triangle)、球体(sphere)、圆柱体(cylinder)、圆锥体(cone)和曲线(curve)等几种基本几何类型。这些类型基本覆盖了科学可视化中最常见的需求分子用球棍模型、流线用曲线、等值面用三角网格。空间结构 (Spatial Structure)用于加速光线求交的数据结构主要是边界体积层次结构 (BVH)。应用构建好几何体后需要将其组织成BVH渲染器才能高效地进行光线追踪。外观 (Appearance)定义几何体的视觉属性。核心类型是material材质用于描述表面如何与光线交互漫反射、镜面反射、折射等。此外还有sampler采样器用于纹理和light光源。表面 (Surface)将Geometry和Appearance主要是材质绑定在一起的容器。一个表面才是最终可被渲染的实体。体积 (Volume)用于体渲染Volume Rendering的数据对象支持结构化网格体积数据。相机 (Camera)定义观察视角和投影方式。支持透视投影、正交投影等。渲染器 (Renderer)渲染算法的抽象。你可以创建一个pathtracer路径追踪器、一个scivis科学可视化常用的带环境光遮蔽的渲染器或者一个debug用于调试的简单渲染器。渲染器对象允许你设置全局参数比如采样数影响抗锯齿和降噪质量。帧 (Frame)渲染输出的目标。它包含颜色缓冲区、深度缓冲区等。调用渲染接口的最终结果就是生成一个Frame然后你可以从中获取像素数据。所有对象都通过字符串-值对anariSetParameter的方式进行参数设置并通过anariCommit提交更改。这种设计使得API非常易于扩展新的参数和对象类型可以通过扩展机制加入而无需破坏API的二进制兼容性。3. 从理论到实践一个完整的ANARI渲染流程拆解让我们通过一个具体的例子来看看如何使用ANARI API渲染一个简单的场景。假设我们要渲染几个彩色的球体。以下代码基于ANARI SDK中的示例我加入了详细的注释和解释。3.1 初始化与设备创建任何ANARI程序的第一步都是加载后端库并创建设备。ANARI SDK提供了一个前端库libanari.so或anari.dll它负责在运行时动态加载你指定的后端实现库例如libanari_library_ospray.so。#include anari/anari_cpp.hpp #include anari/anari_cpp/ext/linalg.h // 提供线性代数辅助函数 int main() { // 使用ANARI的C包装器类型安全更易用 using namespace anari::cpp; // 1. 加载库并创建设备 // 这里我们请求加载名为“example”的后端SDK中自带的一个简单软件实现用于测试 // 在实际应用中你可能会加载“ospray”或“visrtx” Library lib loadLibrary(example, nullptr); Device dev makeDevice(lib, default); // 检查设备是否创建成功 if (!dev) { std::cerr ERROR: Failed to create ANARI device!\n; return 1; } // 2. 创建相机 (Camera) // 相机决定了我们观察场景的视角 Camera cam newCamera(dev, perspective); // 设置相机位置 (eye)看向的点 (center)和向上的方向 (up) anari::setParameter(dev, cam, position, ANARI_FLOAT32_VEC3, {0.f, 2.f, 6.f}); anari::setParameter(dev, cam, direction, ANARI_FLOAT32_VEC3, {0.f, -0.3f, -1.f}); anari::setParameter(dev, cam, up, ANARI_FLOAT32_VEC3, {0.f, 1.f, 0.f}); // 设置垂直视场角 (field of view) anari::setParameter(dev, cam, fovy, ANARI_FLOAT32, 60.f); // 设置宽高比 anari::setParameter(dev, cam, aspect, ANARI_FLOAT32, 1.f); // 提交相机参数使其生效 anari::commit(dev, cam);注意anari::setParameter是C包装器提供的类型安全函数。在纯C API中你需要使用anariSetParameter并手动指定参数类型枚举如ANARI_FLOAT32_VEC3。commit操作是ANARI的一个重要概念。在commit之前你对对象参数的修改处于“暂存”状态渲染器不会使用。这允许你原子性地更新整个复杂对象的属性避免渲染中间状态。3.2 构建场景几何、材质与光源接下来我们创建场景内容。我们将创建三个不同颜色的球体。// 3. 创建世界容器 (World) // World是所有可渲染对象的根容器 World world newWorld(dev); // 4. 创建几何数据球体的中心位置和半径 // 我们创建三个球体 std::vectoranari::float3 positions { {-1.5f, 0.f, 0.f}, // 球体1中心 { 0.0f, 0.f, 0.f}, // 球体2中心 { 1.5f, 0.f, 0.f} // 球体3中心 }; std::vectorfloat radii {0.5f, 0.7f, 0.4f}; // 对应的半径 // 创建ANARI数组对象来存储这些数据 Array positionArray newArray1D(dev, positions.data(), ANARI_FLOAT32_VEC3, positions.size()); Array radiusArray newArray1D(dev, radii.data(), ANARI_FLOAT32, radii.size()); // 5. 创建球体几何对象 Geometry sphereGeom newGeometry(dev, sphere); // 将顶点位置和半径数组绑定到几何体上 anari::setParameter(dev, sphereGeom, vertex.position, positionArray); anari::setParameter(dev, sphereGeom, primitive.radius, radiusArray); anari::commit(dev, sphereGeom); // 提交几何体定义 // 6. 创建材质 (Material) // 我们创建三种不同颜色的漫反射材质 std::vectorMaterial mats; std::vectoranari::float3 colors { {0.8f, 0.2f, 0.2f}, // 红色 {0.2f, 0.8f, 0.2f}, // 绿色 {0.2f, 0.2f, 0.8f} // 蓝色 }; for (auto color : colors) { Material mat newMaterial(dev, matte); // “matte”表示朗伯漫反射材质 anari::setParameter(dev, mat, color, color); anari::commit(dev, mat); mats.push_back(mat); } // 7. 创建表面 (Surface)将几何体与材质关联 // 一个表面代表一个可渲染的实体。我们需要为每个球体创建一个表面实例。 std::vectorSurface surfaces; for (int i 0; i 3; i) { Surface surf newSurface(dev); anari::setParameter(dev, surf, geometry, sphereGeom); // 关键通过索引将材质数组与几何体实例关联。 // 这里我们为每个球体指定不同的材质。 anari::setParameter(dev, surf, material, mats[i]); anari::commit(dev, surf); surfaces.push_back(surf); } // 8. 将表面添加到世界中 Array surfaceArray newArray1D(dev, surfaces.data(), ANARI_SURFACE, surfaces.size()); anari::setParameter(dev, world, surface, surfaceArray); // 9. 创建并添加光源 Light light newLight(dev, directional); anari::setParameter(dev, light, direction, ANARI_FLOAT32_VEC3, {0.f, -1.f, -0.5f}); anari::setParameter(dev, light, color, ANARI_FLOAT32_VEC3, {1.f, 1.f, 1.f}); anari::setParameter(dev, light, intensity, ANARI_FLOAT32, 2.f); anari::commit(dev, light); Array lightArray newArray1D(dev, light, ANARI_LIGHT, 1); anari::setParameter(dev, world, light, lightArray); // 10. 提交世界完成场景构建 anari::commit(dev, world);实操心得在ANARI中Surface是一个非常重要的概念。它明确地将几何形状Geometry和外观属性Material分离开来。这种分离带来了巨大的灵活性你可以让多个不同的表面共享同一个几何体比如渲染同一个分子模型的线框模式和球棍模式也可以让一个复杂的几何体如一个三角网格的不同部分使用不同的材质。在设置材质时注意material参数可以直接接受一个Material对象所有几何实例使用同一材质也可以接受一个Material对象的数组并通过material.index等参数进行索引实现每实例或每图元的材质分配。这是高性能渲染中的常见模式。3.3 配置渲染器与执行渲染场景准备好了我们需要一个“画家”来把它画出来这就是渲染器。// 11. 创建渲染器 (Renderer) // 我们选择一个用于科学可视化的渲染器它通常内置了环境光遮蔽等实用特性 Renderer renderer newRenderer(dev, scivis); // 设置背景色 anari::setParameter(dev, renderer, background, ANARI_FLOAT32_VEC4, {0.1f, 0.1f, 0.1f, 1.f}); // 设置每个像素的采样数增加此值可以减少噪点但会增加渲染时间 anari::setParameter(dev, renderer, pixelSamples, ANARI_UINT32, 4); anari::commit(dev, renderer); // 12. 创建帧缓冲区 (Frame) const int width 1024; const int height 768; Frame frame newFrame(dev); anari::setParameter(dev, frame, size, ANARI_UINT32_VEC2, {width, height}); anari::setParameter(dev, frame, channel.color, ANARI_DATA_TYPE, ANARI_UFIXED8_RGBA_SRGB); anari::commit(dev, frame); // 13. 执行渲染 // 将相机、世界、渲染器与帧关联起来并开始渲染 anari::render(dev, frame); // 等待渲染完成对于异步渲染器这一步是必要的 anari::wait(dev, frame); // 14. 获取渲染结果 const void *mapped anari::map(dev, frame, channel.color); // 此时 mapped 指向一个 width*height*4 字节的RGBA图像数据 // 你可以将其保存为图片或显示在窗口中 // ... anari::unmap(dev, frame, channel.color); // 15. 清理资源 // ANARI使用引用计数管理对象生命周期。释放设备会释放其创建的所有对象。 anari::release(dev, dev); return 0; }这个流程清晰地展示了ANARI的核心工作模式创建对象 - 设置参数 - 提交(Commit) - 组织关系 - 渲染。整个代码结构清晰意图明确即使没有图形学背景的开发者也能大致理解每一步在做什么。4. ANARI在真实可视化工具中的集成与价值体现理论和小例子总是简单的ANARI的真正威力在于集成到大型、复杂的生产级科学可视化软件中。让我们看看几个知名工具是如何从中受益的。4.1 ParaView / VTK统一渲染后端告别“碎片化”ParaView作为一个极其强大和流行的开源科学可视化平台其渲染架构在历史上经历了多次演变。在集成ANARI之前VTKParaView的底层库已经支持多种渲染后端OpenGL Renderer主力渲染器用于传统的实时光栅化渲染。OSPRay Renderer基于CPU的路径追踪渲染器用于高质量离线渲染或交互式软渲染。VisRTX Renderer基于NVIDIA OptiX的GPU硬件加速光线追踪渲染器。问题在于这些后端各有各的接口、数据转换逻辑和特性集。VTK维护者需要为每一种后端编写和维护一套独立的“适配层”代码。当VTK的场景表示比如新增一种体绘制算法发生变化时需要同步修改所有后端的适配代码工作量大且容易出错。ANARI带来的改变VTK团队正在将ANARI作为统一的渲染抽象层。未来VTK内部可能只维护一个“ANARI适配层”。当需要新增一个渲染后端时比如一个基于Apple Metal的渲染器或一个全新的云渲染服务只需要该后端的提供者实现ANARI接口即可。VTK和ParaView无需做任何修改就能立即获得这个新后端的支持。这极大地降低了生态扩展的复杂度。集成中的技术细节VTK的vtkRenderer、vtkActor、vtkMapper等对象需要将其内部表示多边形数据、体数据转换为ANARI的对象Geometry、Volume。这个过程涉及到数据结构的映射和内存管理。ANARI的Array对象支持“共享内存”模式VTK可以直接将其内部的数据指针传递给ANARI后端避免了昂贵的内存拷贝这对于处理海量科学数据至关重要。4.2 VMD从“多头维护”到“单一接口”VMDVisual Molecular Dynamics的故事更具代表性。作为一个有着近30年历史的分子可视化软件它的渲染栈堪称一部图形API进化史IRIS GL时代初创期针对SGI工作站。OpenGL固定管线时代移植到OpenGL使用显示列表等。OpenGL可编程着色器时代重写渲染引擎以利用GLSL实现球体 impostor、高级光照等。多路光线追踪时代内部集成了TachyonCPU光线追踪、OptiXGPU光线追踪、OSPRayCPU路径追踪等多个渲染器。VMD的代码库中因此包含了多套渲染路径。每增加一种新的渲染技术比如实时光线追踪降噪开发者都需要在多个渲染器中重复实现或者选择只在某一个渲染器中支持导致功能不统一。ANARI作为解决方案VMD团队可以将ANARI作为其唯一的渲染接口。内部所有不同的渲染器OpenGL, OptiX, OSPRay都提供ANARI后端实现。VMD的应用层代码只需要调用ANARI API。这样做的好处是维护成本骤降只需要维护一套与ANARI交互的代码。功能同步任何后端通过ANARI暴露的新功能例如一种新的体积材质只要符合ANARI标准VMD前端就能立即、统一地使用。未来兼容当有更快的、支持新硬件特性的渲染器出现时集成工作变得非常简单。4.3 性能考量与异步渲染模式科学可视化应用对交互性要求极高。用户旋转一个包含数百万原子的分子模型时必须得到即时反馈。ANARI在设计之初就考虑了性能。异步操作anariRenderFrame函数通常是异步的。它启动渲染任务后立即返回不会阻塞调用线程。应用可以在此期间继续处理用户输入、更新UI或准备下一帧的数据。通过anariWait或查询帧状态可以等待渲染完成。这种异步模型对于保持UI流畅至关重要。数据更新优化当场景中只有部分物体的属性发生变化时比如相机移动了ANARI后端可以利用其内部加速结构BVH的增量更新能力或者仅重置部分采样而不需要完全重新构建整个场景。这比许多需要每帧完全重建场景的简单渲染API要高效得多。内存与零拷贝如前所述ANARI的Array对象支持应用托管内存。这意味着像VTK、ParaView这样已经将数据保存在自己内存管理系统中的应用可以避免在ANARI后端中再分配和复制一份数据。后端渲染器直接指针访问这对处理GB甚至TB级别的科学数据集是必不可少的性能优化。5. 开发者指南如何为你的应用集成ANARI如果你正在维护或开发一个科学可视化应用并考虑集成ANARI以下是一些具体的步骤和建议。5.1 评估与规划明确需求你的用户最需要什么是物理精确的材质渲染用于材料科学还是超大规模的体数据实时剖切用于流体仿真亦或是优美的艺术风格化展示用于教育和演示不同的需求可能对应不同的ANARI后端优先级。分析现有架构你的渲染代码是集中在一个模块里还是分散在各处评估将其重构为面向ANARI接口的难度。一个良好的、将场景数据与渲染绘制分离的架构会使得集成工作事半功倍。选择后端目前主流的ANARI后端实现有OSPRay (CPU)Intel主导的CPU路径追踪渲染器非常成熟在科学可视化领域应用广泛支持体积渲染、粒子渲染等。VisRTX / Omniverse (GPU)NVIDIA基于OptiX的GPU硬件加速光线追踪后端性能强劲特别适合需要实时交互和最高视觉质量的应用。Example DeviceANARI SDK自带的示例后端纯软件实现功能简单主要用于API测试和原型开发。 建议从Example Device开始集成确保API调用正确无误然后再切换到功能完整的OSPRay或VisRTX。5.2 集成步骤详解获取ANARI SDK从Khronos的GitHub仓库KhronosGroup/ANARI-SDK克隆或下载SDK。它包含了头文件、前端库以及示例后端。链接与初始化在你的构建系统如CMake中链接ANARI的前端库。在程序启动时使用anariLoadLibrary动态加载你选择的后端库如libanari_library_ospray。场景图转换这是最核心的一步。你需要遍历你的内部场景表示无论是自定义结构还是VTK的vtkPropCollection并将其转换为ANARI对象树。几何转换将你的三角网格、点、线转换为ANARI的Geometry。外观转换将你的颜色、材质、纹理属性转换为ANARI的Material和Sampler。实例化对于大量重复的物体如森林中的树木、分子中的同种原子使用ANARI的实例Instance功能可以极大节省内存和加速构建。实例共享底层几何和材质只存储不同的变换矩阵。渲染循环在你的渲染循环中每帧更新变化的ANARI对象参数如相机矩阵。调用anariCommit提交更改。调用anariRenderFrame开始渲染。在渲染进行时可以处理其他逻辑。调用anariWait等待帧完成然后anariMap出像素数据送入显示窗口。多后端支持可以设计一个简单的运行时后端切换机制比如通过配置文件或命令行参数指定要加载的库名。这方便用户根据硬件有无NVIDIA RTX显卡或需求速度优先还是质量优先进行选择。5.3 常见陷阱与调试技巧忘记调用anariCommit这是新手最常见的错误。设置参数后必须调用commit否则更改不会生效。建议将setParameter和commit封装成 helper 函数确保成对调用。内存生命周期管理ANARI使用引用计数。当你调用anariRelease释放一个对象时如果还有其他对象引用它比如一个Surface引用了一个Material该对象并不会被立即销毁。理解这一点有助于避免内存泄漏的困惑。使用SDK提供的调试层Debug Layer可以帮助跟踪对象泄漏。参数名拼写错误ANARI使用字符串作为参数名。“color”和“colour”会导致完全不同的结果。务必查阅所用后端的文档或头文件确认正确的参数名和数据类型。许多后端在调试模式下会对未知参数发出警告。性能瓶颈定位如果渲染速度慢首先确认你使用的是否是经过优化的发布版后端库如启用AVX-512的OSPRay或CUDA优化的VisRTX。其次使用ANARI的跟踪工具Tracing可以记录下所有的API调用帮助你分析场景构建和渲染调用的耗时分布。后端特性差异不同的后端支持的特性集可能有细微差别。例如某个后端可能不支持curve几何类型或者对某种体积数据的插值方式支持不同。在应用层做好特性检测和降级处理例如如果不支持curve则用细圆柱体来模拟是保证健壮性的关键。一个实用的调试技巧在开发初期强烈建议使用ANARI SDK自带的debug设备或example设备。它们虽然渲染慢但能提供最详细的错误信息和最严格的一致性检查。用它们来验证你的场景构建逻辑是否正确比直接用复杂的生产级后端调试要高效得多。6. 未来展望与生态发展ANARI 1.0标准已经发布但它只是一个开始。这个生态系统的健康发展取决于社区、厂商和开发者的共同参与。扩展机制ANARI的扩展机制是其长期生命力的保障。核心工作组可以定义标准的扩展如ANARI_KHR_volume_transfer_function用于更复杂的体绘制传递函数而各个厂商也可以发布自己的供应商扩展如ANARI_NV_ai_denoiser用于NVIDIA的AI降噪器。应用可以查询设备支持的扩展列表从而启用高级功能。更广泛的后端目前的后端主要集中在科学可视化领域。我们期待看到更多领域的渲染器提供ANARI接口例如游戏引擎渲染后端一个将场景导出到ANARI从而能利用Unreal Engine或Unity的实时渲染管线进行高质量可视化的后端。云渲染后端将渲染任务提交到云端集群实现本地无法完成的海量数据或超高质量渲染。专业渲染器后端如Arnold、V-Ray的ANARI适配为科学可视化提供影视级的渲染质量。与现有标准的融合ANARI与USDUniversal Scene Description通用场景描述的结合是一个令人兴奋的方向。USD是皮克斯开发的一种用于描述复杂3D场景的格式正在成为跨行业影视、设计、制造的场景交换标准。已经有实验性的ANARI后端能够将ANARI场景实时桥接到NVIDIA Omniverse基于USD中。这意味着在ParaView中创建的科学可视化场景可以无缝导入到支持USD的工业设计或数字孪生平台中进行融合展示。对应用开发者的最终建议如果你正在启动一个新的科学可视化项目强烈建议将ANARI作为首选的渲染抽象层。即使初期你只打算支持OpenGL也可以先基于ANARI的“example”或一个简单的OpenGL后端进行开发。这样构建的架构是面向未来的当需要集成更先进的渲染技术时代价会小得多。对于已有的大型项目可以采取渐进式集成策略例如先为非交互式的“截图”或“动画导出”功能提供ANARI路径让用户尝到高质量渲染的甜头再逐步将交互式视图也迁移过来。ANARI代表的是一种思路的转变从“自己造轮子”到“使用标准化接口”。在图形硬件和算法飞速发展的今天让专业的人做专业的事让应用开发者回归到领域问题本身这或许是科学可视化软件能够持续进化、不被技术洪流抛下的最有效路径。它不仅仅是一个API更是一个推动整个领域向更高效、更开放、更协作方向发展的催化剂。