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