gpt4 book ai didi

c++ - 相对论光线追踪和球面纹理

转载 作者:行者123 更新时间:2023-11-30 05:32:43 26 4
gpt4 key购买 nike

问题

我需要一些关于针对我的特定问题使用哪些技术和编程环境的建议。

问题

给定太空中的重物,其史瓦西半径上方有一个静态表面,位于太空中的人将如何看到它的表面(忽略光照)?例如,人们可能会想象一颗中子星
参见:https://en.wikipedia.org/wiki/Neutron_star ,我的程序应该生成类似于(但比网站上的图片更详细)的图片。

请注意,该程序应该能够每秒渲染几帧,并且“像”FPS 中的自由 View 和移动。

我想用非欧相对论空间中的光线追踪来解决这个问题。
为此,我需要求解约 1000 个独立的微分方程,这些方程决定了光线撞击表面的位置。

ODE 为 u´´+ u = 3Ru^2/2,初始条件为 u 和 u´,R 为常量。一旦您离开定义的界限,它就会终止。所以解决这个问题不会太复杂。

之后我会为每个像素做一些例程:

  • 转换为相对于某个方向的spere坐标(没有if分支)
  • 应用一些特殊的相对论角度校正(可能是一些没有分支的简单函数)
  • 通过应用由微分方程定义的插值函数,将角度的一部分转换为表面上的角度。没有碰到表面的像素现在应该是黑色的。
  • 将角度转换回一些标准球体坐标(无分支)。
  • 不确定这一点:对于表面图形,已经初步计算了一个特殊的 Delaunay 三角剖分,并且对于每条射线,颜色是通过加权相应三角形角的颜色来确定的。但如果有人想出更好的主意,我会很高兴。

我会喜欢 C/C++/C# 之类的环境

问题:

  • 什么框架适合我的问题?
    open GL 似乎专注于欧氏光线追踪,这在此设置中毫无用处。
    CUDA 会限制我使用 Nvidea gpus
    open cl 是正确的做法吗?
  • 所描述的操作是否可在 GPU 上执行?
    我特别担心从各种处理器并行访问插值函数数据。在 Delaunay 三角剖分上同时定位(O(log(#vertices)和分支)大量光线对我来说似乎是个问题。open question
  • 对于在表面上表示图形以及确定特定位置应使用什么颜色,您有更好的想法吗?
  • 在 GPU 上计算微分方程是否值得?它们由 runge kutta 方法解决,并在任意时间后终止。

关于我的知识水平:

我是一名数学专业的学生,​​我的 Bac 中涉及上述问题。论文。
我有一些使用 C++ 的经验,并且已经了解了 C# 和 Gtk 中的 GUI。编码不是我的日常事件,但我对标准的东西没有问题。
一旦我的论文完成,我将分享结果。

最佳答案

以下是我对所提出问题的建议:

这非常好,因为您的 ODE 是独立的(适合并行执行)并且您可以使用固定步长积分(无线程发散),因为这使您的问题非常适合 GPU。

其中一个可能有用的库是 boost::odeint,它提供了最流行的 ODE 积分器(包括 Runge-Kutta)的实现。它还支持 GPU 加速计算,但是在这种情况下,您必须使用 device_vector 作为状态类型,并且必须使用 thrust::for_each 转换作为方程(在您的情况下可能难以实现)。似乎 thrust 库不仅支持 Nvidia GPU,但我不确定。

如果推力库函数不适合您的问题,您可以提供自己的 Runge-Kutta 实现(反正不是很复杂)和使用 CUDA 或 OpenCL 的 ODE 定义。如果您决定使用 CUDA,并且您能够使用具有 3.5 或更高计算能力的设备,您可以利用所谓的“动态并行性”,它允许您调用内核函数(在 CUDA 中,这是一个运行的函数在 GPU 上)来自另一个内核函数,这有效地允许您从另一个线程创建一些线程。例如,您可以使用 5 个线程(5 点 Runge-Kutta)调用 RungeKutta 方法,并且您可以从每个线程调用 1000 个线程来进行 ODE 计算(每个线程计算一个方程)。现代 GPU 通常有超过 10 个 SM(流式多处理器),每个 SM 能够处理 2048 个线程,因此您可以执行每个集成步骤,只需一次计算拆分超过 5000 个线程。如果您决定使用 OpenCL,我不确定此功能。

您接下来的步骤(坐标转换等)看起来非常适合 thrust::for_each 函数,但如果事实证明它们不适合,您可以再次使用 CUDA/OpenCL 接口(interface)。

至于最终的图形表示,我不能给你任何建议,但我想你可以简单地使用任何图形库(包括 OpenGL)并手动将像素放在它们的位置。

最后,在你的项目中,时间表现非常重要。请记住使用一些分析器(例如 Nvidia 可视化分析器)来调查您的代码并找出最慢的部分。您还应该编写单元测试,不仅要测试您的代码是否存在潜在错误,还要分别测试项目每个部分的性能。

当然,您可以在 C++ 中执行此操作。

关于c++ - 相对论光线追踪和球面纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com