OpenGL绘制方式

什么是图元:图元是组成3D物体的基础单元,是顶点的集合以预定义的方式结合在一起。而预定义的方式可以是一维的点,二维的线,甚至是三维的多边形等。 基础的图元类型可以直接被图形硬件进行光栅化操作,常见的基础图元类型如图所示:

图元 描述
GL_POINTS 每个顶点在屏幕上都是单独点
GL_LINE 每一对顶点定义一个线段
GL_LINE_STRIP 一个从第一个顶点一次经过每一个后续顶点而绘制的线条
GL_LINE_LOOP 和GL_LINE_STRIP相同,但是最后一个顶点和第一个顶点连接起来了
GL_TRIANGLES 每3个顶点定义一个新的三角形
GL_TROANGLES_STRIP 共用一个条带(strip)上的顶点的一组三角形
GL_TRIANGLE_FAN 以一个圆点为中心呈扇形排列,共用相邻顶点的一组三角形

在这里插入图片描述
除了基础图元类型,还有几何着色器中的临接图元以及细分着色器中的Patch图元,但是这些图元不能直接被图形硬件光栅化。

绘制点:点的图元为GL_POINTS呈正方形状,不受透视除法影响(也就是不近大远小)。点的大小都会自动修正成允许的间距和范围内的值。常用接口如下:
1.void glPointSize(GLfloat size):设置默认点大小。当开启GL_PROGRAM_POINT_SIZE时,就会以着色器中的gl_PointSize属性值进行设置。

2.void glGetFloatv(GLenum pname, GLfloat* data):获取点的指定属性值。
pname表示点的属性。当为GL_POINT_SIZE_RANGE表示点的最小和最大值。当为GL_POINT_SIZE_GRANULARITY时表示相邻点之间的最小间距。
data表示点的指定属性的数值。
绘制线:两点组合成一条线。图元类型如下:

  1. 线:图元为GL_LINES。是任意两个点组成的一条线。
  2. 线段:图元为GL_LINE_STRIP。是任意一个点可以作为起点和终点,这样一个点就要绘制两次,性能相对绘制线而言会低一些,但是绘制的线是连续的。
  3. 线环:图元为GL_LINE_LOOP。是在线段的基础上记录一下起点,当线段绘制完毕后就从终点到起点之间再绘制一条线,这样就将所有点绘制一条闭合的环。

常用接口如下:

  1. void glLineWidth(GLfloat width):设置线宽,宽度值为width大小。

绘制三角形:三点组合成一个三角形。图元类型如下:

  1. 三角形:图元为GL_TRIANGLE。三角形是OpenGL唯一支持的多边形,也是光栅化硬件最喜欢的多边形。
  2. 三角形带:图元为GL_TRIANGLE_STRIP。是一串相连的三角形。由于只需绘制第一个三角形,其他三角形只需要指定一个顶点,从而可以节省大量时间开销。
  3. 三角形环:图元为GL_TRIANGLE_FAN。是一组围绕同一个中心顶点相连的三角形。跟三角形带一样,由于绘制的顶点数变少,从而可以节省大量时间开销。

常用绘制多边形接口如下:

  1. void glFrontFace(GLenum mode):控制多边形正面的判断方式。
    mode表示正面模式。当为GL_CW表示指定顺时针方向环绕的多边形是正面;当为GL_CCW表示指定逆时针方向环绕的多边形是正面,这也是默认设置方式。
  2. void glCullFace(GLenum mode):裁剪多边形的指定面。需要开启GL_CULL_FACE才能使用。
    mode表示指定面类型。通常是正面(GL_FRONT),背面(GL_BACK)以及正反面(GL_FRONT_AND_BACK)中的一种。
  3. void glPolygonMode(GLenum face, GLenum mode):按照指定面和指定模式来绘制多边形。
    face通常可以取正面(GL_FRONT),背面(GL_BACK)以及正反面(GL_FRONT_AND_BACK)的一种。
    mode通常可以取线(GL_LINE),点(GL_POINT)以及实心填充(GL_FILL)中的一种。
  4. void glPolygonOffset(GLfloat factor, GLfloat uints):多边形偏移函数。通常用在同一个像素上存在相同深度值时,为了让深度测试针对相同值的像素进行正确的绘制,就需要对指定像素的深度值进行偏移了。

OpenGL着色器:由于篇幅较多,已经额外写了篇博客来阐述。详情参照
opengl着色器基础

OpenGL缓存数据:也叫做OpenGL缓存对象。是用来为着色器成员变量准备数据用的缓存区域对象。常用的接口如下:

  1. void glCreateBuffers(GLsizei n, GLuint* buffers):创建指定个数的缓存对象。
    n表示需要创建的缓存对象个数。
    buffers表示返回创建的缓存对象索引标志数组。
  2. void glDeleteBuffers(GLsizei n, const GLuint* buffers):回收指定个数的缓存对象。参数同glCreateBuffers。
  3. void glBindBuffer(GLenum target, GLuint buffer):绑定指定索引的缓存对象到指定的缓存目标点上。
    target表示缓存目标点。通常是GL_ARRAY_BUFFER(顶点缓存对象VBO),GL_ELEMENT_ARRAY_BUFFER(索引缓存对象EBO或者IBO),GL_UNIFORM_BUFFER ,GL_TEXTURE_BUFFER 等当中的一种。当为0时表示解绑指定缓存目标关联的缓存对象,当EBO存储在VAO(后面会讲解)中时,不能主动的解绑EBO,否则VAO中的EBO将会不存在,访问VAO中的EBO数据时会报错。此时只能在渲染结束后通过glDeleteBuffers来回收EBO。
    buffer表示缓存对象索引。
  4. void glNamedBufferStorage(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags):为缓存对象分配指定大小内存空间并初始化。
    buffer表示缓存对象标志。
    size表示缓存对象内存大小。
    data表示缓存对象初始化内容。
    flags表示缓存用途标识符。通常是GL_DYNAMIC_STORAGE_BIT,GL_MAP_READ_BIT,GL_MAP_WRITE_BIT等当中的一种。
  5. void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data):使用新的应用程序内存数据来替换用途为GL_DYNAMIC_STORAGE_BIT的缓存对象中的部分数据。
    buffer表示缓存对象标志。
    offset表示缓存对象的起始位置。
    size表示指定字节大小。
    data表示指定的新数据。
  6. void glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage):将数据填充到缓存类型关联的缓存对象中。
    target表示缓存目标类型。
    size传输数据的大小。
    data表示传输的实际数据。
    usage表示显卡管理数据类型。通常是GL_STATIC_DRAW (数据不会或几乎不会改变),GL_DYNAMIC_DRAW(数据会被改变很多),GL_STREAM_DRAW (数据每次绘制时都会改变)中的一种。
    内存分配和更新代码如下所示:
	// 顶点位置
    static const GLfloat vertex_positions[] =
    {
   
        -1.0f, -1.0f,  0.0f, 1.0f,
         1.0f, -1.0f,  0.0f, 1.0f,
        -1.0f,  1.0f,  0.0f, 1.0f,
        -1.0f, 
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值