原文: Your First Polygon

在第一节中我讲解了如何创建OpenGL窗体.本节我会讲解如何创建三角形和四边形.我们会用GL_TRIANGLES来创建三角形,用GL_GUADS创建四边形.

我们会添加到第一节代码的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轴从屏幕外部往内部移动.

屏幕的中间是X,Y轴的0.0f.而左边就是负值.右边是正值.向屏幕的顶部移动是正值,向底部移动是负值.向屏幕的深处移动是负值,向观看者移动是正值.

glTranslatef(x, y, z)沿着X, Y和Z轴移动.下面的是在X轴上向左移动了1.5个单位.它在Y轴上没有移动,并往屏幕内部移动了6.0个单位.当你执行时,你会发现并不是从屏幕中间移动,而是从你当前屏幕的位置移动.

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

现在我们需要移动到屏幕的左手边,我们已经设置好足够深入屏幕(-6.0)的视觉,可以看见创建三角形的整个场景.

glBegin(GL_TRIANGLES)的意思是我们要开始绘制三角形,而glEnt()函数告知OpenGL我们已经创建三角形完毕.通常来说,如果你要画3个点的话可以用GL_TRIANGLES.大多数的显卡画三角形都是相当快的.如果你要画4个点可以用GL_QUADS.我听说的是,大多数显卡在后台是以三角形为单位绘制物体的.最后如果你需要绘制超过4个点的话,可以用GL_POLYGON.

在我们的简单演示程序中,我们只画了一个三角形.如果我们需要画第二个三角形,我们可以直接追加三行新的位置代码到原来的三行代码后面.这样6行代码都嵌套在glBegin(GL_TRIANGLES)和glEnd()函数之间.不用每次画3个点都用这两个函数包含一次.四边形也同理,如果你已经知晓你要创建的所有四边形的位置,你可以全部嵌套在glBegin(GL_TRIANGLES)和glEnd()函数之间.另一方面,多边形(GL_POLYGON)可以由任意个点组成,所以你嵌套多少行代码在glBegin(GL_POLYGON)和glEnd()之间都无所谓.

glBegin函数后面的第一行,是设置多边形的第一个点.顶点(glVertex)的第一个数值是X轴的值,第二个值是Y轴,第三个值是Z轴.第一个行中,我们不在X轴和Y轴上移动,只在Y轴上移动一个单位.这个是三角形的顶部的点.第二个顶点(glVertex)在X轴向左移动了一个单位,在Y轴向下移动了一个单位.这个是三角形的左下角的点.第三个顶点(glVertex)向右移动了一个单位,向下移动了一个单位.这个是三角形右下角的点.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 The Triangle

现在已经有一个三角形显示在屏幕的左边的,我们要在右边显示正方形.为了做这步,要再次调用glTranslate函数.这回是移动到右边,所以X是正值.之前已经向左移动了1.5个单位,这回要向右移动1.5个单位.就是说先会到中间点,然后向右移动1.5个单位.所以总共需要向右移动3.0个单位.

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

现在来创建正方形.会用到GL_QUADS.四边形顾名思义就是有4条边的多边形.四边形属性(GL_GUADS)最适合用来创建正方形.创建正方形的过程和创建三角形很像.就是用GL_GUADS代替GL_TRIANGLES,并且多了一组数值表示正方形的第4个点.我们会以左上,右上,右下,左下(顺时针方向)的顺序绘制.以顺时针的顺序绘制,正方形会被画成一个背面.意思是,我们见到的四边形的边实际上是背面.逆时针绘制物体才是面向我们的.不过这些暂时不重要,这是迟点才需要注意的事.

    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 Drawing The Quad
return TRUE; // Keep Going
}

最后添加窗体/全屏模式的切换快捷键,顺便加上窗体的标题.

记得还要改"//Create Our OpenGL Window"注释那行的代码中的标题.否则"全屏"窗体的标题会和"窗体模式"的标题不同.

