使用TMesh生成3D立方体阴影异常:顶点法线计算及顶点配置疑问
问题解答
1. 8顶点方案的合理性
你当前使用8个顶点的方案仅适用于无光照、无阴影的纯几何形状渲染场景,你现在模型能正常显示就是因为纯几何渲染仅读取顶点坐标属性,法线未参与计算所以没有暴露问题。但只要涉及需要逐顶点法线参与的光照、阴影计算,该方案就不成立。顶点缓冲区的存储单元本质是「顶点全属性集合」,而非仅存储坐标,立方体棱角属于硬边,同一坐标位置的顶点分属三个不同朝向的面,对应三个完全不同的法线值,无法在单个顶点存储单元中存入多个法线属性,因此会导致光照、阴影计算异常。
2. 是否需要拆分共享顶点
是,硬边模型的棱角位置必须拆分共享顶点。对于全硬边的立方体而言,确实需要拆分为6面×4顶点=24个顶点,即使多个顶点的坐标完全一致,只要法线、UV等其他顶点属性不同,就需要作为独立顶点存储。
拆分后你只需要给每个面的4个顶点统一赋值该面的三角形法线即可:
- 正面(Z轴正方向)四个顶点法线统一为
(0, 0, 1) - 右面(X轴正方向)四个顶点法线统一为
(1, 0, 0) - 背面(Z轴负方向)四个顶点法线统一为
(0, 0, -1) - 左面(X轴负方向)四个顶点法线统一为
(-1, 0, 0) - 顶面(Y轴正方向)四个顶点法线统一为
(0, 1, 0) - 底面(Y轴负方向)四个顶点法线统一为
(0, -1, 0)
修改完成后重新生成索引缓冲区,按24个顶点的顺序对应每个面的三角形索引即可解决阴影异常问题。
内容的提问来源于stack exchange,提问作者Livius
相关产品推荐
相关产品推荐

