DirectX9.0 入门手册(5)

DirectX 9.0 (5) 点光源 引言               在前面几个系列中,我们陆续 阅读详情

 

       第一次写这种文章,再加上自己也是菜鸟,虽然有部分内容是参考一些书籍及自己翻译一些英文文章所写出来的,但我相信文章里面肯定也还有很多bug,如果你发现了请告诉我,或者你有什么想法也可以和我交流,我诚心和志同道合的人成为朋友,我的QQ是61010818,我的邮箱fowenler@126.com

       第一次写这种文章,再加上自己也是菜鸟,虽然有部分内容是参考一些书籍及自己翻译一些英文文章所写出来的,但我相信文章里面肯定也还有很多bug,如果你发现了请告诉我,或者你有什么想法也可以和我交流,我诚心和志同道合的人成为朋友,我的QQ是61010818,我的邮箱fowenler@126.com

   (惨了,开始自己最不愿意接触的数学部分了。啊?你也讨厌数学?哈哈,那我就偷个懒,太深的数学知识我就不翻老书作复习了,只说一些基本的很简单的吧。不过有空还是要看一些数学方面的书,特别是线性代数和立体几何方面的。)

·向量(也叫矢量,英文叫vector)

    向量就是包含大小(长度)和方向的一个量。向量有2维的,也有3维甚至4维的。在DX的所有结构体中,有一个结构体是用来表示3维向量的,它就是D3DVECTOR,这个结构体很简单,只有三个成员:x、y、z。一般来说,如果不涉及到向量运算的话,用这个结构体来定义一个向量就可以了。我们可以它来表示方向以及顶点在3D世界中的位置等。如果你要对那些向量进行一些运算的话,使用D3DVECTOR就很不方便了,因为在D3DVECTOR这个结构体中没有重载任何的运算符,如果想要做一个加法运算,就得分别对结构体中的每一个成员进行运算了。嘿嘿,不用怕,在DX里面有个叫D3DX的东东(包含d3dx.h头文件),它里面定义了很多方便我们进行数学计算的函数和结构。其中就有D3DXVECTOR2,D3DXVECTOR3,D3DXVECTOR4这三个结构体。看它们的名字就应该知道它们的作用了吧。对于2维和4维的结构体这里就不讲了,其实它们也很简单,和D3DXVECTOR3差不多。不过要说明一点的是D3DXVECTOR3是从D3DVECTOR派生过来的,说明它和D3DVECTOR一样,有x、y、z这三个成员,除此之外,D3DXVECTOR3还重载了小部分算术运算符,这样我们就可以像对待整型那样对D3DXVECTOR3的对象进行加减乘除以及判断是否相等的运算了。同时,由于D3DXVECTOR3是从D3DVECTOR派生过来的,所以两者的对象可以互相赋值,在这两种类型中随便转换。

    还是简单说一下向量的数学运算吧。矢量的加减法很简单,就是分别把两个向量的各个分量作加减运算。向量的乘除法也很简单,它只能对一个数值进行乘除法,运算的结果就是向量中的各个分量分别对那个数值进行乘除法后得出的结果。向量的模就是向量的长度,就是各个分量的平方的和的开方。向量的标准化就是使得向量的模为1,这对在3D世界中实现光照是很有用的。对于向量的运算,还有两个“乘法”,那就是点乘和叉乘了。点乘的结果就是两个向量的模相乘,然后再与这两个向量的夹角的余弦值相乘。或者说是两个向量的各个分量分别相乘的结果的和。很明显,点乘的结果就是一个数,这个数对我们分析这两个向量的特点很有帮助。如果点乘的结果为0,那么这两个向量互相垂直;如果结果大于0,那么这两个向量的夹角小于90度;如果结果小于0,那么这两个向量的夹角大于90度。对于叉乘,它的运算公式令人头晕,我就不说了,大家看下面的公式自己领悟吧……

        //v3 = v1 X v2

        v3.x = v1.y*v2.z – v1.z*v2.y

        v3.y = v1.z*v2.x – v1.x*v2.z

        v3.z = v1.x*v2.y – v1.y*v2.x

