1

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

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

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

4

2 回答 2

4

当我在做 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)

像山一样的形状

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

于 2010-11-07T15:30:26.150 回答
2

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

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

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

(*) a separate screen-oriented test being applied to pixels exactly on a boundary to ensure they're attributed to only exactly one polygon where polygons meet along a common edge

于 2010-11-07T17:50:00.740 回答