严格来说,矩形并不是OpenGLES的图元。但是,让我们面对现实吧,绘制这些矩形就像绘制三角形一样简单。在本教程中,我们会将基本的三角形绘制代码转换为绘制矩形。同样,这些渲染是静止的,但我们通过平移(即移动它们)使它们快速移动。当然,一旦我们完成了矩形,我们将尝试做一个立方体,我们将做一个纹理贴图的立方体。本教程和其他教程的快速总结在上一个教程中,我们使用了一个空白画布XCode项目来渲染一个纯白色三角形。为此,您创建一个顶点数组,将此数据告诉OpenGL并使用glVertexPointer()对其进行格式化。定义一个状态来渲染这个顶点数组,并使用glDrawArrays()来渲染它。今天,我们将使用前面的代码以与制作三角形相同的方式制作矩形。为此,我们只需修改一对(组)代码即可。***点很明显,我们需要4个点来组成一个矩形,而不是原来的3点三角形。然后,我们需要告诉OpenGL使用不同的glDrawArrays()。绘制不同对象的方法。开始吧。定义矩形的顶点打开上一教程创建的XCode工程,找到drawView函数。注释掉triangleVertices,但不是删除,而是后面转换的时候需要用到,添加如下代码:constGLfloatsquareVertices[]={-1.0,1.0,-6.0,//Topleft-1.0,-1.0,-6.0,//Bottomleft1.0,-1.0,-6.0,//Bottomright1.0,1.0,-6.0//Topright};这定义了我们的矩形。注意这个矩形的顶点也是逆时针的。然后,转到下面绘制三角形的代码,将这些代码注释掉,回到起始状态。所以注释掉glVertexArray()、glEnableClientState()和glDrawArrays()这三个函数调用,添加如下代码:glVertexPointer(3,GL_FLOAT,0,squareVertices);glEnableClientState(GL_VERTEX_ARRAY);glDrawArrays(GL_TRIANGLE_FAN,0,4);这三个功能相同,功能略有不同。glVertexPointer(3,GL_FLOAT,0,squareVertices);这里唯一的变化是我们告诉OpenGL使用与当前三角形不同的顶点设置。glEnableClientState()还告诉OpenGL从顶点数组(而不是颜色数组或其他)绘制glDrawArrays(GL_TRIANGLE_FAN,0,4);这里发生了一些变化。在上一个教程中,我们使用了GL_TRIANGLES作为第一个参数,而在第三个参数中使用了3。第二个参数。之前是0,这里还是0,因为只包括矩形的顶点。第一个参数是绘图模式,您现在可以看到两种可能的OpenGL绘图方法。我想花时间讨论当今可用的不同绘图模式。它们是:GL_POINTSGL_LINESGL_LINE_LOOPGL_LINE_STRIPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN我们还没有讨论点或线,所以我只介绍最好的三个。在开始之前,我想提醒你,顶点数组可能包含多个三角形,所以当你只看到一个对象顶点数组时,你需要知道它不仅限于此。GL_TRIANGLES-这个参数意味着OpenGL使用三个顶点来组成形状。因此,对于前三个顶点,我们将使用顶点1、顶点2和顶点3来形成一个三角形。完成后,使用下一组三个顶点形成三角形,直到数组结束。GL_TRIANGLE_STRIP-OpenGL使用前两个顶点开始,然后遍历每个顶点,这将使用前2个顶点一起形成一个三角形。所以squareVertices[6~8]会和squareVerticies[0~2]和squareVerticies[3~5]组成一个三角形。squareVertices[9~11]将生成具有squareVertices[3~5]和squareVertices[6~8]的三角形。也就是说,0、1、2这三个点组成一个三角形,1、2、3这三个点也组成一个三角形。注意squareVerticies[0~2]的意思是:squareVerticies[0]x坐标squareVerticies[1]y坐标squareVerticies[2]z坐标如果我没说清楚,我就用下面的例子来说明。GL_TRIANGLE_FAN-在跳过前2个顶点,然后遍历每个顶点后,让OpenGL用这些顶点、前一个顶点和数组的第一个顶点形成一个三角形。squareVertices[6~8]将生成一个带有squareVerticies[3~5](前一个)和squareVerticies[0~2](第一个)的三角形。也就是说,同样是四个顶点0、1、2、3。在STRIP状态下,有两个三角形,0、1、2;1,2,3.在FAN状态下,有两个三角形,2,1,0;3,2,0。这次我们将使用GL_TRIANGLE_FAN,我们将在显示区域中得到一个矩形。单击“Build&Go”,然后您将在屏幕上看到一个白色矩形(平面),回头看您的顶点数组。试着想象用三角形画出一个矩形。OpenGL就是这样做的。三角点1:squareVerticies[0~2]——矩形的左上三角点2:squareVerticies[3~5]——矩形的左下三角点3:squareVerticies[6~8]——矩形的右下角rectangle考虑到以上3点,一个三角形的OpenGL绘制会占到左下角的一半面积。想象一个矩形按对角线分为左上角和右下角。如何通知这两个三角形?OpenGL刚刚只绘制了矩形的左半部分。三角点1:squareVerticies[9~11]-矩形右上角三角点2:squareVerticies[6~8]-右下角,矩形上点三角点3:squareVerticies[0~2]-矩形左上角rectangle,***point只是使用了一个新的点,OpenGL可以渲染这个三角形来完成矩形。GL_TRIANGLE_STRIP返回代码,将glDrawArrays()的第一个参数从GL_TRIANGLE_FAN更改为GL_TRIANGLE_STRIP:。单击“Build&Go”,您将得到下图。让我们看看为什么我们刚刚更改绘制模式时没有得到矩形。OpenGL显示我们的顶点数组如下:三角点1:squareVerticies[0~2]-矩形的左上三角点2:squareVerticies[3~5]-矩形的左下三角点3:squareVerticies[6~8]-矩形的右侧NextOpenGL使用前3个点来渲染三角形。这个左下角的三角形和以前一样。三角点1:squareVerticies[9~11]-矩形右上角三角点2:squareVerticies[6~8]-右下角,矩形上点三角点3:squareVerticies[3~5]-左下角,上角2个矩形点这是现在渲染三角形的3个点。这个三角形和我们理想的三角形有90度的夹角。如果我们提供不同的顶点数组,我们可以实现正确的GL_TRIANGLE_STRIP,我们现在仍然执行GL_TRIANGLE_FAN。一定要记住,你的绘制模式一定要和你的顶点数组保持一致,否则会出现奇怪的效果,就像我们刚才修改的一样。如果你坚持使用GL_TRIANGLE_STRIP,你只需要修改你的顶点数组如下:constGLfloatstripSquare[]={-1.0,-1.0,-6.0,//bottomleft1.0,-1.0,-6.0,//bottomright-1.0,1.0,-6.0,//左上1.0,1.0,-6.0//右上};所以,通过上面的例子,我们可以看到第一个三角形会形成前三个顶点,得到一个如下的三角形:左上工作(P3)和右下第二个前顶点(P2)。新顶点以橙色、绿色和红色显示如下:事实证明,无论哪种方式都可以生成一个矩形。最终结果是一样的。但是这些提醒我们要注意让你的顶点数组和你的绘图模式保持一致。***。..现在,您知道了如何生成三角形和矩形。我的演示文稿不包括点和线,因为它们更简单。在下一个教程中,我们将添加一些颜色。一旦我们可以为我们的对象着色,我们就可以移动它们并在3d中对它们进行纹理贴图。虽然,它不会像Doom3那样酷。但是你知道,你可以开始在3d中构建对象,我将开始包括3d世界的知识。原文位置:http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/Entries/2009/3/28_OpenGL_ES_02_-_Drawing_Primitives_2_-_Squares.html
