Category Archives: DirectX3D

D3D向量运算

向量的定义:

是指空间里的一段有向线段.

向量相等的条件:

如果长度相等和方向相同, 就可判定向量相等.

向量的表示:

一般情况下,向量由空间中的2点表示. 但是我们在处理和表达的简单, 我们采用一点表示. 下面列出为什么我们能用一点表示向量的原因. 根据向量相等的原理, 就可以把任何向量通过移动, 将向量的起点设置到坐标原点. 因此可以用一点去表示向量.

继续阅读

D3D深度缓冲

因为当时没有理解这个东西, 导致自己写的一个小的测试程序无论如何不能按照自己的设想的方式工作.

1. 预期目标:

在世界空间中放置一个圆面, 一个正方形面, 还有一个三棱锥体. 让这三个模型围绕世界坐标系Y轴转动.

继续阅读

3D游戏开发(一)

原文作者:Jake Simpson
译者: 向海

第1部分: 游戏引擎介绍, 渲染和构造3D世界

介绍
   自Doom游戏时代以来我们已经走了很远。 DOOM不只是一款伟大的游戏,它同时也开创了一种新的游戏编程模式: 游戏 "引擎"。 这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数都以ID公司的Quake引擎为基础, 这些游戏包括Counter  Strike, Team Fortress, Tac Ops, Strike Force, 以及Quake Soccer。Tac Ops 和Strike Force 都使用了Unreal Tournament 引擎。事实上, "游戏引擎" 已经成为游戏玩家之间交流的标准用语,但是究竟引擎止于何处,而游戏又从哪里开始呢?像素的渲染,声音的播放,怪物的思考以及游戏事件的触发,游戏中所有 这一切的幕后又是什么呢? 如果你曾经思考过这些问题, 而且想要知道更多驱动游戏进行的东西,那么这篇文章正好可以告诉你这些。 本文分多个部分深入剖析了游戏引擎的内核, 特别是Quake引擎,因为我最近工作的公司Raven Software已经在Quake引擎的基础上开发出了多款游戏,其中包括著名的Soldier of Fortune 。

继续阅读

Direct3D系列 – 1

向量的定义:

是指空间里的一段有向线段.

向量相等的条件:

如果长度相等和方向相同, 就可判定向量相等.

向量的表示:

一般情况下,向量由空间中的2点表示. 但是我们在处理和表达的简单, 我们采用一点表示. 下面列出为什么我们能用一点表示向量的原因. 根据向量相等的原理, 就可以把任何向量通过移动, 将向量的起点设置到坐标原点. 因此可以用一点去表示向量.

继续阅读

HLSL内置对象

在用HLSL写顶点渲染器,象素渲染器和效果器时,经常用到一些HLSL的内置对象, 如 ZEnable, CullMode, Lightling等等.但是从书上是找不到全部的内置对象,也许有一天你发现要用到的一个渲染参数你想在效果器中通过设置内置对象完成, 但是你发现不知道这个对象有没有被定义或者不知道变量的名字是什么. 在网上找也找不到. 怎么办, 告诉你一个方法; 打开dx sdk文档, 转到search tab页,输入我们已经知道的任意一个内置对象, 如Lighting.就可以看到结果,双击结果就可以看到全部的内置对象. 当然你也可以在content tab页, 在Direct3D 9->Reference->Effect Reference->Effect format->Effect states找到你想要的东西.

继续阅读

渲染管线以及directx的发展过程

 

本文摘抄自网页,以备日后学习之用。
显卡 : 什么是渲染管线 


渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的的并行处理单元。在某种程度上可以把渲染管线比喻为工厂里面常见的各种生产流水线,工厂里的生产流水线是为了提高产品的生产能力和效率,而渲染管线则是提高显卡的工作能力和效率。 
渲染管线的数量一般是以 像素渲染流水线的数量×每管线的纹理单元数量 来表示。例如,GeForce 6800Ultra的渲染管线是16×1,就表示其具有16条像素渲染流水线,每管线具有1个纹理单元;GeForce4 MX440的渲染管线是2×2,就表示其具有2条像素渲染流水线,每管线具有2个纹理单元等等,其余表示方式以此类推。 

渲染管线的数量是决定显示芯片性能和档次的最重要的参数之一,在相同的显卡核心频率下,更多的渲染管线也就意味着更大的像素填充率和纹理填充率,从显卡的渲染管线数量上可以大致判断出显卡的性能高低档次。但显卡性能并不仅仅只是取决于渲染管线的数量,同时还取决于显示核心架构、渲染管线的的执行效率、顶点着色单元的数量以及显卡的核心频率和显存频率等等方面。一般来说在相同的显示核心架构下,渲染管线越多也就意味着性能越高,例如16×1架构的GeForce 6800GT其性能要强于12×1架构的GeForce 6800,就象工厂里的采用相同技术的2条生产流水线的生产能力和效率要强于1条生产流水线那样;而在不同的显示核心架构下,渲染管线的数量多就并不意味着性能更好,例如4×2架构的GeForce2 GTS其性能就不如2×2架构的GeForce4 MX440,就象工厂里的采用了先进技术的1条流水线的生产能力和效率反而还要强于只采用了老技术的2条生产流水线那样。 



显卡 : 什么是顶点着色单元 



顶点着色单元是显示芯片内部用来处理顶点(Vertex)信息并完成着色工作的并行处理单元。顶点着色单元决定了显卡的三角形处理和生成能力,所以也是衡量显示芯片性能特别是3D性能的重要参数。 
顶点(Vertex)是图形学中的最基本元素,在三维空间中,每个顶点都拥有自己的坐标和颜色值等参数,三个顶点可以构成成一个三角形,而显卡所最终生成的立体画面则是由数量繁多的三角形构成的,而三角形数量的多少就决定了画面质量的高低,画面越真实越精美,就越需要数量更多的三角形来构成。顶点着色单元就是处理着些信息然后再送给像素渲染单元完成最后的贴图工作,最后再输出到显示器就成为我们所看到的3D画面。而显卡的顶点处理能力不足,就会导致要么降低画质,要么降低速度。 

在相同的显示核心下,顶点着色单元的数量就决定了显卡的性能高低,数量越多也就意味着性能越高,例如具有6个顶点着色单元的GeForce 6800GT就要比只具有5个顶点着色单元的GeForce 6800性能高:但在不同的显示核心架构下顶点着色单元的数量多则并不一定就意味着性能越高,这还要取决于顶点着色单元的效率以及显卡的其它参数,例如具有4个顶点着色单元的Radeon 9800Pro其性能还不如只具有3个顶点着色单元的GeForce 6600GT。 


DX9.0C 全称为DirectX9.0c。是微软公司的多媒体技术,很多运行于Windows 环境的新游戏需要DirectX。DirectX包含了对Direct3D、DirectDraw、DirectPlay、DirectSound、DirectInput等显示、声音以及系统的重要升级,是软硬件的接口。 





DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。 

DirectX 1.0 
第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基本都采用专业图形API-OpenGL,缺乏硬件的支持成了其流行的最大障碍。 
DirectX 1.0版本是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能(比如:显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括现在所有的3D功能,还处于一个初级阶段。 

DirectX 2.0 
DirectX 2.0在二维图形方面做了些改进,增加了一些动态效果,采用了Direct 3D的技术。这样DirectX 2.0与DirectX 1.0有了相当大的不同。在DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。 

DirectX 3.0 
DirectX 3.0的推出是在1997年最后一个版本的Windows95发布后不久,此时3D游戏开始深入人心,DirectX也逐渐得到软硬件厂商的认可。97年时应用程序接口标准共有三个,分别是专业的OpenGL接口,微软的DirectX D接口和3DFX公司的Glide接口。而那时的3DFX公司是最为强大的显卡制造商,它的Glide接口自然也受到最广泛的应用,但随着3DFX公司的没落,Voodoo显卡的衰败,Glide接口才逐渐消失了。 

DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多。包括对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)的一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。 

DirectX 5.0 
微软公司并没有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。 
同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。 

DirectX 6.0 
DirectX 6.0推出时,其最大的竞争对手之一Glide,已逐步走向了没落,而DirectX则得到了大多数厂商的认可。DirectX 6.0中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。 

DirectX 7.0 
DirectX 7.0最大的特色就是支持T&L,中文名称是“坐标转换和光源”。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。 

