清华大学DirectX游戏编程第19章(全20章).ppt_第1页
清华大学DirectX游戏编程第19章(全20章).ppt_第2页
清华大学DirectX游戏编程第19章(全20章).ppt_第3页
清华大学DirectX游戏编程第19章(全20章).ppt_第4页
清华大学DirectX游戏编程第19章(全20章).ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2.第19章:像素着色器简介。主要目的:对多重纹理的概念有一个大致的了解。了解如何编写、创建和应用像素着色器。了解如何使用像素着色器来实现多个纹理。3,19.1多纹理概述,多纹理可能是用户可以通过像素着色器实现的最简单的技术。例如,为了实现聚光灯照在木箱上的照明效果,可以用D3DLIGHT9结构定义一个聚光灯光源,或者用木箱上的多个纹理照亮聚光灯来实现,如图19.1所示。这里,纹理是通过将两个纹理图上对应的纹理元素相乘而混合的。4,19.1多重纹理概述,灯光效果是通过混合多重纹理实现的(在本章的例子中,我们使用了两个纹理)。与使用Direct3D的光照模型相比,有两个主要的优点:第一,光照效果

2、已经预先计算并存储在光照纹理中,所以在程序执行时不需要计算光照,可以减少处理时间。当然,这种方法只适用于静态物体。其次,由于光照纹理是预先计算的,我们可以使用比Direct3D更精确和复杂的光照模型来增加场景的真实感。5,19.1.1启用多个纹理,并通过直接3D设备9:3360设置采样状态方法设置纹理采样状态。它们的原型如下:HRESULT iDirect 3D设备933603360设置纹理(DWORD Stage,/指定纹理阶段索引IDRECT3D BaseTexture 9 * pTexture);HRESULT IDirect3dDevice 933603360 setSamplerSt

3、ate(DWORD采样器,/指定采样器级索引D3DSAMPLERSTATETYPE类型,DWORD值);6,19.1.2多纹理坐标,例如,如果我们启用并混合三个纹理,那么每个顶点必须包含三对纹理坐标。下面是启用了三个纹理的顶点结构,用于多纹理处理:参考教科书P312灵活顶点格式,它设置了一个新的标志位D3DFVF_TEX3,表示这个顶点结构包含三对纹理坐标,每个顶点在一个固定的函数管道中最多可以包含八对顶点坐标。对于7,19.2像素着色器的输入和输出,有必要向像素着色器输入两条信息:每个像素的颜色值及其对应的纹理坐标。每个像素的纹理坐标是一对(u,v)坐标,用于指定纹理上的纹理元素和像素之间的

4、对应关系。Direct3D将根据顶点的颜色值和纹理坐标计算每个像素的颜色值和纹理坐标,然后将这些信息输入到像素着色器。颜色值和纹理坐标的数量取决于顶点着色器输出多少颜色值和纹理坐标。例如,如果顶点着色器输出两个颜色值和三个纹理坐标值,Direct3D将为每个像素计算两个颜色值和三个纹理坐标值,并将它们输入到像素着色器。在像素着色器编程中,颜色值和纹理坐标值通常以变量的形式输入像素着色器。上面的例子可以写成这样的代码:当参考课本P313输出时,像素着色器将输出对应于它所计算的每个像素的唯一颜色值:structp _ Output vector Finalix ElColor 3360 Color

5、 0;9,19.3使用像素着色器的步骤,以下是创建和使用像素着色器必须完成的步骤列表。(1)编写并编译像素着色器程序。(2)创建一个IDirect3DPixelShader9接口来表示编译后的像素着色器代码。(3)使用iddirect 3d device 9:3360 setPixel Shader方法启用像素着色器。10,19.3.1编写和编译像素着色器程序。编译像素着色器的方法类似于编译顶点着色器的方法。首先,必须编写一个像素着色器程序。在这本书里,着色器是HLSL写的。编写完着色器代码后,通过调用第17.2节中介绍的D3DXCompileShaderFromFile函数来编译它。该函数将

