在GLSL中实现光线匹配表面

时间:2014-04-27 21:42:22

标签: c++ opengl 3d glsl

我一直在阅读很多关于GLSL着色器中光线行进的文章(例如这篇文章:http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm),并提出了一些我想问的问题。 / p>

在我的应用程序中,我正在渲染一个有几个网格的场景,我想尝试阴影。虽然我似乎有点理解raymarching如何工作的概念,但我不太清楚如何在GLSL中正确实现它。我知道如何计算光线和平面的交点,但是如何通过GLSL着色器处理它?<​​/ p>

根据这篇帖子:( https://gamedev.stackexchange.com/questions/67719/how-do-raymarch-shaders-work)它提到你正在测量光线开始与“表面”之间的距离。表面是他指的是网格吗?我是否需要将构成网格的平面/点数组发送到着色器以计算光线相交测试?我是否需要使用深度缓冲来确定表面的距离?

1 个答案:

答案 0 :(得分:0)

它取决于着色器的作用与渲染引擎的作用。在像shadertoy这样的纯粹演示着色器中(参见其shadow examples),整个场景在着色器中进行编码,因此拍摄二次光线或其他光线(在perfs旁边)没有问题。

如果场景不是由着色器管理的,那么您需要与引擎进行一些合作。至少,在第一遍中产生阴影贴图(存在许多不同的算法)。 请注意,使用SVO表示时,场景首先会转换为稀疏体素,然后可以通过着色器为二次光线进行行进。甚至可以用于主光线,但你可以在这里使用常规的Z缓冲区,并且可以使用体素锥形跟踪(例如)用于所有类型的辅助光线(参见*使用体素锥跟踪的交互式间接照明*):{{3} (好吧,你可能会发现它在你的简单应用程序中有点过分了。)对于柔和的阴影和景深,请参阅开篇论文 GigaVoxels:Ray-Guided Streaming for Efficient and Detailed Voxel Rendering 。树甚至可能是三角形的常规BSP,而不是体素的八叉树。但是你失去了SVO的许多优点(穿孔,增加了柔和的阴影)。