Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 延迟照明|使用圆形的点光源_Opengl_3d_Game Engine_Post Processing_Deferred Rendering - Fatal编程技术网

Opengl 延迟照明|使用圆形的点光源

Opengl 延迟照明|使用圆形的点光源,opengl,3d,game-engine,post-processing,deferred-rendering,Opengl,3d,Game Engine,Post Processing,Deferred Rendering,在接下来的教程中,我将在OpenGL图形引擎中实现延迟照明机制。它很好用,我不会惹麻烦的 当涉及到点光源时,它表示渲染灯光周围的球体,以仅使这些像素通过照明着色器,这可能会受到灯光的影响。该方法存在一些与人脸和相机位置有关的问题,需要精确解释。为了解决这些问题,本教程使用模具测试 我怀疑这种方法的有效性,这导致了我的第一个问题: 画一个代表光球的圆不是更好吗? 无论从哪个角度看,球体在屏幕上总是看起来像一个圆。任务是确定屏幕位置和圆圈的缩放比例。这种方法有3个优点: 没有面子问题 在light

在接下来的教程中,我将在OpenGL图形引擎中实现延迟照明机制。它很好用,我不会惹麻烦的

当涉及到点光源时,它表示渲染灯光周围的球体,以仅使这些像素通过照明着色器,这可能会受到灯光的影响。该方法存在一些与人脸和相机位置有关的问题,需要精确解释。为了解决这些问题,本教程使用模具测试

我怀疑这种方法的有效性,这导致了我的第一个问题:

画一个代表光球的圆不是更好吗? 无论从哪个角度看,球体在屏幕上总是看起来像一个圆。任务是确定屏幕位置和圆圈的缩放比例。这种方法有3个优点:

  • 没有面子问题
  • 在lightsphere问题中没有重新定位
  • 效率更高(顶点数量严重减少+无模具测试)
使用这种技术有什么缺点吗?

我的第二个问题涉及实现上述方法。可以像往常一样轻松计算圆的中心位置:

vec4 screenpos = modelViewProjectionMatrix * vec4(pos, 1.0);
vec2 centerpoint = vec2(screenpos / screenpos.w);
但是现在如何计算结果圆的缩放比例?
它应该取决于距离(相机到灯光)和透视图。

我没有阅读全部内容,但我想我理解这种方法的总体思路

  • 不会有多大帮助。如果移动相机使圆位于近平面的后面,则仍然会出现问题-在这种情况下,不会生成任何碎片,灯光将“消失”

  • 文章中描述的灯光将有一个锐利的衰减,这是可以理解的,因为球体或圆将有锐利的边界。我不会叫它闪电点

  • 对我来说,这看起来像是过早的优化。。。我当然会渲染整个screenquad,并像往常一样进行着色处理,没有特殊情况需要担心。不要忘记,所有使用opengl状态的操作和额外的绘图操作也会带来开销,现在还不清楚哪一个会超出另一个

  • 你忘了在这里做透视分割

  • 计算缩放的最简单方法是将球体表面上的点变换为屏幕坐标,并计算矢量长度。很明显,这不是屏幕空间边界上的一个点


  • 我认为那是行不通的。使用球体的目的是将其用作光体,而不仅仅是圆。我们希望对场景中位于灯光体积内的多边形应用照明。渲染场景时,将写入深度缓冲区。灯光体积渲染步骤使用此数据正确应用照明。如果它只是一个圆,即使圆被投影到正确的深度,你也无法知道a和C是否应该被照亮


    顺便说一句,如果使用透视投影,球体将不会看起来像一个完美的圆。您可以快速绘制将球体透视投影到曲面上时发生的情况,以查看在大多数情况下它不会是一个圆。您是对的。不过,当半径乘以1.2,透视角度为45°时就足够了。延迟着色的要点是首先将场景渲染为多个纹理,其中包含每个像素的数据(位置、颜色、法线…)。然后,在后处理中,设置depthbuffer并计算所有像素的光分量。圆形或球体,只要像素被它们覆盖,使用哪一个并不重要。这是错误的,深度缓冲写入被设置,但深度测试仍然处于活动状态,例如:
    配置正面多边形的模具操作,以在深度测试失败时减小模具缓冲区中的值,但在深度测试或模具测试成功时保持不变。
    这意味着读取深度缓冲区,但是这些值在“光体积”步骤中不会更新。我知道在教程中它们就是这样做的,以解决cullface问题。然而,在我的实现中并非如此。我没有使用模具测试。正如Pavel Beley所说,我还可以渲染一个填充屏幕的平面四边形。该四边形覆盖的所有像素都会通过照明着色器,深度不会被测试。请这样想-如果你只是照亮屏幕空间圆区域内的所有东西,那么你实际上是在向场景中投射一个长圆锥体,并照亮圆锥体内的所有东西。这不是您想要的,因为您的点光源在场景中具有3D位置,并且您希望照亮该点附近的对象。如果你只是有一个屏幕空间圆圈,你最终会照亮光源3D位置前后的东西。T.36的第一张图片只是边界球体的可视化。这不是实际的照明。但是我必须承认你是对的。通过实施模具测试,可以测试深度,这是包围球体+模具测试的一大优势。现在我明白为什么很多人使用这种技术了。你说得对,我忘了。在这种情况下,您必须渲染屏幕四边形。光球边界上的衰减因子很低,几乎为零。你不会看到的。每个灯光都有一个屏幕四元组?比如说,20盏灯?与通过受光线影响的像素相比,声音更为广阔。再说一次,你是对的。实际上我不知道,因为顶点着色器会自动执行。我会编辑的。理解。但是如何确定屏幕空间中边界上的点呢?