您的位置:首页 > 运维架构

NEHE的OpenGL-Lesson 02 Your First Polygon

2012-02-16 16:02 363 查看

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红皮书,它更像是一本你需要经常翻的工具书, 它会让你了解到各种细节问题。 好了,关于这个问题就到这。 如果你发现了什么疏漏, 请即时通知我,或者, 也十分欢迎你的支持和鼓励, 我会很乐意阅读你的来信。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: