c – 如何在OpenGL中创建深度淡化效果?
作者:互联网
我想创建一个半透明的球体,它在与其他物体(例如地面)相交的地方突出显示.
就像这张图片中的白线一样:
我找到了an Unreal Engine 4 tutorial关于如何创建这样的东西.
它在着色器中使用“深度淡化”.不幸的是,我还没有找到任何关于Depth Fades的OpenGL教程.
如何创建这样的效果?
解决方法:
当然.我不知道Unreal对它的确切含义,但总体思路如下.
首先,您需要一个可读的深度缓冲区.这意味着要么进行深度预处理,要么在渲染场景中的不透明对象(您希望此球体相交的对象)之后渲染此特殊效果.我将假设你知道或者可以弄清楚如何创建和使用你自己的深度缓冲区,以便你可以在后面的步骤中阅读它.您将无法使用GL的默认深度缓冲区(因此您需要一个帧缓冲对象,颜色附件,深度附件).
现在,我们来谈谈渲染球体.在顶点着色器中,您需要:
>像往常一样转换顶点
>转换后,将顶点的深度值写入变化(您需要在片段着色器中使用它)
因此,顶点着色器的目的是计算球体的场景深度并将其传递给片段着色器.
在片段着色器中,您可以使用该技术.您需要将可读深度缓冲区绑定到统一的sampler2D.然后:
>在当前屏幕位置采样深度缓冲区
>计算sceneDepth – currDepth,其中currDepth是您从vert着色器传入的变化,sceneDepth是您从深度缓冲区中采样的值
>然后应用一些数学运算来获得这种差异的效果.对于一个非常粗略的例子,float effectAlpha = exp(-k * max(0.0,sceneDepth – currDepth)); k在这里控制它逐渐淡出的速度.然后,您可以添加一些颜色,并将其乘以effectAlpha.
最后,关键是你要根据渲染几何体的深度和遮挡场景的深度之间的差异来计算效果.因此“深度消退”.例如,使用类似的技术使水看起来平滑地淡入海岸线.
编辑:我只是掩盖了教程并注意到他也使用了菲涅耳效应.这是在掠过角度时给予一些亮点.如果你搜索菲涅尔效应GLSL,应该很容易找到源 – 菲涅耳在渲染中无处不在,特别是在基于物理的渲染中.基本的想法是,你将计算一个值为0,其中你的对象’面对’相机(‘面’意味着法线向量与相机的方向对齐),1,你的对象面向正交的方向相机.
在您发布的屏幕截图中,菲涅耳实际上看起来并不是很明显(菲涅耳是一个非常轻微的效果,因为它大致像五度多项式一样衰落),所以你可以通过深度淡化实现你想要的大部分效果单独.
标签:c,fragment-shader,opengl 来源: https://codeday.me/bug/20190823/1700375.html