OpenGL概念问题

时间:2011-08-08 12:39:36

标签: c++ winapi opengl

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

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

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

  3. 其他...?

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

    编辑:感谢所有帮助,我决定这样做:从文件中读取我的模型,然后使用glBufferData将其加载到GPU内存中,然后使用{{1将数据提供给渲染函数}和glVertexPointer

2 个答案:

答案 0 :(得分:7)

首先你需要了解的是,OpenGL实际上并不理解术语“model”,所有OpenGL看到的都是一个顶点流并且取决于它使用这些流的当前模式顶点将三角形绘制到屏幕上。

每一帧绘制迭代都遵循以下概述:

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

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

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

答案 1 :(得分:4)

您应该将数据上传到GPU内存一次,然后使用尽可能少的命令绘制每个帧。

以前,这是使用显示列表完成的。如今,它都是关于顶点缓冲对象(a.k.a.VMO)的所有内容,所以请看一下。

这是关于VBO的a tutorial,在它们只是一个扩展之前编写,而不是OpenGL的核心部分。