您好游戏开发SE!
我正在通过OpenGL爬行,希望创建一个简单且非常轻便的游戏引擎。我认为该项目是一种学习经验,最终可能会赚点钱,但无论哪种方式都会很有趣。
到目前为止,我已经使用GLFW获得了一些基本的I / O,一个窗口(带有一个非常漂亮的F11全屏键)以及一个OpenGL上下文。我还使用GLEW公开了其余的OpenGL扩展,因为我正在使用Windows,并且我想使用所有OpenGL 3.0+。
这使我进入了场景图。简而言之,我想自己动手。这个决定是在看完OSG并阅读了几篇有关场景图的概念如何扭曲,弯曲和折断之后做出的。一篇这样的文章描述了场景图如何发展为...
然后,我们添加了所有这些额外的东西,例如将装饰品挂在圣诞树上,除了一些装饰品是多汁的牛排,还有一些是整头活牛。
打个比方,我想要牛排,场景图应该是什么样的肉,而不必捆成一堆多余的代码或任何整头母牛。
因此,考虑到这一点,我发现自己确实想知道场景图应该是什么以及应该如何实现简单的场景图?到目前为止,这就是我所拥有的...
一棵父树,n子树或DAG,其中...
- 应该跟踪游戏对象的转换(位置,旋转,比例)
- 应该保留渲染状态以进行优化
- 应该提供剔除视锥范围内的对象的方法
具有以下属性...
所有节点都应视为可渲染的(即使它们不渲染),这意味着它们...
- 应该都具有cull(),state()和draw()方法(如果不可见,则返回0)
- cull()递归地在所有子节点上调用cull(),从而为整个节点和所有子节点生成一个完整的cull网格。另一种方法hasChanged()可以使所谓的静态网格物体不必在每帧中都计算出其剔除几何形状。这将起作用,如果子树中的任何节点发生了更改,则所有几何结构都将重建到根。
渲染状态将保存在一个简单的枚举中,每个节点将从该枚举中选择所需的OpenGL状态集,并且将在该节点上调用draw()之前设置该状态。这样可以进行批处理,将将给定状态集的所有节点一起呈现,然后设置下一个状态集,依此类推。
任何节点都不应直接保存几何/着色器/纹理数据,而应指向共享对象(可能由诸如资源管理器之类的单例对象管理)。
场景图应该能够引用其他场景图(也许使用代理节点),以允许像的情况下此,因此允许复杂的多网眼模型/对象周围的场景图被复制而不增加一吨的数据。
我希望获得有关当前设计的一些有价值的反馈。是否缺少功能?有没有更好的方法/设计模式?我是否错过了一些更简单的3D游戏必须包含在此设计中的更大概念?等等。
谢谢,-Cody