gpt4 book ai didi

java - 两侧都可见 OpenGL Quad?

转载 作者:行者123 更新时间:2023-11-30 06:19:57 25 4
gpt4 key购买 nike

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

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

enter image description here

enter image description here

当我继续启用 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;
}

注意:创建不带参数的 Point3D 会导致 x、y 和 z 全部设置为 0,因此可以使用 addX、andY 和 addZ。

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

最佳答案

When I go ahead and enable GL_CULL_FACE (because apparently it isn't enabled by default, as it should be)

什么意思? GL_CULL_FACE 根据规范的规定,默认情况下是禁用的。

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

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

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

关于java - 两侧都可见 OpenGL Quad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22493027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com