【问题标题】:can vertices coincide in convex polygons?顶点可以在凸多边形中重合吗?
【发布时间】:2010-11-07 15:10:37
【问题描述】:

我是 openGL 的新手,我正在阅读红皮书。现在,作为练习,我想手动绘制一个球体。为此,我将球体分成切片和堆叠,因此我得到多个矩形,但在球体的两极附近我得到三角形。 (希望这很清楚我在做什么)。现在我知道,如果您使用 GL_POLYGON 绘制一个多边形并且它恰好与自身相交,则行为是未定义的。我的问题是:给定三个点 v1、v2、v3 不在一条线上,这样做是否是未定义的行为:

glBegin(GL_POLYGON)
vertex v1
vertex v1
vertex v2
vertex v3
glEnd();

这可能将两个不相关的问题合二为一,但我也想知道:如果我选择将我的球体例程中的矩形划分为三角形,那么我如何做到这一点是否重要,也就是说,我划分哪个对角线矩形成两个三角形?我猜想绘制单色球体没关系,但我不知道纹理、着色器、照明等。

【问题讨论】:

  • 你至少可以在两极附近使用三角形
  • @Andrey:是的,我知道,我只是想知道是否可以避免考虑特殊情况。

标签: c++ opengl geometry convex-polygon


【解决方案1】:

当我在做 openGL 的东西时,我很快就坚持只使用三角形。它们的特殊之处在于三角形在任何情况下都不会模棱两可。

尽管您举个例子,但我想这会起作用,尽管可能与人工制品一起使用。

如何分割矩形并不重要,只要注意三角形的缠绕方式,定义点的方式,因为这决定了它们的正面和背面。

但绝对要坚持三角形,想象一个正方形的这四个点

(0,0,0) (1,0,0) (1,0,1) (0,0,1)

很容易看出它是一个扁平的正方形,但如果我将它们改为

(0,1,0) (1,0,0) (1,1,1) (0,0,1)

你现在有什么?它可以画成山谷或小山。如果我用三角形定义这个形状,你就知道我在描述什么

(0,1,0) (1,0,0) (1,1,1) (1,1,1) (1,0,1) (0,1,0)

山形

好的...所以我在这里稍微跟踪了一下...我的意思是,我不知道您的代码在实践中会做什么,但我认为您不应该以任何方式使用它。只要您的三角形描述正确,您如何分割矩形并不重要。

【讨论】:

    【解决方案2】:

    这没有任何问题。 OpenGL 始终必须能够处理多个顶点落在同一位置的光栅化几何图形的可能性,因为根据您的模型视图和投影矩阵(或几何图形和/或顶点),即使不同的输入点也可能最终成为相同的输出点如果您在可编程管道上,则为着色器)。它旨在以数学上正确的方式处理各种边缘情况。

    OpenGL 是否使用几何图形绘制像素的主要测试是其中心是否落在所绘制图元的数学范围内*。因此,OpenGL 可以渲染绘制不连续像素集的多边形(通常在它们变得几乎消失的时候发生)或不绘制任何像素(这往往是当它们最终变得非常小时,但从技术上讲它们可能是任意大的)大小,只要它们挤在像素中心之间)。

    硬件级别使用的确切测试可能因供应商而异,并且保证仅对屏幕上凸出的几何图形是正确的——这就是为什么大多数人说坚持三角形,因为它们不可避免地是凸出的。

    (*) 一个单独的面向屏幕的测试被应用于恰好在边界上的像素,以确保它们仅归因于多边形沿公共边缘相遇的恰好一个多边形

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2011-05-09
      • 2012-04-15
      • 2011-06-09
      • 2020-08-27
      • 2023-03-26
      相关资源
      最近更新 更多