通常在渲染到反射贴图时需要翻转CullMode,因为视矩阵被镜像了。但我们知道,减少状态切换是提高3D管线效率的重要优化。更重要的是,渲染到反射贴图涉及到引擎中会用到的大部分Effect,因为他们都需要被用来渲染到反射贴图,这意味着要在较大的范围内考虑和支持翻转CullMode,将一个效果的复杂度扩散到引擎层面,增加了引擎的复杂度。 如果能避免翻转CullMode,则一来简化架构二来提高效率。那么如何做到呢?其实也简单,之所以镜像视矩阵会导致需要翻转CullMode,是因为镜像时手系被调换了,右手系变成了左手系,或者左手系变成了右手系。那么只要把反射贴图再上下(左右也行)颠倒一下,那么就又恢复成原来的手系,也就不需要翻转CullMode了。 设Mcam为相机的世界空间姿态变换,Mrefl为反射矩阵,Mflip为Y轴翻转矩阵,皆为行矩阵: 则反射贴图用相机的世界变换为 Mcamrefl = Mflip * Mcam * Mrefl 反射贴图用视矩阵为Mviewrefl = invert(Mcamrefl) 这时渲染出的反射贴图也是上下颠倒的,采样时uv坐标也需要把v翻转一下变成(1-v)。