Direct3D纹理映射

2023-11-12

借助纹理映射技术,我们可将图像数据映射到三角形单元中,这种功能可以显著地增加所绘制场景的细节和真实感,例如创建一个立方体然后为其每个面映射一个板条纹理,从而将该立方体变为一个板条箱,在Direct3D中纹理用接口IDirect3DTexture9来表示,纹理是类似于表面的一个像素矩阵,与表面不同的是它可被映射到三角形单元中。

纹理坐标

Direct3D锁使用的纹理坐标系由沿水平方向的u轴和沿垂直方向的v轴构成,用坐标对(u,v)标识的纹理元素称为纹理元,注意v轴的正方向是竖直向下的

为了能够处理不同尺度的纹理,Direct3D将纹理坐标做了规范化处理,使之限定在区间[0,1]内,对于每个3D三角形单元,我们都可以在纹理中定义一个相应的三角形区域,然后将该三角形区域内的纹理映射到该3D三角形单元中,为了实现该映射,需要再次修改顶点结构,为之添加一个纹理坐标对以标识纹理中的顶点

struct TextureVertex
{
	TextureVertex(){}
	TextureVertex()
	{

	}
	float _x, _y, _z;
	float _nx, _ny, _nz;
	float _u, _v;			//纹理坐标
	static const DWORD FVF;
};
const DWORD TextureVertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1; //D3DFVF_TEX1表示顶点结构中包含了一对纹理坐标

现在由3个顶点对象构成的每个三角形都在该纹理坐标系中定义了一个相应的纹理三角形,虽然指定了,但直到光栅化时,即该3D三角形已被变换至屏幕坐标系时,纹理映射才会进行

创建并启用纹理

纹理数据通常从磁盘中的图像文件读入,然后再加载到IDirect3DTexture9对象中,可使用D3DXCreateTextureFromFile函数来实现,该函数可以加载下列格式的图像:BMP、DDS、DIB、JPG、PNG和TGA

HRESULT D3DXCreateTextureFromFile(
	LPDIRECT3DDEVICE9         pDevice,
	LPCSTR                    pSrcFile,
	LPDIRECT3DTEXTURE9*       ppTexture
);
IDirect3DTexture9* _stonewall;
D3DXCreateTextureFromFile(Device, "stonewall.bmp", &_stonewall);

HRESULT IDirect3DDevice9::SetTexture(
	DWORD Stage,	//纹理层
	IDirect3DBaseTexture9* pTexture
);

//禁用某一纹理层,可将pTexture参数设为0,绘制物体时若不想使用纹理可以这样做
Device->SetTexture(0, 0);
renderObjectWithoutTexture();

//如果场景中的各个三角形所使用的纹理均不相同
Device->SetTexture(0, tex0);
drawTrisUsingTex0();

Device->SetTexture(0, tex1);
drawTrisUsingTex1();

在Direct3D中,最多可设置8层纹理,可以对这些纹理进行组合以创建一幅更细致的图像,这称为多重纹理

纹理过滤器

通常纹理三角形与屏幕三角形的的大小并不一致,当纹理三角形与屏幕三角形大小不一致时,为适应后者,纹理三角形需要被放大或者缩小,这俩种情况都有畸变发生,为了从某种程度克服这类畸变,Direct采用了一项称为纹理过滤的技术。

Direct3D提供了3种类型的纹理过滤器,过滤器的质量越高,运算开销越大,处理速度越慢。纹理过滤方式可用方法SetSamplerState来设置。

最近点采样:Direct3D默认使用的过滤方式,该方式的处理速度最快,但效果最差,下面代码分别表示将最近点采样方式设置为放大过滤器和缩小过滤器

线性纹理过滤器:该类型的过滤方式可以产生相当好的结果,而且以目前的硬件配置水平也可获得较快的处理速度

各向异性纹理过滤:该类型的过滤方式可以产生最好的结果,但是处理速度也是最慢的,使用该过滤时,必须对D3DSAMP_MAXANISOTROPIC水平值进行设定,该值决定了各向异性过滤的质量水平。该值越大图像效果越好,请调用IDirect3DDevice::GetDeviceCaps函数检查返回的D3DCAPS9结构参数,以获得硬件支持的值的合法取值范围。

//设置最近点采样纹理过滤
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);

