我已经使用OpenGL和C++进行了各种演示项目,但他们都涉及简单地渲染一个有一些有趣效果的单个立方体(或类似的简单网格)。对于这样的简单场景,立方体的顶点数据可以存储在不雅观的全局数组中。我现在正在研究渲染更复杂的场景,以及不同类型的多个对象。OpenGL和OOP程序结构
我觉得很有道理,为不同类型的对象(Rock
,Tree
,Character
等)的不同的类,但我不知道如何干净地打破了数据和场景中的对象渲染功能。每个类将存储它自己的顶点位置,纹理坐标,法线等数组。然而,我不确定在哪里放置OpenGL调用。我想我会有一个循环(在World
或Scene
类中)遍历场景中的所有对象并呈现它们。
应该渲染它们涉及调用每个对象中的渲染方法(Rock::render(), Tree::render(),...)
或将对象作为参数的单个渲染方法(render(Rock), render(Tree),...)
?后者看起来更清晰,因为我不会在每个类中都有重复的代码(尽管可以通过继承一个RenderableObject
类来缓解这个问题),并且如果我想稍后将端口转换为的DirectX。另一方面,我不确定是否可以将它们分开,因为无论如何,我可能都需要存储在对象中的OpenGL特定类型(例如,顶点缓冲区)。另外,将渲染功能与对象分开似乎有点麻烦,因为它必须调用大量的Get()
方法才能从对象中获取数据。最后,我不确定这个系统如何处理必须以不同方式绘制的对象(不同的着色器,不同的变量传递给着色器等)。
这些设计之一明显比其他设计更好吗?我可以通过哪些方式改进他们,以使我的代码组织良好并且高效?
谢谢,这给了我几个想法。我不太了解的一件事是可提供的类和你提到的网格类之间的区别。我不希望网格类是可以绘制自己的可渲染的吗?在更高层次上,我认为设计将比我预期的更复杂。你知道任何提供设计渲染系统的好介绍的在线资源吗?我找到的大多数OpenGL教程都介绍了绘制,纹理和点亮几个三角形的过程,而没有对大图片架构进行太多讨论。 – Jeff 2012-03-26 20:00:56
@Jeff:没有。网格只是顶点数据的集合。单独的网格*是不够的。为了渲染某些东西,你需要一个网格,你想要渲染的着色器,以及其他各种状态(纹理等)。 – 2012-03-27 00:37:52
@Jeff尼科尔说的是正确的。并非所有绘制的东西都是网格物体(例如,您可能还想绘制线条或其他像四边形网格物体可能会过度杀伤的其他原始物体)。一个网格类应该描述几何体(有时候每三层都有材料索引,分组/层次结构),但是没有其他的东西。看看有关游戏引擎开发的书籍(即使你没有制作游戏)。一个好的是“游戏引擎架构”,也是“游戏编程宝石”和“游戏引擎宝石”有很多很好的信息。您可能还想潜伏gamedev.net论坛 – 2012-03-27 01:26:04