全屏Pass的效率
之前在Bufferless rendering in OpenGL提到使用一个三角形渲染全屏的方法,没想到此处犹有后续。使用包含全屏范围的三角形和scissor test,实现一个三角形渲染全屏的效率,比两个三角形组合成一个全屏quad的方法更高效。
Optimizing Triangles for a Full-screen Pass
What’s the best way to draw a fullscreen quad in OpenGL 3.2
光栅化后,pixel shader的执行是以2x2
quad组织的,所以即使一个三角形只覆盖了 quad 中的 1 个像素,GPU 仍然会把这
4
个像素一起调度执行,这样做是为了能够计算相邻像素差分来计算屏幕空间导数(选择合适的
mipmap 级别和做各向异性滤波),也就是 ddx / ddy。当三角形只覆盖了 quad
的一部分像素时,未被覆盖的像素仍然会执行shader,它们叫
helper lanes /
helper invocations,甚至有内置函数访问helper invocations。2x2
quad未被占满,计算资源就被浪费了,就导致quad overdraw/quad overshading,降低了quad utilization。
回到本文的场景,两个三角形渲染全屏,两个三角形各有一条边通过全屏的对角线,对角线上就会有产生很多不被占满的quad和helper invocations,这就是其性能降低原因。