DirectX如何确定绕线顺序?

时间:2013-11-27 22:27:18

标签: 3d directx direct3d culling

DirectX如何确定多边形缠绕顺序?我特别好奇关于背面剔除。通过研究我已经看到它建议DX计算表面法线并获取该点和相机矢量的点积,并且如果它是>则剔除0.

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

1 个答案:

答案 0 :(得分:4)

不,这不是所使用的技术,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]);
    }

根据是以时钟方式还是以逆时针方式评估顶点,这些都会给出正面或负面区域。从后面看三角形会使正面积为负,反之亦然。并且该值随后用于确定是否光栅化前 - 后或后两种字体 - 和背面三角形。