我正在尝试使用 OpenGL 开发一款游戏,该游戏通过片段着色器中的 raymarching 算法渲染场景。我打算使用与渲染场景相同的有符号距离场函数来实现碰撞。
我想弄清楚的是,是否有一种方法可以为碰撞测试和着色器使用相同的 SDF 函数,而无需编写两次。
有什么方法可以访问 frag 着色器中的 c++ 函数或获取计算着色器的输出以用于碰撞测试?
设置一个完整的单独渲染管道只是为了从计算着色器调用一个函数听起来很不方便。有没有更简单的方法来实现这一点?
我正在尝试使用 OpenGL 开发一款游戏,该游戏通过片段着色器中的 raymarching 算法渲染场景。我打算使用与渲染场景相同的有符号距离场函数来实现碰撞。
我想弄清楚的是,是否有一种方法可以为碰撞测试和着色器使用相同的 SDF 函数,而无需编写两次。
有什么方法可以访问 frag 着色器中的 c++ 函数或获取计算着色器的输出以用于碰撞测试?
设置一个完整的单独渲染管道只是为了从计算着色器调用一个函数听起来很不方便。有没有更简单的方法来实现这一点?
只要您想使用原始 OpenGL 和 GLSL,或任何其他低级渲染 API,您就必须将代码移植到该 API 使用的着色语言。如果您想让该代码具有可移植性,您应该寻求更高级别的框架/引擎/交叉编译器。例如,这是一个允许在 C++ 中编写着色器的一个。另外,请记住,您的 C++ 代码的逻辑也可能需要修改,因为着色器执行模型是大规模并发的:顶点着色器按顶点执行,片段着色器 - 每个像素,计算 - 每个线程。执行本身是并行运行的(不是一次全部运行,而是在底层硬件规范允许的范围内,请参阅这篇文章以了解它如何在 Nvidia GPU 上工作)串行算法在 GPU 上的性能非常糟糕。
通过大量使用 C 预处理器 ( #if
, #define
),您可以编写 GLSL 代码,该代码也可以编译为 C 或 C++。我不确定这是否是一般推荐的,但它是一种选择。