if (keys[VK_F1])                // Is F1 Being Pressed?
{
keys[VK_F1]=FALSE; // If So Make Key FALSE
KillGLWindow(); // Kill Our Current Window
fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window ( Modified )
if (!CreateGLWindow("NeHe's First Polygon Tutorial",,,,fullscreen))
{
return ; // Quit If Window Was Not Created
}
}

[译]NeHe教程 - 你的第一个多边形的更多相关文章

  1. [译]NeHe教程 - 创建一个OpenGL窗体

    原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...

  2. [译]NeHe教程 - 添加颜色

    原文: Adding Colour 上一节我讲解了如何在屏幕显示三角形和四边形.本节会讲解如何上色.单色(Flat)顾名思义就是只能涂一种实心的颜色.平滑颜色(Smooth)可以在各个顶点混合三种颜色 ...

  3. (8)nehe教程2-多边形

    参考自: http://www.yakergong.net/nehe/ 你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何 ...

  4. [译]Vulkan教程(33)多重采样

    [译]Vulkan教程(33)多重采样 Multisampling 多重采样 Introduction 入门 Our program can now load multiple levels of d ...

  5. [译]Vulkan教程(14)图形管道基础之固定功能

    [译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...

  6. [译]Vulkan教程(30)深度缓存

    [译]Vulkan教程(30)深度缓存 Depth buffering 深度缓存 Introduction 入门 The geometry we've worked with so far is pr ...

  7. [译]Vulkan教程(28)Image视图和采样器

    [译]Vulkan教程(28)Image视图和采样器 Image view and sampler - Image视图和采样器 In this chapter we're going to creat ...

  8. [译]Vulkan教程(27)Image

    [译]Vulkan教程(27)Image Images Introduction 入门 The geometry has been colored using per-vertex colors so ...

  9. [译]Vulkan教程(26)描述符池和set

    [译]Vulkan教程(26)描述符池和set Descriptor pool and sets 描述符池和set Introduction 入门 The descriptor layout from ...

随机推荐

  1. Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论

    FTP协议 / FTP Protocol FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载.基于TCP/IP ...

  2. String format -1 常规格式化

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的读者应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  3. ACM的奇计淫巧系列

    突然想写个系列,算是总结总结集训中遇到的各种黑科技吧,这是目录 ACM的奇计淫巧_输入挂 ACM的奇计淫巧_扩栈C++/G++ ACM的奇计淫巧_bitset优化

  4. Number of Connected Components in an Undirected Graph -- LeetCode

    Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...

  5. 解决android模拟器连接本机服务器”Connection refused”问题

      在本机用模拟器连接 localhost 的服务器不成功,经查询是我反了一个小错误. android 模拟器其本身的localhost就是它自己的ip,而如果我要连接本机的localhost则需要将 ...

  6. UIPanGestureRecognizer判断滑动的方向

    .h文件 CGFloat const gestureMinimumTranslation = 20.0 ; typedef enum : NSInteger { kCameraMoveDirectio ...

  7. ubuntu安装KVM

    1. vmware安装ubuntu-14.04.1-server-amd64.iso.2. 安装完成后关机--右键虚拟机--setting--hardware--Processors--将 virtu ...

  8. php安装扩展步骤(redis)

    星哥让装一个扩展,解决PDF抓PNG的问题,功能没有实现,有点小悲伤,但是还是学到点东西的. php安装扩展步骤(以redis为例) 前提注意:在自己的LINUX本机上一定要安装有redis软件,我之 ...

  9. zoj 3430 Detect the Virus(AC自己主动机)

    题目连接:zoj 3430 Detect the Virus 题目大意:给定一个编码完的串,将每个字符相应着表的数值转换成6位二进制.然后以8为一个数值,又一次形成字符 串,推断给定询问串是否含有字符 ...

  10. mysql开发之join语句学习

    内连接:inner join -- 全外链接:full outer 左外连接:left outer 右外连接:right outer 交叉连接:cross内连接,两个表中重复部分全外连接,两个表所有字 ...