屏幕空间环境遮挡(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>。
// …