3.绘制

[TOC]

图元

OpenGL支持多种图元,但都可归结为点、线、三角形中的一种。

glPointSize

点精灵

线、条带、循环线

  • 循环线(line loop)首尾相接
  • 条带线 line strip 没有首位闭合

diamond exit

三角形、条带、扇面

TODO 光照对三角形的影响

OpenGL图元模式标识

  • GL_POINTS

  • GL_LINES

    • 将传入的坐标作为单独线条绘制,ABCDEFG六个顶点,绘制AB、CD、EF三条线
  • GL_LINE_LOOP

    • 循环线
    • 将传入的顶点作为闭合折线绘制,ABCD四个顶点,绘制AB、BC、CD、DA四条线。
  • GL_LINE_STRIP

    • 条带线
    • 将传入的顶点作为折线绘制,ABCD四个顶点,绘制AB、BC、CD三条线
  • GL_TRIANGLES

    • 将传入的顶点作为单独的三角形绘制,ABCDEF绘制ABC,DEF两个三角形
  • GL_TRIANGLE_STRIP

    • 三角形条带
    • 将传入的顶点作为三角条带绘制,ABCDEF绘制ABC,BCD,CDE,DEF四个三角形
  • GL_TRIANGLE_FAN

    • 三角形扇面
    • 将传入的顶点作为扇面绘制,ABCDEF绘制ABC、ACD、ADE、AEF四个三角形

多边形正反面

TODO

glPolygonMode

glFrontFace

OpenGL缓存数据

创建分配缓存

glCreateBuffers(GLsizei n, GLuinit* buffers)




glBindBuffer(GLenum target, GLuint buffer)

向缓存输入和输出数据

void glNamedBufferStorage(GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);

glNamedBufferSubData

glClearNamedBufferData

glCopyNamedBufferSubData

glGetNamedBufferSubData

  • GL_BYNAMIC_STORAGE_BIT
  • GL_MAP_READ_BIT
  • GL_MAP_WRITE_BIT
  • GL_MAP_PERSIISTENT_BIT
  • GL_MAP_COHERENT_BIT

读取、访问、丢弃缓存数据

TODO

顶点规范

glVertexAttribPointer

glVertexAttribPointer数据类型标识符

  • GL_BYTE
  • GL_UNSIGNED_BYTE
  • GL_SHORT
  • GL_UNSIGNED_SHORT
  • GL_INT
  • GL_UNSIGNED_INT
  • GL_FIXED
  • GL_FLOAT
  • GL_HALF_FLOAT
  • GL_DOUBLE
  • GL_INT_2_10_10_10_REV
  • GL_UNSIGNED_INT_2_10_10_10_REV

如果type传入了GL_SHORT等整数类型,OpenGL将这这些数据类型存储到缓存对象中,OpenGL必须将这些数据转换换为浮点数才能将它们读取到浮点数的顶点属性中。

如果normalize为GL_FALSE,整数直接被强制转换为浮点数,然后再传入到顶点着色器中,如果是GL_TURE将进行归一化

  • normalize为GL_FALSE
    • 着色器传入的是4.0
  • normalize为GL_TURE
    • 数据类型是有符号的
      • f = c / (2b - 1)
    • 数据类型是无符号的
      • f = (2c + 1 )/ (2b + 1 )
    • f 浮点数值, c 整数分量 b 数据类型 位数 GL_UNSIGNED_BYTE就是8

整数4置入缓存,type为GL_INT

f = 4 / (232 - 1) = 0.000000009313

整型顶点属性

glVertexAttribIPointer

双精度顶点属性

glVertexAttribLPointer

顶点属性的压缩数据格式

size GL_BGRA

GL_INT_2_10_10_10_REV

2 10 10 10
w x y z

静态顶点属性

TODO

绘制命令

  • 索引模式
  • 非索引模式

图元重启动

TODO

多实例渲染

TODO