是不是很难记啊,如果暂时记不了就算了。其实我们主要还是要知道叉乘的意义。和点乘的结果不一样,叉乘的结果是一个新的向量,这个新的向量与原来两个向量都垂直,至于它的方向嘛,不知大家是否还记得左手定则。来,伸出你的左手,按照第一个向量(v1)指向第二个向量(v2)弯曲你的手掌,这时你的拇指所指向的方向就是新向量(v3)的方向了。通过叉乘,我们很容易就得到某个平面(由两个向量决定的)的法线了。

终于写完了上面的文字,描述数学问题可真是费劲,自己又不愿意画图,辛苦大家了。如果你觉得上面的文字很枯燥,那也没关系。因为上面的不是重点,下面介绍的函数才是希望大家要记住的。

D3DX中有很多很有用的函数,它们可以帮助我们实现上面所讲的所有运算。不过下面我只说和D3DXVECTOR3有关的函数:

计算点乘:FLOAT D3DXVec3Dot(

CONST D3DXVECTOR3* pV1,

CONST D3DXVECTOR3* pV2)

计算叉乘:D3DXVECTOR3* D3DXVec3Cross(

            D3DXVECTOR3* pOut,

CONST D3DXVECTOR3* pV1,

CONST D3DXVECTOR3* pV2)

    计算模:FLOAT D3DXVec3Length(

                CONST D3DXVECTOR3* pV)

    标准化向量:D3DXVECTOR3* D3DXVec3Normalize(

                    D3DXVECTOR3* pOut,

                    CONST D3DXVECTOR3 pV)

    对于D3DXVECTOR3的加减乘除运算,上面已经讲了,用+ - * / 就行了。

·矩阵与矩阵运算

    什么是矩阵?这个概念还真不好解释,不过学过线性代数的人肯定都知道矩阵长什么样,那我在这里就不解释了。在D3D中,定义矩阵的结构体是D3DMATRIX:

typedef struct _D3DMATRIX {

    union {

        struct {

            float        _11, _12, _13, _14;

            float        _21, _22, _23, _24;

            float        _31, _32, _33, _34;

            float        _41, _42, _43, _44;

        };

        float m[4][4];

    };

} D3DMATRIX;

    看这个结构的样子,你就应该很清楚怎么使用它来定义一个矩阵了吧。在这里我顺便说一下C++中union的特性吧。像上面定义的结构体所示,在union里面有两个部分,一个是结构体,另一个是二维数组,它有16个元素。在union中,所有的成员都是共用一个内存块的,这是什么意思呢?继续看上面的代码,结构体中的成员_11和成员m数组的第一个元素是共用一个内存空间,即它们的值是一样的,你对_11赋值的同时也对m[0][0]进行了赋值,_11和m[0][0]的值是一样的。这样有什么好处呢?比如你定义了一个矩阵变量D3DMATRIX mat;你想访问矩阵中第三行第四列的元素,可以这样做:mat._34;另外也可以这样:mat.m[2][3](数组是从位置0开始储存的哦)。看起来使用后者比较麻烦,不过当你把中括号里面的数换成i和j,使用mat.m[i][j]来访问矩阵中的元素,你就应该知道它的好处了吧。

    实际上直接使用D3DMATRIX的情况不多,因为在D3DX中有个更好的结构体,那就是D3DXMATRIX。和D3DXVECTOR3相似,D3DXMATRIX是从D3DMATRIX继承过来的,它重载了很多运算符,使得矩阵的运算很简单。矩阵的运算方法我不打算多说了,下面只介绍和矩阵性质有关的三个函数。

    产生一个单位矩阵:D3DXMATRIX *D3DXMatrixIdentity(

                            D3DXMATRIX *pout);//返回结果

    求转置矩阵:D3DXMATRIX *D3DXMatrixTranspose(

    D3DXMATRIX *pOut,//返回的结果

    CONST D3DXMATRIX *pM );//目标矩阵

    求逆矩阵:D3DXMATRIX *D3DXMatrixInverse(

    D3DXMATRIX *pOut,//返回的结果

    FLOAT *pDeterminant,//设为0

    CONST D3DXMATRIX *pM );//目标矩阵

    至于什么是单位矩阵,什么是转置矩阵,什么是逆矩阵我就不说了,可以看一下线性代数的书,一看就明白了。简单的加减乘除法可以使用D3DXMATRIX结构体里面重载的运算符。两个矩阵相乘也可以用函数来实现,这将在接下来的矩阵变换中讲到。

