OpenGL概念问题

the*_*rce 4 c++ opengl winapi

我刚刚在Win32 C++中开始使用OpenGL编程,所以对我来说不要太难:)我现在一直在徘徊NeHe教程和"红皮书",但我很困惑.到目前为止,我已经能够设置一个OpenGL窗口,绘制一些三角形等,没问题.但是现在我想建立一个模型并从不同角度查看它.我们也是:

  1. 将模型加载到内存中(在堆上的结构中保存三角形/四边形坐标),在每个场景渲染中,我们使用所有东西绘制到屏幕上glVertex3f,依此类推.

  2. 使用glVertex3f等加载/绘制模型一次,我们只需更改每个场景中的查看位置即可.

  3. 其他...?

在我看来,从我到目前为止阅读的所有内容来看,选项1是最合理的,但它似乎有点呃......愚蠢!我们必须决定哪些对象是可见的,并且只绘制那些对象.这不是很慢吗?选项2可能看起来更有吸引力:)

编辑:感谢所有帮助,我决定做的事:从文件中读取我的模型,然后将其加载到使用GPU的内存glBufferData,然后使用数据反馈到渲染功能glVertexPointerglDrawArrays.

dat*_*olf 7

首先你需要了解的是,OpenGL实际上并不理解术语"模型",所有OpenGL看到的都是一个顶点流,并且根据当前模式,它使用这些顶点流将三角形绘制到屏幕上.

每个框架绘制迭代遵循一些这样的轮廓:

  • 清除所有缓冲区
  • 对于每个窗口元素(主场景,HUD,小地图等):
    • 设置剪刀和视口
    • 条件清晰的深度和/或模板
    • 设置投影矩阵
    • 为初始视图设置模型视图矩阵
    • 对于每个型号
      • 将模型转换应用于矩阵堆栈
      • 绑定模型数据(纹理,顶点等)
      • 发出模型绘图命令
  • 交换缓冲区

OpenGL不记得那里发生了什么.有一些设施,称为显示列表,但它们无法存储所有类型的命令 - 它们也被弃用并从最近的OpenGL版本中删除.立即模式命令glBegin,glEnd,glVertex,glNormal和glTexCoord也已被删除.

因此,我们的想法是将一些数据(纹理,顶点数组等)上传到OpenGL缓冲区对象中.但是,只有纹理才能被OpenGL直接理解为它们(图像).所有其他类型的缓冲区都要求您告诉OpenGL如何处理它们.这是通过调用 gl {Vertex,Color,TexCoord,Normal,Attrib}指针来设置数据访问参数和glDraw {Arrays,Elements}来触发OpenGL获取要提供给光栅化器的顶点流来完成的.