随笔分类 - D3D
摘要:通常在图形编程中,需要能够将场景渲染到纹理上,并且针对某些目的可以使用这些纹理,例如,也许想在游戏中有一个安全监视器,游戏中间有一个电视屏可以在不同的位置显示游戏的状态。这对游戏玩家而言,非常有用,并且可以在很大程度上提高程序的真实感。同样,也可以使用幕外渲染技术创建映射、阴影映射纹理和大量如场地模糊、夜视、热视力、高精度动态范围渲染等许多不同的后处理效果。在Direct3D中实现幕外渲染需要创建幕外表面,并对其渲染而不是渲染到常用的后台缓存中。然后将渲染结果存储在贴在幕外表面上的纹理图像中。并且可以像所有常用的纹理图像一样使用。要增加幕外渲染功能,只要创建一个LPDIRECT3DSURFAC
阅读全文
摘要:在图形应用程序中,读者也希望为显示在屏幕上的内容保存一幅屏幕截图。这非常有用。幸运的是,在Direct3D中创建和保存屏幕截图非常简单明了。为了实现该功能,需要获取当前已渲染好的场景宽度和高度,创建Direct3D表面,将渲染后的场景复制到创建好的表面对象中,然后调用一个Direct3D函数将表面保存到Direct3D支持的文件格式中。该文件格式可以是前面讨论过的任何标准文件类型,如.jpg、.tga或.bmp。这意味着为了保存程序屏幕截图,就要使用4个函数。1.首先要获取当前的显示模式。这样就可以获取像渲染场景宽度和高度这样的信息。2.接下来,要创建一个幕外表面。该表面用于存储已渲染好的场景
阅读全文
摘要:使用Direct3D创建凸凹贴图在Direct3D中创建凸凹纹理贴图是非常简单的过程。使用D3DX函数D3DXComputeNormalMap()即可将Direct3D支持的所有图像格式转换成凸凹贴图。使用Direct3D函数计算法线贴图的最大优势就是在使用这些图片时,不需要知道图的生成方式。同样,还可以使用另一个D3DX函数D3DXSaveTextureToFile(),将新生成的凸凹贴图保存到文件中。D3DXComputeNormalMap()函数原型非常简单,参数pTexture是保存法线贴图的Direct3D纹理对象。参数pSrcTexture是想要转换成法线贴图的原始图像。参数pSr
阅读全文
摘要:GetLevelDesc函数在MSDN中:Retrieves a level description of a texture resource.HRESULT GetLevelDesc( UINT Level, D3DSURFACE_DESC * pDesc);ParametersLevel[in] Identifies a level of the texture resource. This method returns asurface description for the level specified by this parameter.pDesc[out] Pointer to
阅读全文
摘要:在游戏开发的早期,游戏都是2D的。这些2D游戏通常有带有sprite特征和对象的滚动背景。游戏中的sprite只是显示在屏幕上的物体的2D图像。通过轻微改变对象,可以让这些sprite产生动画,从而有一种运动的外观,而这与卡通动画系列中所做的工作一样。如果读者曾经见过一本活页书,就会对sprite动画有一个明确的了解。动画的每一帧代表了每幅图像轻微的变化。例如,想象有一幅人物静静站着的图像,然后下一系列的人物图像是他的腿慢慢的抬起。要一直这样做,只到有一幅人物走动的完整动画为止。从本质上讲,sprite只是一个2D图像集合,它使用alpha通道,分解图像中希望不可见的像素。为了让sprite显
阅读全文
摘要:在将图像施加到表面时,并非图像的所有部分都是可见的。例如,如果有一幅叶子的图像,并且只想看到图像中实际构成叶子的那一部分内容,而不是空的场景,就需要使用名为“透明度”的技术,以帮助实现预期效果。有了透明度,就可以设置图像的一些像素可见,而另一些像素不可见。 使用RGBA纹理图像中的Alpha成分或顶点颜色的alpha成分可以控制透明度。同样,可以将像素设为半透明,而不是可见或不可见。这意味着图像的某些部分在某种程度上是可见的,而某种程度上像玻璃一样是可以看穿的。这对于像菜单或GUI对象、窗口、X射线视觉等这样的东西而言非常有用。控制图像的alpha通道或是顶点颜色的alpha通道可以控制显示给
阅读全文
摘要:多纹理贴图的基本要素就是使用多个纹理。创建和加载多个Direct3D纹理对象即可实现。当使用硬件多纹理渲染纹理时,要为每个顶点指定两套纹理坐标。这只需在顶点结构中另外添加两个浮点成员变量即可完成,即在FVF中用D3DFVF_TEX2替换D3DFVF_TEX。code:#include<d3d9.h>#include<d3dx9.h>#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "D3D Multi-Texture Mapping"#define WINDOW_WIDTH 640#d
阅读全文
摘要:纹理映射是一种将图形施加到表面的技术。以简单的一堵墙为例,这种技术可以只需要两个绘制有砖纹理的三角形即可。这样就可以为表面增加大量的细节,而不必使用大量的多边形。纹理映射使用了图像数据并将图像数据绘制(映射)到表面上。该表面看上去就像有一幅图在它上面。所以,如果有一堵墙,并将砖块的纹理施加到这堵墙上面,那么即便只是这个表面使用了两个三角形,它看上去也像场景中的一堵墙。 Direct3D中的纹理就是一幅映射到表面上的图像,这样可以让表面显示比实际上更多的细节。在3D场景中实现纹理映射,最常见的方法是从外部文件加载图像数据。该文件可以存在于硬盘、软盘或光盘等载体上,同样该文件可以在场景中的多个表.
阅读全文
摘要:该游戏项目一开始先创建名为light.h、material.h的两个文件。light.h头文件用于创建灯源结构,该结构用于创建Direct3D中的灯源对象。以某种方式实现该结构,这样也可将其用于OpenGL或其他渲染系统。光源结构模仿了Direct3D中的D3DLIGHT结构,所以它们是完全兼容的。light.h#ifndef _UGP_LIGHT_H_#define _UGP_LIGHT_H_struct stLight{ stLight() { type = 0; posX = 0, posY = 0, posZ = 0; dirX = 0, dirY...
阅读全文
摘要:在Direct3D中创建光源相对比较简单,因为只是为了使用光源,而不需要知道太多Direct3D内部使用的算法。所以即使对先前光照和阴影的讨论一头雾水,也不用担心。有一些亲自实践的经历之后,读者就可以使用Direct3D中的光照,而不必知道它的工作机理或自己动手计算光照方程。默认情况下,即使没有指定任何光源,Direct3D也会打开硬件光照。到目前为止,都是将其设置为FALSE,那是因为还没有用到光照。在初始化中调用SetRenderState()函数,并将该函数的参数D3DRS_LIGHTING设为FALSE。 为了在Direct3D中创建光源,必须创建一个D3DLIGHT对象。为了方便..
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Built-in Direct3D Shapes"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool InitializeD3D(HWND hWnd, bool fullscreen);bool InitializeObjects();void RenderScen
阅读全文
摘要:通常在计算机图形学中有三类光源需要考虑,分别是点光源、聚光光源和方向性光源。每类光源分别描述了日常生活中见到的不同类型的光。例如,点光源可以是某个距离上向所有方向发光的任何光源,如灯泡;聚光光源通过圆锥发光,如闪光灯;而方向光则是从特定的方向,但是无法辨别的光源处发光。【注意】 方向光不同于点光和聚光的是,现实世界中并没有这样的光。另一方面,在计算机图形学中,它们确实存在而且可以由数学计算得到。 1. 点光源如本章前面所提到的一样,点光源是一种在某个距离上向所有方向发光的光源。随着光传播一定的距离,它会损失一定的能量而且亮度也会逐渐降低。可以将点光源认为是灯泡、蜡烛,或是在一定距离上可以发光的
阅读全文
摘要:工程GameProject1: main.h, main.cpp这两个文件用于创建游戏Stranded。工程GameEngine:RenderInterface.h, D3DRenderer.h, D3DRenderer.cpp, engine.h, defines.h.D3DRenderer.h和D3DRenderer.cpp用于创建Direct3D渲染系统;RenderInterface.h文件是一个基类,D3DRenderer就是从该类派生出来的;engine.h和defines.h包含了游戏引擎中要用到的Define(定义)、Function Prototype(函数原型)、Enume
阅读全文
摘要:2.3 引擎规划 和当今的商业游戏引擎相比较而言,本书中这个构建在游戏上的游戏引擎,显得微不足道。游戏Stranded的引擎小到足以包含在单独一个库中。由于游戏引擎取决于开发人员的需求,因此开发或分割游戏引擎的正确方法不止一种。通常,最好是将无关的系统分割成不同的动态链接库(DLL),这样可以更方便地将改动过的软件更新、修改和重新发布给用户。如果有任何类型的更新,那么将全部.exe文件重新发布给已经购买该款游戏的用户很不经济。只要开发人员重新发布一个动态链接库(DLL)(只是整个语系中的一小部分),那么效率将会提高很多。虽然现在的宽带Internet使得下载更新信息的速度比过去快很多,但目前所
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Template"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool InitializeD3D
阅读全文
摘要:使用诸如Direct3D这样的渲染API在屏幕上渲染图形时,就会碰到所谓的“透支”(指的是渲染全景造成的内存浪费)问题。当在屏幕上绘制交迭(重爹)的两个或多个图元时,就会出现透支。这些图元有不同的位置,但在屏幕上渲染时,它们交迭在一起。因为Direct3D不知道要绘制的图元的先后顺序,所以会出现透支问题。Direct3D不仅不知道是哪个图元遮住了哪个图元,而且还不知道是哪个图元部分遮住了其他物体。解决透支问题的一个办法是使用一种名为“深度缓存或z缓存”的缓存。深度缓存是一个后台缓存,它类似于OpenGL和Direct3D这样的API渲染,存储场景深度信息。当绘制图元时,将物体的深度信息和深度缓
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "View Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool Initialize
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "World Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes...bool Initializ
阅读全文
摘要:无论计算机图形技术如何发展,只要它以二维的屏幕作为显示介质,那么它显示的图像即使多么的有立体感,也还是二维的。有时我会想,有没有以某个空间作为显示介质的的可能呢,不过即使有,也只能是显示某个范围内的图像,不可能有无限大的空间作为显示介质,如果有,那就是现实世界了。 既然显示器的屏幕是二维的,那么我们就要对图像作些处理,让它可以欺骗我们的眼睛,产生一种立体的真实感。在D3D中,这种处理就是一系列的空间变换,从模型空间变到世界空间,再变到视图空间,最后投影到我们的显示器屏幕上。·世界空间与世界矩阵 什么是模型空间呢?每个模型(3D物体)都有它自己的空间,空间的中心(原点)就是模型的中心。
阅读全文
摘要:#include<d3d9.h>#include<d3dx9.h>#pragma comment(lib, "d3d9.lib")#pragma comment(lib, "d3dx9.lib")#define WINDOW_CLASS "UGPDX"#define WINDOW_NAME "Perspective Projection Matrix"#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480// Function Prototypes
阅读全文

浙公网安备 33010602011771号