面向初学者的3D游戏着色器————屏幕空间环境遮挡(SSAO)

本文面向初学者介绍3D游戏中的屏幕空间环境遮挡(SSAO)技术,它是提升场景真实感的关键。通过简单的着色器,SSAO可以近似计算环境遮挡,而无需详细分析所有几何信息。文章涵盖了SSAO所需的输入,如视图空间顶点位置、法线向量,以及如何生成和应用样本向量、噪声向量。同时,还讨论了如何通过调整参数来优化SSAO效果,包括半径、偏置、幅度和对比度。最后,提到了SSAO结果的模糊处理和整合到环境颜色计算中的步骤。
摘要由CSDN通过智能技术生成

屏幕空间环境遮挡(SSAO)
SSAO是那些你从来不知道你需要的效果之一,一旦你拥有了它,你就不能没有它。它可以把一个场景从平庸变成哇!对于相当静态的场景,可以将环境遮挡烘焙成纹理,但是对于更动态的场景,需要着色器。SSAO是比较复杂的着色技术之一,但是一旦你成功了,你会觉得自己像一个着色大师。

通过仅使用少量纹理,SSAO可以近似环境遮挡场景。这比通过查看场景的所有几何图形来计算环境遮挡要快。这些少数纹理都起源于屏幕空间,给屏幕空间环境遮挡起了名字。

输入
SSAO着色器将需要以下输入。

视图空间中的顶点位置向量。
视图空间中的顶点法线向量。
切线空间中的样本向量。
正切空间中的噪声向量。
相机镜头的投影矩阵。
顶点位置
将顶点位置存储到帧缓冲纹理中不是必须的。您可以从相机深度缓冲区。作为初学者指南,我将避免这种优化,并保持它的直接性。但是,对于您的实现,请随意使用深度缓冲区。
PT(Texture) depthTexture = new Texture(“depthTexture”);
depthTexture->set_format(Texture::Format::F_depth_component32);

PT(GraphicsOutput) depthBuffer = graphicsOutput->make_texture_buffer(“depthBuffer”, 0, 0, depthTexture);
depthBuffer->set_clear_color(LVecBase4f(0, 0, 0, 0));

NodePath depthCameraNP = window->make_camera();
DCAST(Camera, depthCameraNP.node())->set_lens(window->get_camera(0)->get_lens());
PT(DisplayRegion) depthBufferRegion = depthBuffer->make_display_region(0, 1, 0, 1);
depthBufferRegion->set_camera(depthCameraNP);
如果您确实决定使用深度缓冲区,以下是如何使用Panda3D设置它的。
in vec4 vertexPosition;

out vec4 fragColor;

void main() {
fragColor = vertexPosition;
}
下面是用于将视图空间顶点位置渲染成帧缓冲纹理的简单着色器。更复杂的工作是设置帧缓冲纹理,这样它接收到的片段向量分量就不会被箝位[0,1]并且每个都具有足够高的精度(足够高的位数)。例如,如果特定的插值顶点位置是<-139.444444566, 0.00000034343, 2.5>,您不希望它作为<0.0, 0.0, 1.0>。
// …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geescan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值