我正在按照本教程在我的 OpenGL 图形引擎中实现延迟照明机制。它工作正常,我不会遇到麻烦。
当涉及到点光源时,它表示要在灯光周围渲染球体,只让那些像素通过光照着色器,这可能会受到灯光的影响。该方法存在一些关于 cullface 和相机位置的问题,此处已详细说明。为了解决这些问题,本教程使用了模板测试。
我怀疑导致我第一个问题的方法的效率:
画一个代表光球的圆圈不是更好吗?
球体在屏幕上总是看起来像一个圆圈,无论您从哪个角度看它。任务是确定圆的屏幕位置和缩放比例。这种方法有3个优点:
- 没有cullface问题
- 没有camereposition-in-lightsphere-issue
- 效率更高(顶点数量严重减少 + 无模板测试)
使用这种技术有什么缺点吗?
我的第二个问题涉及实施上述方法。圆圈的中心位置可以像往常一样轻松计算:
vec4 screenpos = modelViewProjectionMatrix * vec4(pos, 1.0);
vec2 centerpoint = vec2(screenpos / screenpos.w);
但是现在如何计算结果圆的缩放比例? 它应该取决于距离(相机到光线)以及透视图。