面剔除总是会将back face丢弃(对于单个物体来说),而深度测试不会,只要Z-Value合理,它就都会渲染。一个明显的例子就是进入木箱内部看,开启了面剔除的木箱内部是空的,而深度测试照常渲染。
    至于开启了面剔除的木箱子为什么内部是空的:默认情况下,我们将背向面(方向是顺时针)剔除,进入了木箱子内部之后,视角前面的箱子面贴图是背向面,而当我们转个视角,发现也是背向面(因为视角改变了,原本在外面看来的正向面变成了背向面,而原本的背向面依旧是背向面)。也就是说,其实你摄像机看不到的那个面其实是有渲染的,然而你看不到。

    image.png
    OpenGL能够丢弃那些渲染为背向三角形的三角形图元。需要特定设置顶点的环绕顺序,然后使用OpenGL的面剔除选项了,它默认是禁用状态的。

    1. float cubeVertices[] = {
    2. // Back face
    3. -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, // Bottom-left
    4. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
    5. 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, // bottom-right
    6. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
    7. -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, // bottom-left
    8. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, // top-left
    9. // Front face
    10. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, // bottom-left
    11. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, // bottom-right
    12. 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, // top-right
    13. 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, // top-right
    14. -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, // top-left
    15. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, // bottom-left
    16. // Left face
    17. -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, // top-right
    18. -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-left
    19. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, // bottom-left
    20. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, // bottom-left
    21. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, // bottom-right
    22. -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, // top-right
    23. // Right face
    24. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, // top-left
    25. 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, // bottom-right
    26. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
    27. 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, // bottom-right
    28. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, // top-left
    29. 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, // bottom-left
    30. // Bottom face
    31. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, // top-right
    32. 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, // top-left
    33. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, // bottom-left
    34. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, // bottom-left
    35. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, // bottom-right
    36. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, // top-right
    37. // Top face
    38. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, // top-left
    39. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, // bottom-right
    40. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
    41. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, // bottom-right
    42. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, // top-left
    43. -0.5f, 0.5f, 0.5f, 0.0f, 0.0f // bottom-left
    44. };
    1. glEnable(GL_CULL_FACE);//启用面剔除
    2. glCullFace(GL_FRONT);//剔除哪个向面 GL_BACK背向面 GL_FRONT正向面 glEnable(GL_CULL_FACE)
    3. glFrontFace(GL_CCW);//定义哪个方向为正向面,GL_CCW代表的是逆时针的环绕顺序,GL_CW代表的是顺时针顺序