首先,如果使用OpenGL而不是DirectX,魔兽世界会有不同的外观吗?如果使用OpenGL呈现,性能是否会有显着差异?
其次,在创建游戏时的主要过程是什么,特别是在使用Maya或3DS Max中创建模型方面?是先创建模型,然后将模型导出为可读取的OpenGL / DirectX代码,并导出所有着色器程序,所有顶点和三角形都在代码中创建,最后在C ++ / c程序中使用代码?
总的来说,我想知道视频游戏设计师/程序员如何将实际的3DS MAX / Maya模型导入到他们的代码中。
首先,如果使用OpenGL而非DirectX进行渲染,那么《魔兽世界》是否会有所不同?如果使用OpenGL进行渲染,性能会有显著的不同吗?
OpenGL和Direct3D遵循类似的原则:一系列顶点进入,经过变换(固定功能或顶点着色器),变换后的顶点被分组成基元(点、线、三角形),并进行栅格化。即为每个像素计算覆盖该基元的计算(再次通过固定功能或自由可编程片段着色器执行)以确定所谓的“片段”颜色。最后,对片段进行可见性测试,并混合到正在绘制的图像中。
OpenGL和DirectX的后续版本添加了几何和镶嵌阶段,但这些只是细节。
在所有其他方面,它们的工作方式如此相似,以至于渲染结果几乎没有区别,除了由不同剪裁空间映射引入的顶点位置的舍入误差。
不!模型及其辅助数据与代码分别存储。虽然在代码中存储几何图形是可能的,但这是一个相当糟糕的想法,不应该这样做。我解释了基本思想,即如何从How to Import models from 3D software, like Maya into OpenGL?导入模型。其次,创建游戏的主要过程是什么,特别是在使用Maya或3DS Max中创建的模型时?是先创建模型,然后将模型导出为可读的OpenGL/DirectX代码,其中包括所有导出的着色器程序和在代码中创建的所有顶点和三角形,并最终在C++/c程序中使用该代码吗?
你问了一个很大的问题,但至少对于它的“第二”部分 - 非平凡模型是在软件包中创建的,如你所描述,但通常会被导出到数据文件中,基本上表示几何图形列表。然后这些文件会被游戏资源加载器读取,并放入顶点数组或缓冲区对象等中。这样数据就独立于代码。
硬编码的几何图形通常用于小型固定物体和教程项目。 :)
你的第一个问题实际上是无法回答的 - 两个图形库都通过API使我可以访问底层图形硬件。游戏的外观在很大程度上取决于如何使用该API。如果我在OpenGL中将后备缓冲区设置为红色,它看起来与我在DirectX中将后备缓冲区设置为红色时相同。如果我在OpenGL中执行与DirectX相同的光照计算,我将看到相同的结果,依此类推。任何产生的差异可能是由于API不完全相同,因此程序员需要解决这个问题。
来自3D建模程序(例如Maya或3DsMax)的模型并没有“编码”,而是以游戏可以理解的格式导出。这些可以是基于XML的格式,例如Collada,基于文本的格式,例如OBJ,甚至是专有的二进制格式。重要的是,建模程序中的数据以一种游戏可以读取和转换为几何体内部表示的格式提供给游戏。几乎每个游戏引擎都以稍微不同的方式处理几何体。
从技术上讲,我只需保存以下文件:
V1 0.0, 0.5, 0.5
V2 -0.5,-0.5, 0.5
V3 0.5, 0.5, 0.5
M1 V1, V2, V3
V1
,V2
,V3
)和一个网格(M1
),由这三个顶点组成,并且知道如何将其读入我们可以渲染的格式中,我们就可以开始绘制这个三角形到场景中作为一个网格。顺便说一下,这种格式与OBJ格式并没有太大差别。这是一个非常大的问题,简短回答很难。
关于DirectX和OpenGL,它们在功能和性能方面并没有太大的区别(也许)。
DirectX总是领先于OpenGL。例如,它首先支持硬件镶嵌特性,然后过了一段时间,这个特性才出现在OpenGL中。但这不是什么大不了的事情,因为当你开发游戏时,你必须支持一系列机器,包括那些低性能的机器。所以你可能无法使用新的特性,直到它变得非常普遍。
是的,游戏开发者使用Maya和3Ds Max等软件来创建游戏模型,并通常将模型输出到模型文件中。这个文件由游戏引擎读取。
我不建议你从OpenGL或DirectX开始,我认为最好使用游戏(或图形)引擎。例如,Ogre 3D. http://www.ogre3d.org/
因为它支持DirectX和OpenGL,而且还有现成的3Ds Max、Maya导出器,使加载模型变得容易。