我对学习 3D 视频游戏开发很感兴趣,但不确定从哪里真正开始。我不只是制作它可以由各种游戏制造商完成,我更感兴趣的是它是如何完成的。理想情况下,我想知道一般 3D 模型等以哪种格式存储。(坐标格式等)以及如何从特定角度在屏幕上表示 3D 数据的信息,例如一般的免费漫游 3D 视频游戏就像鬼泣一样。我看过一些关于 3D 矩阵的链接,但我真的不明白它们是如何使用的。对初学者的任何帮助将不胜感激。
谢谢
我对学习 3D 视频游戏开发很感兴趣,但不确定从哪里真正开始。我不只是制作它可以由各种游戏制造商完成,我更感兴趣的是它是如何完成的。理想情况下,我想知道一般 3D 模型等以哪种格式存储。(坐标格式等)以及如何从特定角度在屏幕上表示 3D 数据的信息,例如一般的免费漫游 3D 视频游戏就像鬼泣一样。我看过一些关于 3D 矩阵的链接,但我真的不明白它们是如何使用的。对初学者的任何帮助将不胜感激。
谢谢
视频游戏开发是一个庞大的领域,需要博弈论、计算机科学、数学、物理和艺术方面的知识。根据您想专攻什么,有不同的起点。但由于这是一个编程问题的网站,这里有一些关于它的编程部分的见解:
资产(模型、纹理、声音)是使用专用的 3rd 方工具(想想 Gimp、Photoshop、Blender、3ds Max 等)创建的,这些工具提供了多种不同的导出格式。这些格式通常有一个共同点:它们针对应用程序之间的简单通信进行了优化。
视频游戏具有很高的性能要求,并且在游戏过程中必须始终加载和卸载资产。因此,内容必须采用紧凑且加载速度快的格式。通常第 3 方格式不能满足您在游戏项目中的特定要求。为了获得最佳性能,您需要考虑开发自己的格式。
资产和常见的第 3 方格式示例:
在我的游戏项目中,我使用导入器将我的纹理从上述格式之一转换为DDS文件。这不是我自己开发的格式,但它仍然是使用 Direct3D(图形 API)加载的最快格式之一。
Wavefront OBJ文件格式是一种非常易于理解的基于文本的格式。大多数 3D 建模应用程序都支持它。但由于它是基于文本的,因此文件比等效的二进制文件大得多。它们还需要大量昂贵的解析和处理。所以我开发了一个导入器,将 OBJ 模型转换为我的自定义高性能二进制格式。
WAV是一种非常常见的声音文件格式。此外,它非常适合在游戏中使用。所以在这种情况下不需要自定义格式。
将 3D 场景每秒至少渲染30 次以达到平均屏幕分辨率需要大量计算。为此目的,构建了GPU 。虽然可以使用非常低级的语言为 GPU 编写任何类型的程序,但大多数开发人员使用Direct3D或OpenGL之类的抽象。这些 API 在限制与 GPU 通信的方式的同时,极大地简化了与图形相关的任务。
到目前为止,我只使用过 Direct3D,但其中一些也应该适用于 OpenGL。
正如我所说,GPU 是可以编程的。Direct3D 和 OpenGL 都有自己的 GPU 编程语言,即着色语言:HLSL (Direct3D) 和GLSL。用其中一种语言编写的程序称为Shader。
在渲染 3D 模型之前,图形设备必须为渲染做好准备。这是通过将着色器和其他效果状态绑定到设备来完成的。(所有这些都是使用 API 完成的。)
3D 模型通常表示为一组顶点。例如,矩形有 4 个顶点,立方体有 8 个,等等。这些顶点由多个组件组成。在这种情况下,绝对最小值将是一个位置分量(3 个浮点数表示 3D 空间中的 X、Y 和 Z 偏移量)。此外,位置只是一个无限小的点。所以另外我们需要定义点如何连接到表面。
定义顶点和三角形后,可以将它们写入 GPU 的内存。如果一切设置正确,我们可以通过 API 发出 Draw Call。GPU 然后执行您的着色器并处理所有输入数据。在最后一步中,渲染的三角形被写入定义的输出(例如屏幕)。
正如我之前所说,3D 网格由具有 3D 空间位置的顶点组成。这些位置都嵌入到称为对象空间的坐标系中。
为了将对象放置在世界中、移动、旋转或缩放它,必须转换这些位置。换句话说,它们必须嵌入到另一个坐标系中,在这种情况下称为世界空间。
进行这种变换的最简单和最有效的方法是矩阵乘法:根据平移、旋转和缩放量构造一个 4x4 矩阵。然后将该矩阵与每个顶点相乘。(它背后的数学很有趣,但不在这个问题的范围内。)
除了对象和世界空间之外,还有视图空间(“相机”的坐标系)、剪辑空间、屏幕空间和切线空间(在对象的表面上)。向量必须在这些坐标系之间进行大量转换。所以你明白了,为什么矩阵在 3D 图形中如此重要。
找到一个您认为有趣的主题并开始使用 Google 搜索。我想我给了你很多关键词,我希望我能让你对你具体提到的主题有所了解。
StackExchange 框架中还有一个游戏开发站点可能更适合此类问题。在任何 SE 网站上,投票率最高的问题始终是一本好书。
基本上,第一个决定是使用 OpenGL 还是 DirectX。我建议你使用 OpenGL,因为它独立于平台,也可以用于移动设备。
对于 OpenGL,这里有一些很好的教程可以帮助您入门: