我刚开始学习 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。
我应该翻转我的正常计算吗?
当我继续启用 GL_CULL_FACE 时(因为显然默认情况下它没有启用,因为它应该是)
你的意思是?GL_CULL_FACE按照规范的规定,默认情况下是禁用的。
什么是正面和什么是背面的决定完全独立于您使用的法线,GL 使用图元的缠绕顺序(由您指定的顶点的顺序定义)。默认情况下,如果一个面的顶点(在屏幕空间中)按逆时针方向定向,则该面被视为正面。
您可以通过翻转每个图元的绕组来重新定向您的面,或者您可以使用glFrontFace()将 GL 的顺序规则从 更改 GL_CCW为GL_CW(顺时针),或者您甚至可以使用glCullFace()告诉 OpenGL 您要剔除正面而不是背面。
无论您选择哪种选项,我都会建议您确保确保场景中所有对象的缠绕顺序一致。原则上可以为每个绘制调用切换顺序,但如果不是绝对必要,则应避免这样做。
| 归档时间: |
|
| 查看次数: |
2767 次 |
| 最近记录: |