热门标签 | 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为指向变换矩阵的指针。

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

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

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

 


推荐阅读
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
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社区 版权所有