DirectX如何确定多边形缠绕顺序?我特别好奇关于背面剔除。通过研究我已经看到它建议DX计算表面法线并获取该点和相机矢量的点积,并且如果它是>则剔除0.
首先,这是DirectX实际使用的技术吗?其次,如果是这种情况,假设每个表面有两个法线 - 一个与另一个相反 - DirectX如何知道使用哪个法线?
答案 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]);
}
根据是以时钟方式还是以逆时针方式评估顶点,这些都会给出正面或负面区域。从后面看三角形会使正面积为负,反之亦然。并且该值随后用于确定是否光栅化前 - 后或后两种字体 - 和背面三角形。