GPU渲染架构和对应的优化
IMR,TBR,TBDR三种架构和移动设备的渲染优化。
一个模型分为关节(joint, 或者称骨头bone)和网格,网格由很多顶点构成,每个顶点具有诸多顶点属性。在关节位置变动后,要将这些变化作用到mesh的顶点上,也就是蒙皮(skinning),本文说明蒙皮的原理。
在做某些效果,比如flat shade的时候希望能获得表面的法线,而不是顶点法线插值的结果。要在shader中读取面法线,除了从外部传入面法线外,可以使用dfdx和dfdy构建面法线。
OpenGL允许设置纹理的过滤,分为GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER两种。如果采样点的像素被认为是Minify了的,则用GL_TEXTURE_MIN_FILTER,如果是为认为是Magnify了的,用GL_TEXTURE_MAG_FILTER,决定用哪一个和mipmap无关,mipmap的三线性过滤通过_MIPMAP_NEAREAST和_MIPMAP_LINEAR决定。默认情况下,GL_TEXTURE_MAG_FILTER 的过滤方式是GL_LINEAR,GL_TEXTURE_MIN_FILTER 的过滤方式是GL_NEAREST_MIPMAP_LINEAR。
现在的GPU在光栅化后不是逐像素单个渲染,而是分成2x2=4个的像素分块,每个线程处理4个。之所以这样处理是为了保存像素的偏导数信息,在计算mipmap等级和面法线等时候很有用。
GPU使用线性插值得到的UV,从纹理中采样得到颜色,并在屏幕上重建。由于纹理的Texel是离散的,而UV是连续的浮点值,在采样纹理颜色时,要从离散的texel中得到最终得结果,这和其他采样如音频类似。纹理是对自然采样得到的离散结果,在屏幕上重建要使用各类过滤方法,以达到尽可能的还原自然。