在T&L问世之前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显示卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。换句话说,拥有T&L显示卡,使用DirectX 7.0,即使没有高速的CPU,同样能流畅的跑3D游戏。 

DirectX 8.0 
DirectX 8.0的推出引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader)与顶点渲染引擎(Vertex Shader),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。此时DirectX的权威地位终于建成。 

DirectX 9.0 
2002年底,微软发布DirectX9.0。DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。 

PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。 

VS 2.0通过增加Vertex程序的灵活性,显著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。 

增加对浮点数据的处理功能,以前只能对整数进行处理,这样提高渲染精度,使最终处理的色彩格式达到电影级别。突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。 

显卡所支持的DirectX版本已成为评价显卡性能的标准,从显卡支持什么版本的DirectX,用户就可以分辨出显卡的性能高低,从而选择出适合于自己的显卡产品。 

ATI AVIVO视频技术的支持 (看下面的:) 
http://article.pchome.net/content-355631.html 

MPEG-2的硬件解码技术的支持 

MPEG-2 
MPEG-2制定于1994年,设计目标是高级工业标准的图象质量以及更高的传输率。MPEG-2所能提供的传输率在3-10Mbits/sec间,其在NTSC制式下的分辨率可达720X486,MPEG-2也可提供并能够提供广播级的视像和CD级的音质。MPEG-2的音频编码可提供左右中及两个环绕声道,以及一个加重低音声道,和多达7个伴音声道(DVD可有8种语言配音的原因)。由于MPEG-2在设计时的巧妙处理,使得大多数MPEG-2解码器也可播放MPEG-1格式的数据,如VCD。 

同时,由于MPEG-2的出色性能表现,已能适用于HDTV,使得原打算为HDTV设计的MPEG-3,还没出世就被抛弃了。(MPEG-3要求传输速率在20Mbits/sev-40Mbits/sec间,但这将使画面有轻度扭曲)。除了做为DVD的指定标准外,MPEG-2还可用于为广播,有线电视网,电缆网络以及卫星直播(DirectBroadcastSatellite)提供广播级的数字视频。 

MPEG-2的另一特点是,其可提供一个较广的范围改变压缩比,以适应不同画面质量,存储容量,以及带宽的要求。 

对于最终用户来说,由于现存电视机分辨率限制,MPEG-2所带来的高清晰度画面质量(如DVD画面)在电视上效果并不明显,到是其音频特性(如加重低音,多伴音声道等)更引人注目。 

MPEG-2的编码图像被分为三类,分别称为I帧,P帧和B帧。 

I帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。P帧和B帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P帧图像中可以包含帧内编码的部分,即P帧中的每一个宏块可以是前向预测,也可以是帧内编码。B帧图像采用双向时间预测,可以大大提高压缩倍数。 

MPEG-2的编码码流分为六个层次。为更好地表示编码数据,MPEG-2用句法规定了一个层次性结构。它分为六层,自上到下分别是:图像序列层、图像组(GOP)、图像、宏块条、宏块、块。 

继续阅读

D3D 材质和灯光

我们在生活中看到的光有环境光, 漫反射光以及璄面反射光还有物体本身发射的光. 因此我们在定义材质时就要描述对这些光反应.

看看材质结构体的定义:

 

typedef struct _D3DMATERIAL9 {
    D3DCOLORVALUE   Diffuse;        /* Diffuse color RGBA */
    D3DCOLORVALUE   Ambient;        /* Ambient color RGB */
    D3DCOLORVALUE   Specular;       /* Specular ‘shininess’ */
    D3DCOLORVALUE   Emissive;       /* Emissive color RGB */
    float           Power;          /* Sharpness if specular highlight */
} D3DMATERIAL9;

继续阅读

d3d全屏模式

d3d全屏模式

通常我们创建的d3d程序时都是非全屏模式, 但是游戏大部分是全屏模式, 怎么创建这两种模式呢?

创建的时候有2点不同: 创建窗口, 创建设备.

1. 创建普通模式:

a. 创建窗口:

    m_hMainWin = CreateWindowW( m_szWinClsName, m_szWinTitle, WS_OVERLAPPEDWINDOW
,

继续阅读