【问题标题】:Clockwise and counter-clockwise in OpenGLOpenGL中的顺时针和逆时针
【发布时间】:2013-11-10 12:56:14
【问题描述】:

谁能解释我如何确定三角形是顺时针还是逆时针?

如果我用下面的代码渲染一个三角形

glBegin(GL_POLYGON);
   glVertex3f(-0.5f, -0.5f, 0.0f);
   glVertex3f(-0.5f, 0.5f, 0.0f);
   glVertex3f(0.5f, 0.5f, 0.0f);
glEnd();

如果是顺时针或逆时针,我现在怎么办?我知道这也取决于您正在查看的三角形的面,但是我如何在代码中看到呢?我读过OpenGL默认使用逆时针。但是如果我考虑 OpenGL 是如何绘制顶点的,我觉得它是顺时针方向的。我认为这只是我的推理错误。

【问题讨论】:

标签: c++ opengl geometry


【解决方案1】:

看看this说:
如果一个假想的物体沿着从它的第一个顶点、它的第二个顶点、依此类推,到它的最后一个顶点,最后回到它的第一个顶点的路径移动,则多边形到窗口坐标的投影被称为顺时针缠绕。关于多边形内部的顺时针方向。

重要的是要考虑所述多边形的投影与窗口坐标的关系。

基本上,当您说 OpenGL 默认使用逆时针方向时,您的推理略有偏差。但为了什么?这是为了确定哪些多边形是正面的,以便剔除不可见的多边形(不渲染)。也就是说,绕线是有目的的,它们不只是碰巧是 ccw 或 cw 绕线的。

在侧节点上,停止使用 glBegin() 和 glEnd()。

【讨论】:

  • 实际上,多边形基元本质上总是两侧的。缠绕顺序用于确定要栅格化哪个面(正面或背面)......这对于剔除、模板、固定功能照明、多边形填充模式(OpenGL 3 之前)等内容是必需的。你可以看到您在片段着色器中使用预先声明的布尔值:gl_PolygonFrontFacing 着色基于多边形的(例如 not 线或点)基元的哪一侧,并且当您指出,这是在光栅化之前通过测试顶点的投影后缠绕来确定的。
  • @AndonM.Coleman 这就是我……说的?我不明白你的意思是什么,我说什么要不然,你当然是对的。
  • 对不起,这是对您的陈述的回应:“这是为了确定哪些多边形是正面的,以便剔除不可见的多边形”。多边形本身不是正面的,把它们想象成平面的切口。您需要一些额外的信息来区分平面的正面和背面(法线),代替法线 OpenGL 使用缠绕方向来确定多边形的哪一侧被光栅化。但同样,多边形本身实际上有两条边,没有正面或背面的多边形。它实际上是 facet 剔除而不是 多边形剔除
  • 这是一个重要的区别,因为在光栅化之前多边形没有边。例如,几何着色器不会发出一组独特的正面和背面图元。如果他们这样做,那就太酷了;)
  • @AndonM.Coleman Aaah,对,对不起,是的,我说错了,谢谢您的纠正,我会尽量在我的回答中反映出来。问候。
【解决方案2】:

默认情况下,glVertex3f 函数以逆时针顺序提供点。

您提供的点在视觉上形成了一个顺时针三角形。

你看到的是三角形的背面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多