DirectX 如何确定多边形缠绕顺序?我对背面剔除特别好奇。通过研究,我看到它建议 DX 计算表面法线并获取该法线和相机矢量的点积,如果大于 0 则剔除。
首先,这是 DirectX 实际采用的技术吗?其次,如果是这种情况,考虑到每个表面都有两条法线——一个与另一个相对——DirectX 如何知道使用哪个法线?
不,这不是使用的技术,opengl 或 directx 都没有相机视图向量的概念。发生的情况是顶点被转换到标准化设备坐标空间(首先让用户转换到顶点着色器中的投影空间,然后将 xyz 分量除以 w)。在该坐标系中,我们可以使用顶点的 x 和 y 分量来计算三角形的“有符号面积”。
float signedArea = 0;
for( int k = 1; k < output->count; k++ ) {
signedArea += (output->vertices[k - 1].values[0] * output->vertices[k - 0].values[1]);
signedArea -= (output->vertices[k - 0].values[0] * output->vertices[k - 1].values[1]);
}
根据是顺时针还是逆时针评估顶点,这些会给出正面积或负面积。从后面看三角形,会使正区域变为负区域,反之亦然。该值随后用于确定是栅格化正面、背面还是字体和背面的三角形。