现在的位置: 首页 > 综合 > 正文

NEHE的OpenGL-Lesson 02 Your First Polygon

2013年12月01日 ⁄ 综合 ⁄ 共 4596字 ⁄ 字号 评论关闭
文章目录

Lesson 02 Your First Polygon

 

在第一篇教程中, 你已经学会了如何创建一个 OpenGL 窗口。 而在这篇教程中,你将会学到如何创建三角形和四边形。 我们将使用GL_TRIANGLES来创建三角形,GL_QUADS 来创建四边形。

 

使用第一篇教程的代码作为基础, 我们将向DrawGLScene() 中添加内容, 下面列出了它的完整代码。如果你计划修改上一篇的代码, 你只须用下面的代码替换掉原来的 DrawGLScene(),或者仅增加几行新的代码到原来的 DrawGLScene() 中都可以。

 

int DrawGLScene(GLvoid)                               // Here's Where We Do All The Drawing

{

       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);              // Clear The Screen And The Depth Buffer

       glLoadIdentity();                                     // Reset The View

 

 

当你调用glLoadIdentity() 的时候你会回到屏幕(场景)的中心位置,这时 X 轴是从左到右方向的, Y 轴是从下往上方向的, 而 Z 轴是从屏幕里面射出屏幕这个方向的。(译注:glLoadIdentity 实际上复位当前矩阵为单位矩阵, 这里是原著的另一种思考方式)

 

OpenGL 屏幕(场景)的中心位置是在X轴,Y轴和Z轴上都为 0.0f 的位置。 这样,中心的左面是负值, 右面是正值(X轴); 下面是负值, 上面是正值(Y轴); 里面是负值, 外面是正值(Z轴)。

 

glTranslatef(x, y, z) 的功能是沿 X轴,Y轴和Z轴 做移动。 下面的代码在X轴上向左移动了1.5个单位, Y 轴上没有移动(0.0), Z 轴上向屏幕里面移动了 6.0个单位。注意当你做移动的时候你是相对于当前位置做的, 而不是屏幕(场景)中心位置。

 

       glTranslatef(-1.5f,0.0f,-6.0f);                                 // Move Left 1.5 Units And Into The Screen 6.0

 

 

现在我们已经移动到了屏幕的左半部分, 而且我们设置的透视深度(译注:在ReSizeGLScene中,第一篇)足够用了(对于-6.0)。 接下来我们创建三角形。 glBegin(GL_TRIANGLES)告诉OpenGL 我们将要开始绘制一个三角形,而glEnd() 的意思是我们已经完成了绘制。一般如果你想绘制 3个顶点(的物体),用GL_TRIANGLES, 在大多数显示卡上绘制 3 角形是非常快速的。 如果你想绘制4个顶点(的物体), 用GL_QUADS 更简单一些。不过据我所知大多数显卡都是把物体看作为三角形来绘制的。 最后, 如果你想绘制4个以上顶点(的物体), 用 GL_POLYGON。

 

在这个简单的程序中我们只绘制一个三角形。 如果想再增加一个三角形,我们就需要增加3行代码(3个顶点) 到原来的3行代码后面, 这样在glBegin(GL_TRIANGLES) 和 glEnd() 之间就会有6行代码了。 在glBegin(GL_TRIANGLES) 和glEnd() 之间应该是3个点为一组的, 多余的点会被忽略。 同样的道理也适用于4边形, 如果你绘制的都是4边形的话, 要增加另一个四边形你就需要在原来的4行代码的后面再添加一组4行代码。而一个多边形(polygon) 可由任意数目的顶点组成,所以在glBegin(GL_POLYGON) 和glEnd() 之间可以有任意行代码。

 

glBegin 后面的第一行代码为我们的三角形设置第一个顶点,glVertex 的第一个参数指定顶点的X坐标,第二个参数指定Y坐标, 而第三个指定 Z 坐标。 所以, glBegin(GL_TRIANGLES) 后面的三行代码分别指定了三角形上面的顶点, 左下角的顶点和 右下角的顶点。 然后, glEnd() 告知 OpenGL已经没有顶点了。这样, 一个封闭的三角形就完成了。

 

       glBegin(GL_TRIANGLES);                                       // Drawing Using Triangles

              glVertex3f( 0.0f,1.0f, 0.0f);                            //Top

              glVertex3f(-1.0f,-1.0f, 0.0f);                           // Bottom Left

              glVertex3f( 1.0f,-1.0f, 0.0f);                            // Bottom Right

       glEnd();                                                                 // Finished Drawing TheTriangle

 

 

