3d directx_熟悉Direct3D的人多吗[通俗易懂]

3d directx_熟悉Direct3D的人多吗[通俗易懂]概念是人们为了准确描述一个客观事物而总结提炼的关键词语

概念是人们为了准确描述一个客观事物而总结提炼的关键词语。诸如数学中最基本的概念:点、线、面,函数……,物理中的“质点”等等,当我们过去在学习这些知识的时候,其实最重要的就是建立起对这些概念的准确认识,而只有当大多数人们对这些普适应的概念达成共识,学科才得以成立。

学生经常会做错题,最常见的原因就是没有理解概念。

在D3D的学习中,有以下概念需要掌握和理解。

D3D是一套底层的绘图API,从本质上讲,还是软件接口,我们通过这一些列接口,控制绘图硬件,为实际的计算机应用实现图形、三位图形建模应用提供方法。

渲染

刚刚入行的朋友,对这个词语可能理解不够深刻,常有“电影中xxx渲染了一种什么样的气氛”,诸如此类的说法。所以让人对渲染这个词语用在计算机图形学中,有一种朦胧的感觉,到底渲染执行了什么步骤。
简单来说,这里所说的渲染,就是将程序已经计算完成的准备好的各种图片、图形数据按照我们想要的二维位置、三位位置、光线情况等要求在显示器中展示出来的过程。

渲染的过程:
已经准备好的数据(可以是图片、可以是YUV数据、可是RGB数据、还可以是音频等,这一步骤不算渲染的开始)

  1. 创建D3D资源以及设备
    这一步,没什么可以说的,调用D3D提供的接口,传入对应的参数。以D3D9为例子:
Direct3DCreate9(); // 获得COM编程接口IDirect3D9
IDirect3D9->CreateDevice(); 通过IDirect3D9创建Device(设备)。

COM 说明
组件对象模型(COM)技术使 DirectX 独立于任何编程语言,并具有版本向后兼容的特性。我们经常把 COM 对象称为接口,并把它当成一个普通的 C++类来使用。

  1. 确定坐标
    无论是二维还是三维场景,我们需要将数据展示在屏幕的什么地方,这就是首席按需要设定的,二维比较简单,可以直接使用屏幕坐标系,来确定, 但是三位就复杂了,软件中有四个主要的窗口,分为顶视图、正视图、侧视图和透视图。我们大多数时候渲染的是透视图而不是其它视图,透视图的摄像机基本遵循真实摄像机的原理,所以我们看到的结果才会和真实的三维世界一样,具备立体感。
    D3D中坐标系分为几种:局部坐标、世界坐标、观察坐标、投影工作表,这些坐标系就是我们从不同的角度去描述一个三位图形在计算机二维画面中怎么呈现出来的。具体之后的实践中会讲解。
    总的来说,坐标的确定,确定的就是我们将要显示的图形放在了屏幕的什么位置。

  2. 创建资源
    渲染的时候,图像数据需要保存,保存在表面(Surface)还是纹理(Texture),创建方式也是有区别的。本质上,Surface和Texture都是一块内存,将要存储是图形数据。而创建这些资源的时候,是基于2中确定好的坐标来创建的。

  3. 开始绘制
    绘制过程是一个复杂的过程,首先是设置资源(顶点、纹理等缓冲区)到设备数据流,然后是修改和改变视图的位置,这里的设备数据流指的是D3DAPI中的抽象数据,最后将数据流刷至屏幕。

简单来说,渲染的基本过程即使这样。可能有描述不准确的地方,但是大概过程就是如此,对于从未接触过D3D渲染的人来说,现有这样一个概念,通过代码实践之后,回来再看,就更深刻的了解这个过程了。

D3D设备

可以将D3D设备理解为一个接口的集合,这个接口的集合抽象了显卡的参数和资源,甚至可以理解为D3D设备就是简单本机一块显卡的抽象。使用 Direct3Dcreate9()接口可以创建一个设备,通过设备对象,可以调用其中的所有接口。

纹理

表示物体表面细节的一幅或几幅二维图形,也称纹理贴图(texture mapping)当把纹理按照特定的方式映射到物体表面上的时候能使物体看上去更加真实。纹理映射是一种允许我们为三角形赋予图象数据的技术;这让我们能够更细腻更真实地表现我们的场景。

就像我们肉眼看见的三维物体,不透明物体的内部我们肉眼看不见,肉眼所看见的仅仅是三位物体的表面,可以就D3D中的为例简单的理解为物体的表面,当我们在系统创建一个三维的立方体的时候,每一个三位物体的二维表面,就是我们使用纹理来绘制的。

本质来讲,纹理就是系统中的一块被特殊说明的内存。这块资源的操作方法,有却别于系统的普通内存。

三角形

在Direct3D中经常会出现“三角形”这个概念。这是因为在3D图形渲染中,所有的物体都是由三角形构成的。因为一个三角形可以表示一个平面,而3D物体就是由一个或多个平面构成的。

交换链(SwapChain)

为了避免在动画中出现闪烁,最好的做法是在一个离屏(off-screen)纹理中执行所有的动画帧绘制工作,这个离屏纹理称为后台缓冲区(back buffer)。当我们在后台缓冲区中完成给定帧的绘制工作后,便可以将后台缓冲区作为一个完整的帧显示在屏幕上;使用这种方法,用户不会察觉到帧的绘制过程,只会看到完整的帧。从理论上讲,将一帧显示到屏幕上所消耗的时间小于屏幕的垂直刷新时间。硬件会自动维护两个内置的纹理缓冲区来实现这一功能,这两个缓冲区分别称为前台缓冲区(front buffer)和后台缓冲区。前台缓冲区存储了当前显示在屏幕上的图像数据,而动画的下一帧会在后台缓冲区中执行绘制。当后台缓冲区的绘图工作完成之后,前后两个缓冲区的作用会发生翻转:后台缓冲区会变为前台缓冲区, 而前台缓冲区会变为后台缓冲区,为下一帧的绘制工作提前做准备。我们将前后缓冲区功能互换的行为称做呈现(presenting)。提交是一个运行速度很快的操作,因为它只是将前台缓冲区的指针和后台缓冲区的指针做了一个简单的交换。
在这里插入图片描述

DirectX的抽象层次

在这里插入图片描述
知道D3D API处于计算机系统的那个层次很重要,类比C++编程模型,最底层是硬件,上一层是可以直接操作硬件的汇编,然后是更高级的语言C++; 而上图中的 HAL(硬件抽象层)们可以劣迹为显示硬件的上层“汇编”。

本文错误在所难免,随着深入的学习,期望不断深入理解。

今天的文章3d directx_熟悉Direct3D的人多吗[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/77128.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注