D3D9学习笔记之纹理映射
学习目标:
- 了解如何将纹理的某一部分映射到三角形单元中
- 创建纹理
- 纹理应如何过滤使之创建一副较光滑的图像
什么是纹理映射?:
借助纹理映射技术,可将图像数据映射到三角形单元中,这种功能可以显著地增加所绘制场景的细节和真实感。
例如,创建一个立方体,然后为其每一面映射一个木材纹理,从而将该立方体变成一个木头箱子。
纹理接口: 在 Direct3D 中,纹理用接口 IDirect3DTexture9 来表示。纹理是类似于表面的一个像素矩阵,于表面不同的是它可被映射到三角形单元中。
//纹理接口
IDirect3DTexture9
纹理坐标:
Direct3D 所使用的纹理坐标系由沿水平方向的 u 轴和沿垂直方向的 v 轴构成,用坐标对(u,v)标识的纹理元素称为纹理元,注意,v 轴的正方向是竖直向下的。
对于每个 3D 三角形单元,我们都可以在纹理中定义一个相应的三角形区域,然后将该三角形区域内的纹理映射到该 3D 三角形单元中。
注意: 纹理坐标系有时亦称为纹理空间
注意: 为了能够处理不同尺寸的纹理,Direct3D 将纹理坐标做来规范化处理,使之限定在区间【0-1】内
添加纹理到自定义顶点结构:
为了实现纹理映射,需要添加纹理坐标到自定义的顶点结构中,为之添加一个纹理坐标对【u,v】,以标识纹理中的顶点
struct Vertex
{float x, y, z; //顶点float nx, ny, nz; //法向量float u,v; //纹理坐标static const DWORD FVF;
}
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
D3DFVF_TEX1: 该标记表示在自定义的顶点结构中包含来一对纹理坐标
注意: 纹理映射直到光栅化阶段,即该 3D 三角形已被变换至屏幕坐标系时纹理坐标才会进行
创建并启用纹理:
纹理数据是一副图像,通常从图像文件中读入再加载到 IDirect3DTexture9 对象中,为实现这一点,可使用如下 D3DX 函数:
HRESULT D3DXCreateTextureFromFile(LPDIRECT3DDEVICE9 pDevice, //设备LPCWSTR pSrcFile, //要加载的图像的文件名LPDIRECT3DTEXTURE9* ppTexture); //接收创建的纹理
- pDevice: 创建纹理的设备
- pSrcFile:要加载的图像的文件名
- ppTexture:接收创建的纹理
- 该函数可以加载的图像:BMP, DDS, DIB, JPG, PNG, TGA
加载纹理文件:
IDirect3DTexture9* _stonewall;
D3DXCreateTextureFromFile(device, "stonewall.bmp", &_stonewall);
设置当前纹理:
HRESULT IDirect3DDeviceq::SetTexture(DWORD Stage, //范围为0-7的值,用于标识纹理阶段-参见纹理阶段注释IDirect3DBaseTexture9* pTexture //要设置的纹理
);
例:
Device->SetTexture(0, _stonewall);
注意: 在 Direct3D 中,最多可设置 8 层纹理,可以对这些纹理进行组合以创建一副更细致的图像,这称为多重纹理。
禁用纹理:
若想禁用某一纹理层,可将 pTexture 参数设为 0,例如,绘制物体时若不使用纹理,可以这样做:
Device->SetTexture(0, 0);
renderObjectWithoutTexture();
使用不同纹理:
如果场景中的各个三角形所使用的纹理均不相同,我们可以按照下面的套路来做:
Device->SetTexture(0, tex0);
drawTrisUsingTex0();Device->SetTexture(0, tex1);
drawTrisUsingTex1();
纹理过滤器:
因纹理图片与投影平面尺寸不一致,为了克服纹理映射产生的畸变,故而产生来纹理过滤技术。
纹理将被映射到屏幕空间,通常纹理三角形与屏幕三角形的大小并不一致,当纹理三角形比屏幕三角形小时,为适应后者,纹理三角形必须被缩小,在上诉两种情况下,都有畸变产生。为了从某种程度上克服这类畸变,Direct3D 采用了一项称为纹理过滤的技术。
Direct3D 提供了3种类型的纹理过滤器,每种过滤器都提供来一种质量水平,质量越高,运算开销越大,处理速度越慢。
所以必须在质量和处理速度之间权衡。
纹理过滤方式设置:
- 最近采样点:这是 Direct3D 默认使用的过滤方式,该方式速度最快,效果最差。下面的代码分别表示将最近点采样方式设置为放大过滤器和缩小过滤器。
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); //默认,放大过滤器
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); //默认,缩小过滤器
- 线性纹理过滤: 该类型的过滤方式产生相当好的结果,而且可获得较快的处理速度,建议至少使用线性纹理过滤方式。下面的代码演示了如何将线性纹理过滤设置为放大过滤器和缩小过滤器。
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); //线性纹理,放大过滤器
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); //线性纹理,缩小过滤器
- 各项异性纹理过滤: 该类型过滤方式效果最好,但处理速度最慢。下面的代码演示如何将各向异性纹理过滤设置为放大过滤器和缩小过滤器。
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC); //各项异性纹理过滤,放大过滤器
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); //各项异性纹理过滤,放大过滤器
注意: 使用各项异性纹理过滤器时,必须对 D3DSAMP_MAXANISOTROPIC 水平值进行设定,该值决定来各项异性过滤的质量水平。该值越大,图像效果越好。示范如下:
//先调用 IDirect3DDevice9::GetDeviceCaps 函数检查返回的 D3DCAPS9 结构参数,以获得硬件支持的值的合法取值范围。
//下面的代码中将该值设为4
device->SetSamplerState(0, D3DSAMP_MAXANISOTROPIC, 4);
多级渐进纹理
屏幕上的三角形通常与纹理三角形大小不一致,为了尽量消除由二者尺寸差异带来的影响,我们可为纹理创建一个多级渐进纹理链。方法是: 由某一纹理创建一系列分辨率逐渐减小的纹理图像,并且对每种分辨率下的纹理所采用的过滤方式进行定制,以便保留那些较重要的细节。
注意: 一个多级渐进纹理链中,每级纹理的宽度和高度都是上一级纹理的一半
多级渐进纹理过滤器:
多级渐进纹理过滤器主要用于控制 Direct3D 使用多级渐进纹理的方式,您可这样对几级渐进纹理过滤器进行如下设置:
device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter);
Filter 取值如下:
- D3DTEXF_NONE : 禁用多级渐进纹理过滤器
- D3DTEXF_POINT : 通过使用该过滤器,Direct3D将选择尺寸与屏幕三角形最接近的那一级纹理。一旦选择来某一级纹理,Direct3D 就会用指定的放大过滤器和缩小过滤器对该级纹理进行过滤
- D3DTEXF_LINEAR : 通过使用该过滤器,Direct3D 将取与屏幕三角形尺寸最接近的两个纹理级,用指定的放大过滤器和缩小过滤器对每级纹理进行过滤,然后再将这两级纹理进行线性组合,从而形成最终的颜色值
使用多级渐进纹理:
在 Direct3D 中使用多级渐进纹理十分容易,如果硬件支持多级渐进纹理,D3DXCreateTextureFromFile 函数将为您创建一个多级渐进纹理链,此外,Direct3D 还将自动从纹理链中选择与屏幕三角形最匹配的那一级纹理,所以,由于可被 Direct3D 自动设置,而且处理时的时间和空间代价都较低,多级渐进纹理得到来广泛的应用。
寻址模式:
在前面的部分中说过纹理坐标必须限制在区间【0-1】内,从技术角度讲,这是有问题的,因为有时坐标可能超出该范围。
Direct3D 定义了4种用来处理纹理坐标值超出【0-1】区间的纹理映射模式,它们分别是:
- 重复寻址模式
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- 边界颜色寻址模式
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0x0000ffff);
- clamp寻址模式
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- 镜像寻址模式
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
- 以上4种模式效果不好说明,请实验得知
D3D9学习笔记之纹理映射相关推荐
- D3D9学习笔记之模板
学习目标: 理解模板缓存的工作原理,如何创建模板缓存以及如何对模板缓存进行控制 了解如何实现镜面效果,以及如何使用模板缓存阻止物体映像在非镜面区域中的绘制 掌握如何绘制阴影,以及如何借助模板缓存阻止& ...
- D3D9学习笔记(三) Device
2.1架构 2.2类型 基本的device类型:hal:硬件渲染(发布).这也不是直接访问硬件驱动,而是访问在上一层的hal.(在顶点处理过程中,如果硬件处理失败,可尝试混合处理及纯软处理,设定标志D ...
- D3D9学习笔记(四) 绘制
1直接使用vertex buffer绘制 使用IDirect3DDevice9::DrawPrimitive绘制 HRESULT DrawPrimitive( [in] D3DPRIMITIVETY ...
- OpenGL_Qt学习笔记之_05(纹理映射)(转)
转自:http://www.cnblogs.com/tornadomeet/archive/2012/08/24/2654719.html 纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个 ...
- OpenGL_Qt学习笔记之_05(纹理映射)
纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个词好专业(毕竟没有学过图形学),后面经过网上查找资料和这次实验稍微理解了点.纹理映射简单的讲,就是把一个纹理(其实说白了,纹理可以理解为一幅 ...
- DirectX9 ShadowMap例子学习笔记
本文版权归博客园 mavaL所有,如有转载请按如下方式详细标明原创作者及出处,以示尊重!! 原创作者:mavaL 原文链接:DirectX9 ShadowMap例子学习笔记 学习SDK例子真是快速加 ...
- WebGL three.js学习笔记 6种类型的纹理介绍及应用
WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...
- 3D目标检测学习笔记
博主初学3D目标检测,此前没有相关学习背景,小白一枚-现阶段的学习重点是点云相关的3D检测. 本文是阅读文章:3D Object Detection for Autonomous Driving: A ...
- LearnOpenGL学习笔记—PBR:IBL
LearnOpenGL学习笔记-PBR:IBL 0 引入 1 渲染方程的求解 2 hdr文件转成cubemap 3 预计算漫反射积分 4 预计算镜面反射积分 4.1 预滤波HDR环境贴图 4.1.1 ...
最新文章
- ASP.NET Web API
- mongoDB删除某个字段(key)
- python中使用if __name__ == '__main__':
- OkHttp源码深度解析
- 给大家推荐一款高逼格的Linux磁盘信息查看工具
- 使用C# 探索 ML.NET 中的不同机器学习任务
- jzoj3056-数字【数位dp,统计,容斥】
- c语言学习与应用 北京邮电大学出版社,《C语言程序设计与应用》低价购书_计算机与互联网_孔网...
- 美国纽约拟将电话亭变WiFi热点
- python标准库math用来计算平方根的函数_《Python程序设计》试试题题库
- AX向在线用户发送消息
- python中如何判断一个变量的数据类型?(原创)
- 八类网线和七类网线的区别_Cat8 八类网线与超五类网线、六类网线、超六类网线及七类/超七类网线的区别...
- python BeautifulSoup对应关系
- 【Hoxton.SR1版本】Spring Cloud Eureka服务注册中心集群搭建
- blender中常用快捷键的总结
- 自定义View - 仿QQ运动步数效果
- 项目实战:Qt贝塞尔曲线拽托顶点实时显示工具
- 如何去掉html中input的边框
- 儒道墨法,诸子百家中影响最大的四家之于今人的意义