·矩阵变换

矩阵的基本变换有三种:平移,旋转和缩放。

    平移:

D3DXMATRIX *D3DXMatrixTranslation(

    D3DXMATRIX* pOut,//返回的结果

    FLOAT x, //X轴上的平移量

    FLOAT y, //Y轴上的平移量

    FLOAT z) //Z轴上的平移量

;

    绕X轴旋转:

D3DXMATRIX *D3DXMatrixRotationX(

    D3DXMATRIX* pOut, //返回的结果

    FLOAT Angle //旋转的弧度

);

绕Y轴旋转:

D3DXMATRIX *D3DXMatrixRotationY(

    D3DXMATRIX* pOut, //返回的结果

    FLOAT Angle //旋转的弧度

);

绕Z轴旋转:

D3DXMATRIX *D3DXMatrixRotationZ(

    D3DXMATRIX* pOut, //返回的结果

    FLOAT Angle //旋转的弧度

);

    绕指定轴旋转:

    D3DXMATRIX *D3DXMatrixRotationAxis(  

            D3DXMATRIX *pOut,//返回的结果

        CONST D3DXVECTOR3 *pV,//指定轴的向量

            FLOAT Angle//旋转的弧度

);

    缩放:

D3DXMATRIX *D3DXMatrixScaling(

    D3DXMATRIX* pOut, //返回的结果

    FLOAT sx, //X轴上缩放的量

    FLOAT sy, //Y轴上缩放的量

    FLOAT sz  //Z轴上缩放的量

);

    好了,这章就写这么一些东西。如果你觉得好像没学到什么的话,可能是因为不知道上面的知识有什么用吧。下一章我将介绍世界空间、视图空间(也叫摄像机空间)以及投影,这三者对应的是世界矩阵、视图矩阵和投影矩阵。搞清楚这三个空间的作用后,我们就可以利用这章的知识使我们的3D世界动起来了。

【DirectX 9.0c入门教程】之一 开发环境搭建:安装vs2008 sp1和DirectX SDK 本系列文章由@胡子长长了出品,转载请注明出处。   文章链接: http://blog.csdn.net/hzzcle/article/details/49717695 作者:胡子长长了    微博:http://weibo.com/hzzcle 一、安装VS2008 SP1 阅读详情

相关推荐

DirectX 9.0 3D 笔记

1.3.0 预备 1.HAL,硬件抽象层,由D3DDEVTYPE_HAL指定 2.REF,参考光栅设备 3.COM,组件对象模型,使之向下兼容,视为C++类。 1.3.1 表面 4.IDirect3DSurface9,描述表面。  (1)LockRect:获取指向表面存储区的指针,通过指针对每一个像素进行读写。  (2)UnlockRect:执行完LockRect后,必须调用

pengzeng1的博客 4182

DirectX 总结和DirectX 9.0 学习笔记

转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surface file format, .dds。这是微软从DirectX7开始引进的一种文件格式,它用来存储压缩的或未压缩的纹理,该格式支持mimaps cube maps和volume map...

weixin_30764883的博客 960

DirectX (9) 纹理映射

引言              在接下来的保温

i_dovelemon的专栏 7576

DirectX9.0 入门手册(3)

DirectX9.0 入门手册(3)     第一次写这种文章,再加上自己也是菜鸟,虽然有部分内容是参考一些书籍及自己翻译一些英文文章所写出来的,但我相信文章里面肯定也还有很多bug,如果你发现了请告诉我,或者你有什么想法也可以和我交流,我诚心和志同道合的人成为朋友,我的QQ是61010818,我的邮箱fowenler@126.com·顶点属性与顶点格式

kiss0kill的专栏 961

C语言图形编程入门:基于DirectX 9.0的太阳系模拟