6、返回一个指向ID3DXBuffer的指针,该指针包含已编译的着色器代码。,11,19.3.2创建像素着色器。在编译了Shader代码之后,您可以通过下面的函数获得一个指向IDirect3DPixelShader9接口(它代表一个像素着色器)的指针:参考教科书P314,假设Shader是一个包含编译代码的ID3DXBuffer。为了得到IDiect3dPixelshader 9接口,可以通过以下方法实现:IDiect3dPixelshader 9 * MultiTexps=0;HR=设备-创建像素着色器(dword *)着色器-getbufferpointer(),12,19.3.3设置一个像素

7、着色器,并获取指向IDirect3DPixelShader9接口的指针。您可以通过以下方法启用像素着色器:hresult idirect 3d device 9: set pixel着色器(idirect3dpixelshader9 * p着色器);此方法的唯一参数是指向要启用的像素着色器的指针。要启用第19.3.2节中创建的着色器,代码如下:设备设置像素着色器(MultiTexps);13,19.3.4破坏一个像素着色器,所有的Direct3D接口在发布时都需要调用它的释演法。要销毁19.3.2节中创建的像素着色器,代码如下:d3d:3360版本(multi texps);14、19.4 H

8、LSL采样对象,纹理采样控制由HLSL的特殊tex*系列函数在Pixel Shader中实现。一般来说,这些函数需要指定两个参数:(u,v)纹理坐标,用于索引纹理。要索引的纹理。纹理坐标以输入信息的形式传输到像素着色器。在像素着色器中,要索引的纹理由特定的HLSL对象采样器指定。15,19.4 HLSL采样对象,Direct3D将为每个采样对象指定一个唯一的纹理级别。然后,在应用程序中,找出每个采样器对应的纹理阶段,并为每个阶段指定纹理和采样状态。下面的代码显示了应用程序如何为FirstTex设置纹理和采样状态:参见教科书P316,16,19.5示例:通过像素着色器实现多个纹理,该示例说明了如

9、何通过像素着色器实现多个纹理。我们将在一个正方形上实现图19.2中“结果”的多重纹理效果。这种纹理效果是通过混合木板纹理、探照灯光照纹理和包含“像素着色器_采样_纹理”的纹理获得的,其中B、S和T分别表示木框纹理、聚光灯纹理和文本纹理上纹理元素的颜色值。17,19.5示例:要通过Pixel Shader实现多个纹理,Pixel Shader使用两个纹理实现多个纹理处理的代码如下:参考课本P318。首先,像素着色器声明三个采样器对象,每个对象对应一个要混合的纹理。然后定义输入和输出结构。Basetex用于保存表面的颜色信息,spotlighttex用于保存照明纹理。像素着色器输出最终计算的每个顶

10、点的唯一颜色信息。主函数通过纹理2D函数对纹理进行采样。18,19.5示例:多纹理由像素着色器(Pixel Shader)实现,多纹理示例的顶点结构声明如下:参见教科书P319设置函数主要完成以下任务:用描述正方形的顶点填充顶点缓冲区。编译像素着色器。创建像素着色器。加载纹理。设置投影矩阵并关闭照明。获取采样器对象的句柄。获取采样器对象的描述信息。设置功能的代码如下:参考课本P320、19、19.5,例如:通过像素着色器实现多个纹理,在显示功能中设置像素着色器,启用两个纹理,在渲染正方形前设置相应的采样状态;参考课本P322,最后记住在清理功能中释放所有分配的接口:void clean up()d3d :3360 release(quad VB);d3d : release(BaseTex);d3d : release(Spotlighttex);d3d:Release版本(StringTex);d3d:Release(多线程);d3d:Release版本(多项交换);20,19.6节,像素着色器代替固定功能管道中的多个纹理阶段。此外

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论