两边都可见 OpenGL Quad?

dre*_*ool 2 java opengl lwjgl

我刚开始学习 OpenGL,遇到了一个有趣的错误(这可能是因为我的错误行为)

但是,我似乎无法弄清楚为什么我的脸被默认绘制在两侧,而不是一侧。这是描述问题的一些屏幕截图

在此处输入图片说明

在此处输入图片说明

当我继续启用GL_CULL_FACE 时(因为显然默认情况下它没有启用,因为它应该是),我的四边形被渲染,但都在错误的一边。这是由于我计算法线的方式吗?

这是我计算法线的代码

public static Point3D calculateNormals(Point3D p1, Point3D p2, Point3D p3) {
    Point3D v1 = new Point3D(p2.getX() - p1.getX(), p2.getY() - p1.getY(), p2.getZ() - p1.getZ());
    Point3D v2 = new Point3D(p3.getX() - p1.getX(), p3.getY() - p1.getY(), p3.getZ() - p1.getZ());
    Point3D normal = new Point3D();
    normal.addX((v1.getY() * v2.getZ()) - (v1.getZ() - v2.getY()));
    normal.addY((v2.getZ() * v1.getX()) - (v2.getX() * v1.getZ()));
    normal.addZ((v1.getX() - v2.getY()) - (v1.getY() - v2.getX()));
    return normal;
}
Run Code Online (Sandbox Code Playgroud)

注意:创建一个没有参数的 Point3D 会导致 x、y 和 z 都被设置为 0,因此为什么可以使用 addX、andY 和 addZ。

我应该翻转我的正常计算吗?

der*_*ass 6

当我继续启用 GL_CULL_FACE 时(因为显然默认情况下它没有启用,因为它应该是)

你的意思是?GL_CULL_FACE按照规范的规定,默认情况下是禁用的。

什么是正面和什么是背面的决定完全独立于您使用的法线,GL 使用图元的缠绕顺序(由您指定的顶点的顺序定义)。默认情况下,如果一个面的顶点(在屏幕空间中)按逆时针方向定向,则该面被视为正面。

您可以通过翻转每个图元的绕组来重新定向您的面,或者您可以使用glFrontFace()将 GL 的顺序规则从 更改 GL_CCWGL_CW(顺时针),或者您甚至可以使用glCullFace()告诉 OpenGL 您要剔除正面而不是背面。

无论您选择哪种选项,我都会建议您确保确保场景中所有对象的缠绕顺序一致。原则上可以为每个绘制调用切换顺序,但如果不是绝对必要,则应避免这样做。