现在一个三角形已经在屏幕的左半部分完成了, 接下来我们要移动到屏幕的右半部分准备绘制四边形。要完成移动, 我们需要再次调用 glTranslate 这个函数。这次我们要向右移动, 所以X必须是正值。因为我们刚才已经向左移动 1.5个单位了, 所以要到达屏幕的中心位置就要向右移动 1.5个单位, 然后我们还得再向右移动 1.5个单位才能到达中心的右侧, 这样, 总共我们须要向右移动 3.0个单位。

 

       glTranslatef(3.0f,0.0f,0.0f);                             // Move Right 3 Units

 

 

现在我们就来创建四边形, 我们可以使用GL_QUADS 来做这件事。 创建四边形的代码和创建三角形的代码一样很简单,不同的就是用GL_QUADS 代替了GL_TRIANGLES, 另外增加了一个顶点。 我们将按照左上,右上, 右下, 左下这样顺时针的顺序来绘制它。以顺时针的顺序, 我们将绘制出四边形的背面, 也可以说实际上我们看到的是它的背面。物体沿逆时针顺序被绘制的话就会以正面面向我们。 现在这还不重要, 不过之后你必须要明白。

 

       glBegin(GL_QUADS);                                             // Draw A Quad

              glVertex3f(-1.0f, 1.0f, 0.0f);                            // Top Left

              glVertex3f(1.0f, 1.0f, 0.0f);                            // Top Right

              glVertex3f(1.0f,-1.0f, 0.0f);                            // Bottom Right

              glVertex3f(-1.0f,-1.0f, 0.0f);                           // Bottom Left

       glEnd();                                                                 // Done DrawingThe Quad

       return TRUE;                                                         // Keep Going

}

 

 

最后我们要修改一下窗口上的标题。

 

                     if (keys[VK_F1])                               // Is F1 Being Pressed?

                     {

                            keys[VK_F1]=FALSE;                 // IfSo Make Key FALSE

                            KillGLWindow();                         // Kill Our Current Window

                            fullscreen=!fullscreen;                     // Toggle Fullscreen / Windowed Mode

                            // Recreate Our OpenGL Window ( Modified)

                            if (!CreateGLWindow("NeHe's FirstPolygon Tutorial",640,480,16,fullscreen))

                            {

                                   return 0;                     //Quit If Window Was Not Created

                            }

                     }

 

 

Markus Knauer 注:在 OpenGL 红皮书 ("OpenGLProgramming Guide: The Official Guide to Learning OpenGL, Release 1", J.Neider, T. Davis, M. Woo, Addison-Wesley, 1993) 中清晰地解释了NeHe所指的在 OpenGL 以单位移动的概念:

“[I mentioned] 英寸和毫米,这些在 OpenGL 中真的有意义吗?答案是, 不。 投影和其他变换都是无单位的。你可以认为近和远裁剪平面的位置分别是 1.0 和 20.0 米,英寸, 千米 或是 里格,这随你喜欢。 唯一的规则是, 你必须使用一致的尺度单位”

(译注:里格(league)是旧时英美长度单位,约为三或三哩)

 

 

在这一篇教程中我尽量做了详细的解释, 使用 OpenGL 绘制三角形和四边形的每一步。 如果你有什么意见或者问题请给我写 email。 如果你发现有什么不正确的地方或者是你有更好的办法, 请告诉我,我想尽我可能地做最好的 OpenGL 教程,而且我有兴趣听取你的反馈。

 

Jeff Molofee (NeHe)

 

 

(译著) 这一篇教程大约花了一天时间翻译。 如果你对这一篇教程中所叙述的移动,坐标, 变换, 绘制等等这些概念感觉到一头雾水,那你一定没有读过 OpenGL红皮书。 教程本身是一种实例化的学习过程,它并不能把过多文字浪费在基本概念上。 所以, 对于任何学习 OpenGL 的人手头都应该有一本OpenGL红皮书,它更像是一本你需要经常翻的工具书, 它会让你了解到各种细节问题。 好了,关于这个问题就到这。 如果你发现了什么疏漏, 请即时通知我,或者, 也十分欢迎你的支持和鼓励, 我会很乐意阅读你的来信。

抱歉!评论已关闭.