`
如沐春风的小妮
  • 浏览: 69765 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

opengl学习(四)-----绘制简单图形(二)

阅读更多
  上一周简简单单的讲了一下简单图形的绘制。按照所讲内容绘制一个20条边的多边形,那需要调用多少函数呢?至少22个。首先调用glBegin(),然后是20个顶点函数,最后调用一个glEnd()函数。再如果,要绘制一个立方体。一个立方体有6个面,一个面有四个顶点,也就是至少要定义26个函数。
    可是一个立方体按照数学里面的算法是只有8个顶点,如果按照我们绘制多边形的这种方式,每个顶点都指定了3次,才可以将所有的平面绘制完成形成一个立方体。
    好吧,我承认,我是要说,这显然,太~浪~费~了。OpenGL是不会这么无耻的允许这样浪费的事情存在的,所以大家不用纠结,继续往下看吧。
    OpenGL提供了顶点数组函数,允许只用少数几个数组指定大量的与顶点相关的数据,并用少量函数调用访问这些数据。
    使用顶点数组对几何图形进行渲染需要三个步骤:
   第一,启用数组。
  
引用
void glEnableClientState(GLenum array)
    指定了需要启用的数组。array参数可以使用下面这些符号常量:GL_VERTEY_ARRAY、GL_COLOR_ARRAY、GL_SECONDARY_COLOR_ARRAY、GL_INDEX_ARRAY、GL_NORMAL_ARRAY、GL_FOG_COORDINATE_ARRAY、GL_TEXTURE_COORD_ARRAY和GL_EDGE_FLAG_ARRAY

    第一个步骤是使用上面这个函数,激活选择的数组。例如激活顶点坐标数组就是glEnableClientState(GL_VERTEY_ARRAY)。
    有启用就用禁用,下面这个函数即为禁用函数。
  
引用
void glDisableClientState(GLenum array)
指定了需要禁用的数组。它接受的参数与glEnableClientState()函数相同。

    第二,指定数组的数据。
    共用8个不同的函数指定数组,每个函数用于指定一个不同类型的数组。
  
引用
void glVertexPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
    指定了需要访问的空间坐标数据。
    pointer:顶点坐标的内存地址;
    type:数组数据的类型(GL_SHORT、GL_INT、GL_FLOAT或GL+DOUBLE)。
    size:顶点的坐标数量,必须为2、3、4.
    stride:连续顶点之间的字节偏移量。如果为0,则表示顶点是相邻的。
    其它7个函数如下:
glColorPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
glIndexPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
glNormalPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
glFogCoordPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
glTexCoordPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
glEdgeFlagPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);

    附上一个小的例子:
static GLint vertices[] = {25, 25, 
                           100, 325, 
                           175, 25, 
                           175, 325, 
                           250, 25, 
                           325, 325};
static GLfloat colors[] = {1.0, 0.2, 0.2, 
                           0.2, 0.2, 1.0, 
                           0.8, 1.0, 2.0, 
                           0.75, 0.75, 0.75, 
                           0.35, 0.35, 0.35, 
                           0.5, 0.5, 0.5};
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(3, GL_FLOAT, 0, color);
glVertexPointer(2, GL_INT, 0, vertices);

   第三,解引用和渲染。
   解引用单个数组元素:
  
引用
void glArrayElement(GLint ith)
    获取当前所有已启用数组的一个顶点(第ith个)的数据。对于顶点坐标数组,对应的函数是glVertex[size][type]v(),其中size是【2,3,4】之一。type是[s,i,f,d]之一,size和type都是glVertexPointer()函数定义的。对于其他启动的数组,glArrayElement()分别调用那个glEndgFlagv()、glTexCoord[size[[type]v()、glColor[size][type]v()、glSecondaryColor3[type]v()、glInde[type]v()、glNoramal3[type]v()和glFogCoord[type]v()。如果启用了顶点坐标数组,在其他几个数组(如果启用)相对应的函数被执行之后,glVertex*v()函数在最后执行。

     举例说明:使用第二步骤时启用的顶点数组的第1,2,3顶点绘制一个三角形:
glBegin(GL_TRIANGLES);
glArrayElement(0);
glArrayElement(1);
glArrayElement(2);
glEnd();

    上面这段代码与下面的效果相同:
glBegin(GL_TRIANGLES);
glColor3fv(color);
glVertex2iv(vertices);
glColor3fv(color + (1*3));
glVertex2iv(vertices + (1*2));
glColor3fv(color + (2*3));
glVertex2iv(vertices + (2*2));
glEnd();

glArrayElement每个顶点还是调用一次,恩,不够简洁么。。再来看一个更简洁点儿的。
引用

void glDrawElements(GLenum mode, GLsize count, GLenum type, const GLvoid *indices);
    使用count个元素定义一个几何图元序列,这些元素的索引值保存在indices数组中。type是indices数组中数据的类型。mode参数指定了被创建的是哪种类型的图元。

还是以刚刚的例子继续替换吧,它的效果与刚刚的效果是一样的,还需要重复?需要,好吧。。自己copy去~~:
static GLubyte indices = {0, 1, 2};
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, indices);
分享到:
评论

相关推荐

    OpenGL快速查找手册-OpenGL-ES-2_0-Reference-card

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。OpenGL ES(Embedded Systems)是OpenGL的一个精简版本,专门设计用于嵌入式系统,如移动设备和游戏机。OpenGL ES...

    opengl学习代码-自用

    OpenGL是计算机图形学领域广泛应用的一种编程接口,它允许程序员创建复杂的3D图形和实时交互式可视化应用程序。这个“opengl学习代码-自用”压缩包很可能是为了帮助学习和理解OpenGL编程而准备的一系列示例代码。...

    OpenGL-intro-1.1.1 OpenGL-intro-1.1.1

    OpenGL 1.1.1是较早的版本,但它仍然是学习图形编程的重要起点。 OpenGL是一个低级API,这意味着它提供了对硬件的直接访问,允许开发者高效地绘制复杂的图像。其核心功能包括顶点处理、图元装配、光栅化以及颜色和...

    图形学 - OpenGL绘制简单图形程序2个

    在本主题中,我们将深入探讨两个使用OpenGL绘制简单图形的程序。 OpenGL的工作原理是通过向图形处理单元(GPU)发送指令来实现图形渲染。这些指令由OpenGL库封装,程序员可以通过调用相应的函数来执行。在开始编写...

    opengles3-book_opengl/计算机图像学/渲染_OpenGLES_

    《OpenGLES3-book》是关于...通过《OpenGLES3-book》,开发者可以深入学习这些概念,并掌握如何在实际项目中应用它们,创建出令人惊叹的移动图形应用。无论你是初学者还是经验丰富的开发者,这本书都将提供宝贵的指导。

    opengl学习-简单的图形绘制

    简单的图形绘制,相机

    android-openGL-canvas-master.zip

    通过学习和分析这个项目,开发者可以深入了解如何在 Android 应用中结合使用 OpenGL ES 和 Canvas,以实现高效且具有高度交互性的图形界面。同时,这也是提高图形编程能力,理解和实践现代移动设备上的图形渲染技术...

    code_opengl学习笔记3-1-在3D中绘制点

    OpenGL是计算机图形学中...通过阅读和理解代码,你可以更好地掌握OpenGL绘制点的基本技巧,并为后续学习OpenGL的其他图形元素如线段和多边形打下基础。在实践中,结合着这些知识点,你可以创建出丰富多彩的3D图形应用。

    OpenGL绘制图形(包含20多个基本例子)

    这个压缩包文件提供了一系列的基础教程,通过20多个实例,涵盖了从简单到复杂的图形绘制,包括直线、圆、椭圆、球体以及曲线和曲面等基本元素。 在OpenGL中,图形的绘制是通过向图形渲染管线发送指令来完成的。首先...

    OpenGL入门学习之二——绘制几何图形.pdf

    ### OpenGL入门学习之二——绘制几何图形:详细解析 #### 一、理解点、直线与多边形在OpenGL中的表现 在计算机图形学领域,尤其是OpenGL框架中,几何图形的基本构建块包括点、直线和多边形。这些概念在数学理论与...

    opengl-test-01-visualstudio

    5. **OpenGL绘图**:使用OpenGL的函数绘制图形。例如,`glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);`清除颜色和深度缓冲,`glBegin()`和`glEnd()`定义顶点序列,`glColor3f()`指定颜色,`glVertex3f()`...

    code__opengl学习笔记2-绘制矩形

    本学习笔记主要关注如何使用OpenGL绘制矩形,这是一个基础但至关重要的概念,因为几乎所有的图形绘制都可以通过组合基本形状如矩形来实现。 在OpenGL中,没有内置的“绘制矩形”函数。相反,我们通常使用四条直线...

    Qt OpenGL+Graphics-View

    OpenGL是一个开放标准的图形库,它允许开发者直接控制显卡进行高性能的图形绘制。Qt通过QOpenGLWidget类提供对OpenGL的支持,使得开发者可以方便地在Qt应用中集成OpenGL的功能。QOpenGLWidget是一个可重绘的窗口部件...

    OpenGL基本图形绘制

    示例代码展示了如何使用OpenGL绘制不同的图形。例如,`myDisplay`函数是一个OpenGL的回调函数,用于绘制窗口中的内容。在这个函数中,使用了`glClear`来清除颜色缓冲区,`glBegin`和`glEnd`用来定义图形的顶点序列,...

    OpenGL 作图例子 - 圆环

    这个"OpenGL 作图例子 - 圆环"很可能是为了教授如何使用OpenGL绘制圆环,这对于游戏开发、科学可视化、应用程序界面设计等领域非常重要。下面我们将深入探讨OpenGL的基本概念以及如何在实际中绘制圆环。 OpenGL是一...

    用OpenGL绘制的二维动物

    在这个特定的项目中,"用OpenGL绘制的二维动物"展示了如何利用OpenGL在Visual Studio 2010环境下创建一个交互式的二维图形应用。这个应用的核心是绘制一个二维小猪图形,并通过鼠标和键盘操作来改变它的位置。 首先...

    27.OpenGL入门及绘制基本图形(一)1

    3. OpenGL绘制多个图形 通过多次调用glBegin()和glEnd(),可以绘制多个图形。在每次调用之间,可以改变颜色、线宽等属性,以区别不同的图形。 4. OpenGL绘图代码及原理详解 OpenGL的绘图过程是基于命令流的,开发者...

    openGL大作业---机器人

    OpenGL是一项强大的图形编程接口,广泛应用于游戏开发、科学可视化、工程设计等领域。在这个"OpenGL大作业---机器人"项目中,我们可以推断出一系列关键的知识点,涵盖了计算机图形学和OpenGL编程的基本概念和技术。 ...

    OPengl画图--点,线,多边形

    OpenGL是计算机图形学...通过学习如何绘制点、线和多边形,以及理解裁剪和其他图形特性,你可以创建出丰富多彩的视觉效果。在MFCOpenGL项目中,你将有机会实践这些知识,将理论与实际编程相结合,进一步提升你的技能。

    OpenGL----动态球体---源代码

    OpenGL是一种强大的图形编程库,广泛应用于游戏开发、科学可视化、工程设计等领域。在这个"OpenGL动态球体源代码"中,我们可以深入理解如何使用OpenGL来创建并动态显示一个3D球体,以及如何实现物体的旋转效果。以下...

Global site tag (gtag.js) - Google Analytics