本文还有配套的精品资源,点击获取 简介:本项目通过"Ex01"教学实例展示如何使用C语言结合DirectX 9.0开发图形应用程序,重点在于绘制太阳系模型和控制飞船移动。内容涵盖了C语言基础、DirectX 9.0的初始化、图形绘制、键盘输入处理、三维图形编程等关键概念。学习者将通过实际操作理解C语言在图形编程中的应用,从而提升编程技能和解决实际问题的能力。 1....

weixin_33245447的博客 1141

C++实现的DirectX9.0东方永夜抄游戏开发项目

DirectX 9.0是微软公司发布的一套用于Windows平台上的多媒体应用程序接口集合,它专门为游戏和视频处理等多媒体应用提供了丰富的功能。DirectX 9.0引入了高级着色器语言(HLSL),大幅提高了图形渲染的质量和效率,这使得游戏开发者能够创建更加逼真的视觉效果。同时,DirectX 9.0还包括了Direct3D、DirectSound、DirectInput等多个子API,分别对应图形渲染、音频处理、用户输入等方面的管理。这一代API还支持大量的硬件加速,确保了游戏运行的流畅性。

weixin_36304957的博客 1142

dx9.0c(DirectX 9.0C) 官方中文版

d x9.0c(Di rectX9.0C)官方中文版 软件大小:103MB 软件语言:简体中文 软件类别:硬件驱动 软件授权:官方版 更新时间:2014-12-03 应用平台:/Win8/Win7/WinXP dx9.0c(DirectX9.0C)是电脑玩游戏必备...

chunquduo8015的博客 2830

掌握DirectX 9.0c的3D游戏编程:着色器技术源码解析

本文还有配套的精品资源,点击获取 简介:本书《Introduction to 3D Game Programming with DirectX 9.0c: A Shader Approach》提供了深入DirectX 9.0c技术的3D游戏编程实践示例。源码包含关键资源和代码,使读者能够理解该API在实际开发中的应用。DirectX 9.0c包括Direct3D、Direc...

weixin_29092787的博客 1619

解决《魔域》缺少DirectX 9.0的问题:原因分析与解决步骤文章:

当您尝试启动《魔域》时,如果收到“缺少DirectX 9.0”或类似的错误提示,这通常意味着您的计算机系统中DirectX的版本低于游戏所要求的最低版本。DirectX是微软开发的一套多媒体API集合,用于处理游戏和其他多媒体应用中的图形和音频效果。

Xixix777的博客 4053

ESD镜像解密与转换全攻略:从esd-decrypter到WinNTSetup的完整流程

本文详细解析了ESD镜像的加密特性与压缩优势,并提供了从解密到转换的完整实战指南。核心步骤包括使用esd-decrypter工具解密ESD文件为WIM格式,以及如何结合WinNTSetup进行灵活的系统安装或进一步封装为可引导的ISO镜像,帮助用户高效处理官方Windows安装镜像。

weixin_29207439的博客 451

Altera下载器驱动配置:手把手教程(从零实现)

详解Altera USB-Blaster驱动安装全过程,从设备识别到软件配置一步一图,解决常见连接问题,确保开发下载器正常工作,适合初学者快速上手FPGA下载调试。

weixin_35751194的博客 989

directx9.0安装详细教程

