DirectX 如何确定缠绕顺序?

Jus*_* R. 0 directx 3d direct3d culling

DirectX 如何确定多边形缠绕顺序?我特别好奇背面剔除。通过研究,我发现 DX 计算表面法线并取其与相机矢量的点积,如果大于 0 则剔除。

首先,这是 DirectX 实际采用的技术吗?其次,如果是这种情况,假设每个表面都有两个法线(一个与另一个相对),DirectX 如何知道使用哪一个法线?

Law*_*Kok 5

不,这不是所使用的技术,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]);
    }
Run Code Online (Sandbox Code Playgroud)

根据顶点是顺时针还是逆时针计算,它们给出正面积或负面积。从后面看三角形,正面积将为负面积,反之亦然。随后使用该值来确定是否光栅化正面、背面或两者都面向字体和背面的三角形。