//将各向异性过滤的质量水平设置为4
Device->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 4);

多级渐进纹理

屏幕上的三角形通常与纹理三角形大小不一致,为了尽量消除由二者尺寸差异带来的影响,我们可为纹理创建一个多级渐进纹理链,方法是由某一个纹理创建一系列分辨率逐渐减小的纹理图像并且每种分辨率下的纹理所采用的过滤房还是进行定制,以便保留那些较重要的细节,在Direct3D中使用多级渐进纹理十分容易,如果硬件支持多级渐进纹理D3DXCreateTextureFromFile函数将创建一个多级渐进纹理链,此外Direct3D还将自动从纹理链中选择与屏幕三角形最匹配的那个一级纹理,所以由于可被Direct3D自动设置,而且处理时的时间和空间代价都比较低,多级渐进纹理得到了广泛应用。

多级渐进纹理过滤器

多级渐进纹理过滤器主要用于控制Direct3D使用多级渐进纹理的方式,可这样对多级渐进纹理过滤器进行如下设置

Device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter);

Filter可取以下值

D3DTEXF_NONE:禁用多级渐进纹理过滤器
D3DTEXF_POINT:通过使用该过滤器,Direct3D将选择尺寸与屏幕三角形最接近的那一级纹理,一旦选择了某一级纹理,Direct3D就会用指定的放大过滤器和缩小过滤器对该级纹理进行过滤
D3DTEXF_LINEAR:通过使用该过滤器,Direct3D将取与屏幕三角形尺寸最接近的俩个纹理级,用指定的放大过滤器和缩小过滤器对每级纹理进行过滤,然后再将这俩级纹理进行线性组合,从而形成最终的颜色值。

寻址模式

前面部分中,我们说过纹理坐标必须限制在区间[0,1]内,从技术角度讲是有问题的,因为有时坐标可能超出该范围,Direct3D定义了4种用来处理纹理坐标值超出[0,1]区间的纹理映射模式。分别是重复寻址模式(wrap)、边界颜色寻址模式(border color)、箝位寻址模式(clamp)、镜像寻址模式(mirror)。

//set wrap address mode
if (::GetAsyncKeyState('W') & 0x8000f)
{
	//表示对纹理的u方向或v方向设置纹理寻址模式
	Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
	Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); 
	//D3DTADDRESS_CLAMP、D3DTADDRESS_MIRROR
}

//set border color address mode
if (::GetAsyncKeyState('B') & 0x8000f)
{
	//表示对纹理的u方向或v方向设置纹理寻址模式
	Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
	Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
	Device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0x000000ff);
}

纹理四边形例程

1.构造组成物体的顶点,并为其指定纹理坐标
2.用函数D3DXCreateTextureFromFile为IDirect3DTexture9接口加载一种纹理
3.设置缩小/放大过滤器、和多级渐进纹理过滤器
4.绘制物体前,用函数IDirect3DDevice9::SetTexture来设定与该物体关联的纹理

bool SetUpTextureQuad()
{
	Device->CreateVertexBuffer(6 * sizeof(TextureVertex), D3DUSAGE_WRITEONLY, TextureVertex::FVF, D3DPOOL_MANAGED, &Quad, 0);
	TextureVertex* v;
	Quad->Lock(0, 0, (void**)&v, 0);
	v[0] = TextureVertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 3.0f);
	v[1] = TextureVertex(-1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
	v[2] = TextureVertex(1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 3.0f, 0.0f);

	v[3] = TextureVertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 3.0f);
	v[4] = TextureVertex(1.0f, 1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 3.0f, 0.0f);
	v[5] = TextureVertex(1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 3.0f, 3.0f);
	Quad->Unlock();
	
	D3DXCreateTextureFromFile(Device, "dx5_logo.bmp", &Tex);
	//启用纹理
	Device->SetTexture(0, Tex);
	//设置放大/缩小过滤器
	Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
	Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
	//设置渐进纹理过滤器
	Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

	//不使用光照
	Device->SetRenderState(D3DRS_LIGHTING, false);

	D3DXMATRIX proj;
	D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, (float)Width / (float)Height, 1.0f, 1000.0f);
	Device->SetTransform(D3DTS_PROJECTION, &proj);
	return true;
}