DirectX,(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。小提示:有许多游戏,如果不安装DirectX,运行游戏可能会有如下报错:如《永恒之塔》对于每一台安装《永恒之塔》客户端的PC机,安装DirectX9.0C以上版本都是必须的。以下是DirectX的下载及安装步骤:1、 首先请下载DirectX2、 运行directx_nov2008_redist.ex...

ytakcc的专栏 4504

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别。

qq_30713721的博客 3471

DirectX中文手册

目 录 第一章 DirectX基础(初级篇) 第一节 什么是DirectX 一、什么是DirectX ? 二、DirectX的组成部分 三、关于DirectDraw 四、为什么要使用DirectDraw? 五、DirectX5.0的新特性? 六、什么是部件对象模型(COM) 七、自我检测 第二节 如何安装和使用DirectX 一、编译库和运行库 二、安装 VC++ 5...

冬泳的博客 1894

DDSP(Differentiable Digital Signal Processing) 开篇

文章目录DDSP可以用来做什么?下一步工作 工作中接触到了DDSP声码器,但非科班出声的我对这块知识非常陌生,甚至带有一些畏惧的心理,但是为了工作为了进步,必须硬下头皮去啃,相信只要耐心地坚持,没什么能难到我。于是从今天开始,就用这个博客专栏来记录我的学习历程,希望也能帮助到你~ DDSP对应的论文是:DDSP: Differentiable Digital Signal Processing 先翻译一篇来自DDSP论文作者的对DDSP的介绍的文章。 今天,我们很高兴地介绍可微数字信号处理(DDSP)库。

YeeKo的博客 9246

SIMPLIS仿真软件2.2-SIMPLIS快速入门2

SIMPLIS仿真软件2.2-SIMPLIS快速入门2导读 导读 本文承接上一篇文章。开始介绍SIMPLIS仿真部分。正如上一篇所讲的快速入门的定位,该文对SIMPLIS的三种分析模式不会很深入的讲解,只会记录下一些重要的设置和操作。对于SIMPLIS的三种分析模式的详细讲解,后面会专门撰写。如果读者还没有搭建上一篇文章中讲述的电路,那你可以点击这个链接免费下载所需的电路SIMPLIS_tutorial_buck_converter ,然后在这个电路的基础上继续进行以下操作。 ...

qq_44677482的博客 2万+

卸载DirectX9.8

DirectX9.0带来的问题 DirectX每一次升级都使其内核结构与特性发生重大改变,给人们的视觉和听觉带来巨大冲击。然而,微软最新发布的DirectX9.0带给人们的似乎只是一些麻烦。 据很多使用Radeon 9700Pro、Radeon 8500、GeForce3、SiS Xabre400等显卡的用户反映,安装DirectX9.0后运行一些游戏(例如魔兽争霸3、模拟飞行2002),在多人对

no_mIss的专栏 6134

LSTM 深度解析从原理推演到现代序列建模的演进

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),它通过引入记忆单元(Cell State)来解决普通RNN在长序列数据处理中的梯度消失问题。LSTM可以在长时间的序列中捕捉依赖关系,是一种非常适合处理时间序列、自然语言处理、语音识别等任务的深度学习模型。在LSTM中,记忆单元(Cell State)是一个贯穿整个序列的数据通道,用于存储和传递关键信息。记忆单元在LSTM的时间步之间保持信息的持久性,可以看作是一个长期记忆的“容器”。

hello.reader 3万+

【Visual C++】游戏开发笔记二十四 由DirectX的几个版本说开去

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7629288作者:毛星云    邮箱: happylifemxy@qq.com    期待着与志同道合的朋友们相互交流本节是DirectX 11的一个开篇,都是些概念性的知识,希望在正式学习DirectX 11之前,对将要学习的内容有一个整体的认

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 2万+

万字长文:YOLOv5+RK3588 NPU多线程加速全攻略——从理论到部署的终极优化

RK3588 NPU多线程加速优化教程摘要 本教程深入讲解了如何利用线程池技术优化RK3588 NPU上的YOLO目标检测模型推理性能。RK3588内置3个NPU核心,理论算力达6TOPS,为多线程优化提供了硬件基础。教程详细解析了线程池的核心组件(任务队列、工作线程、同步机制)和实现架构,包括类设计、初始化流程、工作线程逻辑(任务获取、NPU推理、结果存储三个阶段)以及任务提交/获取机制。通过预分配模型实例、线程绑定、流量控制等优化手段,实现了从单线程28FPS到多线程120FPS的显著性能提升,为边缘A

LXY_LOVE36的博客 1101

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

DirectX 9.0 C++ 教程 开发环境设定

1.开发工具 我一般使用Visual C++ 6.0来编译和调试DirectX,比较轻量级。 也可以用VS2005 或 VS2010。推荐使用Visual C++ 6.0时安装Visual Assist X。这样Visual C++ 6.0下代码提示会好些。 2.安装 DirectX 9.0 玩游戏的话是安装个DirectX 9.0 软件。这里我们开发要安装DirectX 9.0 SDK。下

易水寒 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: DirectX9.0 入门手册(4)
下一篇: DirectX9.0 入门手册(6)
Isaf
博客等级 码龄21年 31粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值