作者:文巧语 | 来源:互联网 | 2023-05-26 15:33
简而言之:为更高级别的"模型"对象包装OpenGL的缓冲区,着色器和/或矩阵的"首选"方法是什么?
我正在尝试用基于核心OpenGL 3.3的C++编写这个微小的图形引擎,我想实现一个尽可能干净的解决方案来包装更高级别的"模型"对象,该对象将包含其顶点缓冲区,全局位置/旋转,纹理(也可能是着色器?)和潜在的其他信息.
我已经研究过这个名为GamePlay3D的开源引擎,并不完全同意其解决这个问题的方方面面.是否有任何好的资源可以为现代OpenGL讨论这个主题?或者有一些简单而干净的方法来做到这一点?
1> Jerem..:
这很大程度上取决于您希望能够对您的引擎做什么.另请注意,这些概念与DirectX(或任何其他图形API)相同,因此不要过多关注OpenGL的搜索.以下是3D引擎中常见的几点(名称可能不同):
网格:
网格包含子网格,每个子网格包含一个顶点缓冲区和一个索引缓冲区.这个想法是每个子网格将使用不同的材质(例如,在角色的网格中,可能有一个身体的子网格和一个衣服的子网格.)
实例:
实例(或网格实例)引用网格,材质列表(网格中每个子网格一个),并包含"每个实例"着色器制服(世界矩阵等),通常分组在统一缓冲区中.
材料:(这部分根据发动机的复杂程度而变化很大).基本版本将包含一些纹理,一些渲染状态(混合状态,深度状态),着色器程序和一些所有实例共有的着色器制服(例如颜色,但也可能在实例中取决于什么你想做什么.)
更复杂的版本通常将传递中的材质(或者有时包含传递的技术)分开,其中包含前一段中的所有内容.您可以查看Ogre3D文档以获取更多信息,并查看一个可能的实现.还有一篇非常好的文章叫做GPU PRO 3中的Designing a Data-Driven Renderer,它描述了一个基于相同想法(但也更复杂)的更灵活的系统.
场景:(我把它称为场景,但它可以被称为任何东西).它提供了来自环境的着色器参数和纹理(光照值,环境贴图,这种东西).
我认为这是基础知识.考虑到这一点,如果您需要实现细节,您应该能够找到适合任何开源3D引擎代码的方法.