热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Direct3D研究院之TL流水线(五)

DirectX3D渲染图形的过程可分为两步:第一步为T&L过程;第二步为光栅化。光栅化,大家应该都知道,就是按照图形顶点信息

DirectX3D渲染图形的过程可分为两步:第一步为T&L过程;第二步为光栅化。光栅化,大家应该都知道,就是按照图形顶点信息设置对应像素的颜色,然后呈现在屏幕上的过程。而T&L,可能有些朋友不太了解,这一章,我们就来对T&L进行一下学习。

首先,要知道什么是T&L,T&L就是Transforming and Lighting,即顶点的坐标变换和光照过程。通常被称为顶点变换流水线。

DirectX3D中图形的顶点的坐标系三维坐标系,而电脑屏幕是一个二维的平面,我们要将三维坐标系中的顶点渲染到二维的电脑屏幕上,就需要对顶点进行处理,使其投射到二维坐标系中,这个过程就是顶点的坐标变换。

T&L的完整过程分为以下五步:

1、世界变换

物体在三维空间中的运动以及形变的过程叫做世界变换。其中物体所在的三维空间为世界空间,物体的坐标系为世界坐标系。世界变换主要包括移动、旋转、缩放等。

2、观察变换

物体由世界坐标系转换到观察坐标系的过程叫做观察变换。这其实就像用摄像机摄影一样,摄影机所在位置就是观察点,摄像机的朝向就是观察方向。以观察点为坐标原点,以观察方向为坐标轴的坐标系就是观察坐标系。

3、光照

光照,就是光源对顶点颜色的影响过程。

4、投影变换

将三维空间中的顶点投影到二维平面的过程叫做投影变换。这个过程可以看做,顶点经过观察变换后,将三维坐标投影到摄像机的胶片上,以胶片的中心为坐标原点的坐标系为投影坐标系。

5、视区变换

将浮点坐标转换为像素坐标的过程叫做视区变换。最终的坐标与定义的视区的长宽比例以及长宽大小有关。

不过DirectX3D的图形渲染也没有必要必须需要经过T&L处理,像在之前的章节中,我们绘制的图形使用的顶点,在定义时被定义为经过变换的顶点,即直接将顶点的坐标作为屏幕坐标绘制出来,并没有进行T&L处理,但如果想得到绚丽的效果,T&L处理还是必须的。

这一章,先不讲解光照,光照方面的东西比较多,将会在以后章节中讲解。下面主要来讲解一下顶点坐标变换的相关内容。

谈到顶点坐标变换,就不得不说一下在DirectX3D中顶点变换的原理。

在DirectX3D中,一切的变换都离不开矩阵。在讲解三维坐标变换前,先来看一下二维坐标的变换,这有助于大家对矩阵操作的理解。

矩阵对图形的操作主要是移动、旋转和缩放。

 

T为单位矩阵,即定义二维空间中的直角坐标系。从功能上划分,可以将T划分为4个子矩阵:

 

主要对图形进行旋转、缩放、对切、错切等变换;

 

用于对图形作投影变换;

[a31 , a32]

用于对图形进行移动操作;

[a33]

用于对整个图形进行缩放操作。

二维图形变换示例:

1、图形移动

已知变换矩阵M=,则有

[x1,y1,1]=[x,y,1]M=[x + Mx , y + My , 1]

其中矩阵M中Mx、My分别表示在x轴、y轴上的变化量,矩阵[x1,y1,1]是矩阵[x,y,1]经过变换的矩阵。

2、图形旋转

已知变换矩阵M=,则有

[x1,y1]=[x,y]M=[x*cosθ-y*sinθ,x*sinθ+y*cosθ]

其中θ为旋转角度,通常情况以逆时针方向为正方向。

3、图形缩放

已知变换矩阵M=,则有

[x1,y1,1]=[x,y,1]M=[Sx*x ,Sy*y, 1]

其中Sx、Sy为图形在x、y方向上的缩放系数。

三维图形的变换与二维矩阵变换稍有不同,它是基于4*4矩阵的。

三维图形变换示例:

1、图形移动

已知变换矩阵M=,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x+Px,y+Py,z+Pz,1]

其中Px、Py,Pz分别为x、y、z方向上的变化量。

2、图形旋转

三维图形的旋转与二位图形旋转有所区别,包括绕x、y、z轴旋转3种情况。

绕x轴旋转:

已知变换矩阵M=,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x,y*cosθ-z*sinθ,y*sinθ+z*cosθ,1]

其中θ为绕x轴旋转角度。

绕y轴旋转:

已知变换矩阵M=,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x*cosθ+z*sinθ,y,-x*sinθ+z*cosθ,1]

其中θ为绕y轴旋转角度。

绕z轴旋转:

已知变换矩阵M=,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x*cosθ-y*sinθ,x*sinθ+y*cosθ,z,1]

其中θ为绕z轴旋转角度。

3、图形缩放

已知变换矩阵M=,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x*qx,y*qy,z*qz,1]

其中qx、qy、qz分别为图形在x、y、z方向上的缩放系数。

现在大家对图形中顶点坐标的变换原理应该有了一个大概的认识了。下面回到DirectX中。

在DirectX3D中提供了D3DMATRIX矩阵类型,以及其他扩展的矩阵类型。得到对应变换矩阵后,可以通过函数SetTransform进行设置。函数原型如下:

C#

1

HRESULT SetTransform(D3DTRANSFORMSTATETYPE state, CONST D3DMATRIX *pMatrix);

其中state的取值可以为D3DTS_WORLD、D3DTS_VIEW和D3DTS_PROJECTION,分别表示世界变换、观察变换和投影变换。pMatrix为指向变换矩阵的指针。

通过调用此方法,我们就实现了对应的变换。

好,今天就说到这里吧,在下一章中,我将用一个“太阳、地球、月球”系统来演示各种顶点坐标变换的实际做法。

此文仅供参考,如有不足,请不吝赐教,大家一起学习进步。

 


推荐阅读
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 在C#中,一旦对象被实例化后,直接重新调用构造函数是不可行的。与C++不同,C#不支持在对象实例化后强制调用构造函数。为了实现类似的功能,可以通过定义一个重置方法或使用工厂模式来重新初始化对象的状态。例如,可以创建一个 `Reset` 方法,在该方法中重新设置对象的属性和状态,从而达到类似于重新调用构造函数的效果。这样不仅保持了代码的清晰性和可维护性,还避免了潜在的副作用。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文深入探讨了C#中的反射与特性功能。首先,介绍了反射的基本概念,即通过元数据(包括类的方法、属性和字段等)在运行时动态获取和操作程序信息的能力。此外,还详细解析了特性的使用方法及其在代码注解和元数据扩展中的重要作用,为开发者提供了丰富的编程技巧和实践指导。 ... [详细]
author-avatar
胡敏qiang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有