gpt4 book ai didi

c++ - OpenGL概念题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:36 25 4
gpt4 key购买 nike

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

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

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

  3. 其他...?

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

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

最佳答案

首先您需要了解,OpenGL 实际上不理解术语“模型”,OpenGL 所看到的只是一串进入的顶点,并且取决于它使用这些流的当前模式在屏幕上绘制三角形的顶点数。

每个帧绘制迭代都遵循如下轮廓:

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

OpenGL 不记得上面发生了什么。有(是)一些工具,称为显示列表,但它们不能存储所有类型的命令——它们也被弃用并从最近的 OpenGL 版本中删除。即时模式命令 glBegin、glEnd、glVertex、glNormal 和 glTexCoord 也已被删除。

所以想法是将一些数据(纹理、顶点数组等)上传到 OpenGL 缓冲区对象中。然而,OpenGL 只直接将纹理理解为它们的本来面目(图像)。所有其他类型的缓冲区都需要您告诉 OpenGL 如何处理它们。这是通过调用 gl{Vertex,Color,TexCoord,Normal,Attrib}Pointer 来设置数据访问参数和 glDraw{Arrays,Elements} 来触发 OpenGL 来完成的要馈送到光栅器的顶点流。

关于c++ - OpenGL概念题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6982259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com