opengl--重新开始--03

顶点数组


OpenGL提供了一些顶点数组函数 允许只用少数几个数组指定大量的与顶点相关的数据,并用少量函数调用访问这些数据。


使用顶点数组对几何图形进行渲染需要3个步骤

1) 激活最多可达8个数组,每个数组用于存储不同类型的数据:顶点坐标 表面法线 RGBA颜色 辅助颜色 颜色索引 雾坐标 纹理坐标 及多边形的边界标志
2)把数据放入数组中
3)用这些数据绘制几何图形


另一种常用的数据组织形式------混合顶点数组数据。把不同类型的数据混合放在同一个数组中
1)启用数组-glEnableClientState:GL_VERTEX_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
2)指定数组的数据
   glVertexPointer(GLint size,GLenum type, GLsizei siride,const GLvoid *pointer) 
   glSecondaryColorPointer 
   glColorPointer
   glNormalPointer
   glFogCoordPointer
   glTexCoordPointer
   glEdgeFlagPointer

   glIndexPointer


3)解引用和渲染   


解引用
:即提取指针所指向的数据
解引用单个数组元素: void glArrayElement(GLint ith)
获取当前所有一起用数组的一个顶点的数据-----对于每个顶点只调用1次。会提高程序总体性能----对于随机存取的数据的数组是非常有效的,与之类似的
会采用更有序的方式对数据数组进行随机存取-----通常是在glBegin glEnd之间使用

glDrawElements (GLenum mode,GLsizei count,GLenum type,const GLvoid*indices);count个元素定义一个几何图元序列,元素索引值保存在indices数组中,type:GL_UNSIGNED_BYTE/GL_UNSIGNED_SHORT/GL_UNSIGNED_INT
mode:GL_POLYGON/GL_LINE_LOOP/GL_LINES等
glMultiDrawElements (...)---多个调用glDrawElements合并为1个glMultiDrawElement
static GLubyte oneIndices[]={1,2,3};
static GLubyte twoIndices[]={1,2};
static GLsizei count[]={3,2};
static GLvoid* indices[2]={oneIndices,twoIndices};
glMultiDrawElements(GL_LINE_STRIP,count,GL_UNSIGNED_BYTE,indices,2);


glArrayElements ()  glDrawElements ()  glDrawRangeElements  都能够对数据数组进行随机存取
但是glDrawArrays只能按顺序访问他们


glDrawElements(...)不放在glBegin 和 glEnd



缓冲区操作


opengl1.5版本增加了缓冲区对象,允许应用程序显式的指定把哪些数据存储在图形服务器上
1)创建缓冲区对象
glGenBuffers(GLsizei n, GLuint*buffers):创建缓冲区对象 在buffer是数组中返回n个当前未使用的名称,表示缓冲区对象。
glIsBuffer(GLuint buffer):判断一个标识符是否是一个当前被使用的缓冲区对象的标识符
2)激活缓冲区对象
首先需要绑定 glBindBuffer(GLenum target,Gluint buffer):用于初始化缓冲区对象以及它的数据
target:
GL_ARRAY_BUFFER:顶点数据
        GL_ELEMENT_ARRAY_BUFFER:索引数据
        GL_PIXEL_PACK_BUFFER:从opengl获取的像素数据
        GL_PIXEL_UNPACK_BUFFER:传递给opengl的像素数据
        GL_COPY_READ_BUFFER/GL_COPY_WRITE_BUFFER:缓冲区之间复制数据
        GL_TRANSFORM_FEEDBACK_BUFFER:表示执行一个变换反馈着色器的结果
        GL_UNIFORM_BUFFER:同意变量值
        GL_TEXTURE_BUFFER:作为纹理缓冲区存储的纹理数据