bool DisplayTextureQuad(float timeDelta)
{
	if (Device)
	{
		Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
		Device->BeginScene();
		Device->SetStreamSource(0, Quad, 0, sizeof(TextureVertex));
		Device->SetFVF(TextureVertex::FVF);
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
		Device->EndScene();
		Device->Present(0, 0, 0, 0);
	}
	return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Direct3D纹理映射 的相关文章

  • 10亿级数据量的系统性能优化设计,被惊艳到了!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 这篇文章 我们来聊一聊在十亿级的大数据量技术挑战下 世界上最优秀的大数据系统之一的Hadoop是如何将系统性能提升数十倍的 首先一起来画个图 回顾一下Hadoop H
  • 腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事

    最近发生了一件大事儿 APIJSON 再也不用担心被人质疑性能问题了哈哈 某周三腾讯 CSIG 某项目组 已经用 APIJSON 做完一期 突然反馈了查询大量数据性能急剧下降的情况 某张表 2 3KW 记录 用 APIJSON 万能通用接口
  • 性能测试指标全解

    最近在公司做压测时 对于各个监控工具的监控指标一脸蒙 有时候不清晰 有时候理解错误 于是 恶补基础知识 希望对广大网友有所帮助 一 性能测试指标 1 在线用户数 此指标指的是某个时间段内 在服务器上保持登录状态的用户数 在线用户数不等同于并
  • 【MySQL】《狂飙》电视剧火了,如果程序一直狂飙,扛不住了,怎么办呢?

    程序如果狂飙了怎么办呢 狂飙 电视剧你看了吗 程序 狂飙 你担心吗 性能优化步骤 适合创建索引的情况 不适合创建索引的情况 Explain 性能分析 id说明 select type 说明 type字段说明 Extra说明一下 狂飙 电视剧
  • Android性能优化—内存优化

    一 App内存组成以及管理 Android 给每个 App 分配一个 VM 让App运行在 dalvik 上 这样即使 App 崩溃也不会影响到系统 系统给 VM 分配了一定的内存大小 App 可以申请使用的内存大小不能超过此硬性逻辑限制
  • jpg、png、jpeg区别与压缩等知识总结 —— 性能优化篇

    jpeg jpeg是一个国家专家小组 同事也是一种算法名称 而用JPEG算法压缩出来的静态图片文件称为JPEG文件 扩展名通常为 jpg jpe jpeg JPEG文件大体上可以分成两个部分 标记码 Tag 和压缩数据 标记码由两个字节构成
  • 【项目经验】:项目中下拉框数据太多造成页面卡顿(二)

    一 项目需求 下拉框下拉列表数据是由后端返回的 而且他会变化 所以数据不是写死的而且数据量大 上一篇博客http t csdn cn sSNTa我们是用的数据懒加载的方式 这次我们使用远程搜索的方式解决这个问题 二 用到的组件方法介绍 fi
  • WPF性能优化经验总结

    原文地址 WPF性能优化经验总结 痴鸟 博客园 WPF性能优化一 Rendering Tier 1 根据硬件配置的不同 WPF采用不同的Rendering Tier做渲染 下列情况请特别注意 因为在这些情况下 即使是处于Rendering
  • 实践指南-前端性能提升 270%

    一 背景 当我们疲于开发一个接一个的需求时 很容易忘记去关注网站的性能 到了某一个节点 猛地发现 随着越来越多代码的堆积 网站变得越来越慢 本文就是从这样的一个背景出发 着手优化网站的前端性能 并总结出一套开发习惯 让我们在日常开发时 也保
  • 【性能优化】作为一名前端工程师,网页白屏了该怎么做

    上周面试被问到这个问题 磕磕绊绊地答了一点 写个博客记录一下解决的主要思路 检查网络连接 首先检查网络连接是否正常 如果网络不稳定或者中断了 可能会导致网页无法加载 F12开发者工具 查看控制台输出 查看错误与警告信息判断问题所在 检查网页
  • 前端性能优化:7.页面渲染优化

    本文将主要关注浏览器获取到资源后 进行渲染部分的相关优化内容 7 1 页面渲染性能 页面渲染阶段对性能体验的应i昂与资源加载阶段同样重要 而对于设计高交互频次的应用来说可能更加重要 本节将整个渲染过程划分为五个串行阶段进行概述 优化渲染的实
  • 性能测试,服务器资源监控工具nmon常用操作

    在性能测试过程中 对服务端的各项资源使用情况进行监控是很重要的一环 这篇博客 介绍下服务端监控工具 nmon的使用方法 一 认识nmon 1 简介 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具 它能在系统运行过程
  • 【包真】我的第一次webpack优化,首屏渲染从9s到1s

    大家好 我是猫小白 本文基于vue2 全文阅读大约需要3分钟 谈到webpack优化大部分人可能都看腻了 无非就那几招嘛 我之前也是看过许多类似的文章 但都没有自己真正上手过 下面是我用公司的项目真实操练下来的 首屏加载速度提升很大 刷刷的
  • React性能优化(完整版)

    我的博客 http wangxince site my demo markdown React 性能优化 1 减少 render 次数 shouldComponentUpdate PureComponent shouldComponentU
  • Android Studio TraceView性能优化分析

    http blog csdn net androiddevelop article details 8223805 http www cnblogs com sunzn p 3192231 html Android 编程下的 TraceVi
  • SIMD优化之ARM纯汇编开发

    ARM纯汇编开发 注 这篇文章是两年前写的 现在更新到CSDN 当时认知不足 其中可能有不少错误 敬请行家指正 为什么要用纯汇编 开发效率高 这里可能让很多人大跌眼镜了 纯汇编开发效率高 首先 这个是有限定条件的 需要反复调优的重度运算场景
  • 性能优化面试题

    目录 1 当修改一个数据时 不想整个页面都被重新渲染 只想要渲染变更数据的那一部分 怎么做 2 页面是否可以快速加载 3 是否允许用户快速开始与之交互 4 怎么让滚动和动画流畅 5 怎么图片优化 6 骨架屏 合理的loading 7 长列表
  • Direct3D光照

    光照的组成 环境光 这种类型的光经其他表面反射到达物体表面 并照亮整个场景 要想以较低代价粗略模拟这类反射光 环境光是一个很好的选择 漫射光 这种类型光沿着特定的方向传播 当它到达某一表面时 将沿着各个方向均匀反射 无论从哪个方位观察 表面
  • 最全前端性能优化总结

    最全前端性能优化总结 前端性能优化分两部分 一 加载性能优化 1 减少请求次数 为什么减少请求次数 减少请求次数方式 2 减少资源大小 减少资源大小方式 3 网络优化 其他 二 渲染性能优化 浏览器渲染过程 重排 重绘 渲染性能优化方式 三
  • 性能分析与调优: Linux 内存观测工具

    目录 一 实验 1 环境 2 vmstat 3 PSI 4 swapon 5 sar 6 slabtop 7 numstat 8 ps 9 top 10 pmap 11 perf 12 bpftrace 二 问题 1 接口读写报错 2 sl

随机推荐

  • 【WINDOWS / DOS 批处理】for命令详解(六)

    for命令详解 一 共十篇 for命令详解 二 共十篇 for命令详解 三 共十篇 for命令详解 四 共十篇 for命令详解 五 共十篇 for命令详解 六 共十篇 for命令详解 七 共十篇 for命令详解 八 共十篇 for命令详解
  • urlrewrite(伪静态技术运用2之outbound-rule)

    问题 页面通过 servlet detail magid 520 categoryId 205 来访问一个servlet 这个链接在IE地址栏上给人家看起来很不舒服 想把它伪装一下变成别的地址 例如想把它伪装成 servlet detail
  • 2019最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)

    近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 特别高的薪资都是直接技术面试或者是 现场编程 总结很多人的面试题 后期会对于单个知识点再说笔记详细讲解 部分都是百度的答案 不是特全面的 可以自己找 红色为常见面
  • vue 父子组件(个人笔记)

    目录 父组件使用子组件 父子组件之间传参 props 子获父 ref 子获父 this parent 子获父 emit 父获子 使用this emit 自定义事件名 所需要传的值 this children 父获子 父组件使用子组件 父组件
  • STM32 ADC 多通道16路电压采集

    下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序 采用USB接口与电脑连接 实则USB转串口方式 所以上位机可以用串口作为接口 电路图中利用LM324作为电压跟随器 起到保护单片机引脚的作用 直接在电脑USB取点
  • red5聊天功能--私聊的实现

    这里我是在服务器端进行转发 遍历当前所有连接 找到目标对象 然后调用客户端函数 不知道还有没有更好的方法 如果人数多 服务器要承受较的的压力 public boolean sendPrivateMsg String target Strin
  • Centos/linux根目录扩容、分区、挂载。LVM、物理卷、逻辑卷

    一 LVM结构 二 数据盘划分 磁盘情况 需要将vda vdb剩余资源划分给 data下 开始划分 创建磁盘分区 注意 并不要求分区的大小一致 同样 分区需要使用 8e 类型来使他们可用于LVM fdisk dev vda n gt p g
  • Unity调用摄像头获取拍摄画面

    using System Collections using UnityEngine public class Test MonoBehaviour public WebCamTexture cameraTexture public str
  • 酷应用背后,低代码正在被重估

    就当下的中国TO B企业而言 尤其是中大企业而言 复杂的场景和需求是阻碍数字化的最根本原因 而低代码恰可以以一种最原子化和最细颗粒度的数字模型来解决这个问题 帮助企业构建一个完整的 连贯的前端数字化应用 作者 皮爷 出品 产业家 生产计划
  • 华为机试题80-整型数组合并

    描述 题目标题 将两个整型数组按照升序合并 并且过滤掉重复数组元素 输出时相邻两数之间没有空格 输入描述 输入说明 按下列顺序输入 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数值 输出
  • 静态储存,堆,栈的理解

    数据结构中的堆与栈 栈 可以理解为为一个瓶子 他遵循着先进后出的原则 堆 是一种经过排序的树状结构 每一个节点都有一个值 我们通常说的堆是二叉堆 堆的特点是跟节点最大或者最小 且子节点也是一个堆 所以我们在使用的堆的时候 都是随便取一个节点
  • java ssh连接远程服务器_Ubuntu开启远程连接-开启ssh服务

    ssh分为openssh client与openssh server 如果要连接某个远程就需要装openssh client 反之如果要被其他远程连接本机就需要安装openssh server 我们安装完ubuntu之后会发现无法通过外部使
  • 【软路由】旁路由使用配置教程

    软路由 旁路由使用配置教程 简介 旁路由好处 旁路由配置步骤 1 修改管理地址网段 2 关闭IPV6和DHCP服务 3 防火墙设置 关于IP动态伪装 4 终端设置 简介 我们都知道 软路由一般有两种使用方式 一种是作为承担DHCP分配的主路
  • 【JavaScript高级程序设计】重点-第五章笔记:Date、RegExp、原始值包装类、单例内置对象

    文章目录 基本引用类型 1 Date 1 1 继承的方法 1 2 日期格式化方法 1 3 日期 时间组件方法 2 RegExp正则表达式 2 1 RegExp 实例属性 2 2 RegExp 实例方法 2 3 RegExp 构造函数属性 3
  • 【Dev-C++】的dos控制台窗口大小设置

    可以使用system 接口直接修改 例 include
  • Spring 集成OpenOffice

    第一步 openoffice jar包依赖
  • 安卓scale动画fromDegrees toDegrees解释

    注意以下实验都是相对于自己 0 0f 上 1 0f 下 如果想了解安卓scale动画pivotX 请点击这里 在安卓中 fromDegrees是开始的角度 toDegrees是介绍的角度 其中X轴右面是0度 如果toDegrees比from
  • 【JS组件篇】使用拖拽组件 react-beautiful-dnd 实现工作台自定义布局功能

    项目要求 制作工作台页面 模块可根据后端配置动态展示 各模块可根据个人喜好进行拖拽布局 并保存 大致效果如下 大致实现步骤 整体布局 首先需要对设计稿进行分析 大致分为左右两部分 可根据后端配置动态展示左右两模块的展示内容 各模块相对独立
  • C++内存管理(2)new、delete详解

    目录 new operator new操作 new类对象时加不加括号的差别 new工作任务 delete工作任务 new和delete 堆区空间操作 对比malloc和free new和delete操作基本类型的空间 new和delete操
  • Direct3D纹理映射

    借助纹理映射技术 我们可将图像数据映射到三角形单元中 这种功能可以显著地增加所绘制场景的细节和真实感 例如创建一个立方体然后为其每个面映射一个板条纹理 从而将该立方体变为一个板条箱 在Direct3D中纹理用接口IDirect3DTextu