buffer:当是首次使用的非0整数时,就创建一个新的缓冲区对象,当是以前创建的缓冲区对象的话就成为了活动的缓冲区对象,当是0时就停止使用缓冲区对象了
3)数据分配和初始化缓冲区对象
glBufferData(GLenum target, Glsizeiptr size, const GLvoid* data,GLenum usage)
分配size个存储单位的opengl服务器内存,用于存储顶点数据或索引
usage:提示,就是数据在分配之后如何进行读取和写入
      GL_STREAM_DRAW:数据只指定1次,并且最多只有几次作为绘图和图像指定函数的源数据  
      GL_STREAM_READ:数据冲opengl缓冲区复制而来,最多只有几次由应用程序作为数据值使用 
      GL_STREAM_COPY:数据冲opengl缓冲区复制而来,最多只有几次作为绘图和图像指定函数的源数据 
      GL_STATIC_DRAW:数据只指定一次,可多次作为绘图和图像指定函数的源数据 
      GL_STATIC_READ / GL_STATIC_COPY:数据冲opengl缓冲区复制而来,可多次有应用程序使用/作为绘图和图像指定函数的源数据 
      GL_DYNAMIC_DRAW :数据多次指定,多次作为绘图和图像指定函数的源数据
      GL_DYNAMIC_READ/GL_DYNAMIC_COPY:数据冲可多次从opengl缓冲区复制而来,并多次作为应用程序数据值使用/作为绘图和图像指定函数的源数据 
 
   根据usage的参数指定的值,OpenGL可能会对数据进行优化,进一步提高性能。


缓冲区数据可以进行3中操作 1)绘图 2)读取 3)复制
根据数据更新的频率,有几种不同的操作提示描述了数据的读取频率或在渲染中使用的频率:
流模式:缓冲区对象中的数据常常需要更新,但是在绘图或其他操作中使用这些数据的次数较少
静态模式:缓冲区对象中的数据只指定1次,但是这些数据被使用的频率很高
动态模式:缓冲区对象中的数据不仅需要进行更新,而且使用频率也非常高


4)更新缓冲区对象的数据值
void glBufferSubData(GLenum target, GLintprt offset,GLsizeiptr size, const GLvoid* data)
会用我们提供的数据替换被绑定的缓冲区对象的一些数据子集
GLvoid* glMapBuffer(GLenum target,GLenum access)
可以更灵活的选择需要更新的数据,
返回:一个指定缓冲区对象的指针,可以在这个缓冲区对象写入新值,完成了缓冲区对象的数据更新后可以调用
GLboolean glUnmapBuffer(GLenum target):表示已完成了对数据的更新
如果只需要更新缓冲区中相对较少的值,使用
GLvoid* glMapBufferRange(GLenum target,GLintptr offset, GLsizeiptr length, GLbitfield access)效率更高
acess:是GL_MAP_READ_BIT/GL_MAP_WRITE_BIT的一个位掩码组合,表示客户端可以对数据进行的操作,也可以是GL_MAP_INVALIDATE_RANGE_BIT
       GL_MAP_INVALIDDATE_BUFFER_BIT/GL_MAP_FLUSH_EXPLICIT_BIT、GL_MAP_UNSYNCHRONIZED_BIT
       这个标志描述了在映射之前Opengl服务器需要如何保存缓冲区原有的数据
GLvoid glFlushMappedBufferRange(GLenum target,GLintptr offset, GLsizeiptr length)
表示一个缓冲区范围中的值已经修改


5)缓冲区对象之间复制对象
 void glCopyBufferSubData(GLenum readbuffer,GLenum writebuffer,GLintptr readoffset,GLinitptr writeoffset,GLsizeiptr size)
数据从readbuffer相关联的缓冲区对象复制到绑定到writebuffer的缓冲区对象


6)清除缓冲区对象
glDelegateBuffers(GLsizei n, const GLuint *buffers)


顶点数组对象:绑定调用集合
void glGenVertexArrays(GLsizei n,GLuint *arrays):返回n个未使用的名字。用数组arrays接收
GLvoid gBindVertexArray(GLuint array):绑定激活缓冲顶点数组对象
void glDeleteVertexArrays(GLsizei n, GLuint *arrays):删除arrays中指定的n个顶点数组对象


7)属性组:opengl将相关的状态变量进行归组 大约有20个不同的属性组,都可以通过glPushAttrib()和glPopAttrib()进行保存和恢复
GL_ACCUM_BUFFER_BIT  :累积缓冲区
GL_COLOR_BUFFER_BIT:颜色缓冲区
GL_CURRENT_BIT:当前
GL_DEPTH_BUFFER_BIT:深度缓冲区
GL_ENABLE_BIT:启用
GL_EVAL_BIT:求值
GL_FOG_BIT:雾
GL_HINT_BIT:提示
GL_LIGHTING_BIT:光照
GL_LINE_BIT:直线
GL_SCISSOR_BIT:裁剪
GL_TEXTURE_BIT:纹理
。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值