DrectX11学习笔记之Texture2D相关



  HRESULT CTex_DX11::LoadTex(const TP_BOX *pDstBox, const void *pSrcData,

UINT SrcRowPitch, UINT SrcDepthPitch)其中参数UINT SrcRowPitch真正含义没搞清楚,结果耽误了好久时间,下边对其进行解释说明:

在SDK中对参数UINT SrcRowPitch解释为:

The pitch, or width, or physical size (in bytes), of one row of an uncompressed texture.

当对一个ID3D11Texture2D进行Map操作时,会遇到D3D11_MAPPED_TEXTURE2D结构。该结构有一个属性是UINT RowPitch,如果没有很好的理解这个属性的含义,Map操作的结果很有可能是不对的。

一个普通texture一行的字节总数就是它的RowPitch。但要特别注意的是:RowPitch并不就等于Texture2D的width乘以其每个纹元(texel)的字节数,即:

RowPitch ≠ width* sizeof (pixelFormat)

RowPitch总是大于等于后者,并且一般是等于一个2的n次幂。从上面也可以看出Pitch是以字节为单位,而width是以像素为单位的。

举例说明:

一个ID3D11Texture2D,创建它时所使用的D3D10_TEXTURE2D_DESC结构的Format属性是DXGI_FORMAT_R32G32B32A32_FLOAT,即一个纹元占16(4×4)个字节,Width属性是400,即每一行有400个纹元,则可计算每一行16 * 400 = 6400bytes。但如果对Texture2D进行Map操作时,可以发现,Map后所得到的D3D10_MAPPED_TEXTURE2D结构的RowPitch的值却是8192(是大于6400的最小的2的n次幂)。

所以在进行Map操作时,需要针对RowPitch,而不要依赖定义texture时的width。

但是,在fx文件中对纹理进行采样的时候,针对的则是width,见如下fx代码。其中offset是相对于起点的偏移量,g_TexWidth是一个二维纹理的width,可见为了获得offset在纹理中的uv坐标,计算都是相对于width的,这时不用考虑pitch。

uint baseU = offset % g_TexWidth;

uint baseV = offset / g_TexWidth;

////////////////////////////////////////////////////////////////////////////////////////

有时候。。。。。。有时候,我们不是输在大局上而是败在细节上。。。。。。

/////////////////////////////////////////////////////////////////////////////////////////

时间: 2024-10-01 05:32:00

DrectX11学习笔记之Texture2D相关的相关文章

MongoDB权威指南学习笔记4---查询相关的知识点

1 find find({查询条件},{"key":1,"email":1})  后面表示返回哪些键 2 可用的比较操作符 $lt , $lte,$gt,$gte 比如db.users.find({"age":{"$gte":18,"$lte":30}}) 3不等于 find(...{"key":{"$ne":"value"}} 4 in find

Java学习笔记<3>面向对象相关

面向对象的基本思想 从现实世界客观存在的事务出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式,如抽象.分类 继承.聚合.多态等. 类和对象的关系 对象中存储了类规定的数据类型,并且对象可以调用类的方法. java面向对象 <1>对象是java程序的核心,一切皆对象. <2>对象可以看成静态属性(成员变量)和动态属性(方法)的封装体. <3>类是创新同一类型对象的模版,定义了该类型对象应具有的成员变量及方法. 类的定义 成员变量可以用java语言的任何一种

MongoDB权威指南学习笔记5---索引相关的知识点

1 查看查询计划 db.user.find({"username":"xxx"}) .explain() db.doc.find({"es_y":"2014"}).explain() {  "cursor" : "BasicCursor",  "isMultiKey" : false,  "n" : 0,  "nscannedObject

学习笔记之html5相关内容

写一下昨天学习的html5的相关内容,首先谈下初次接触html5的感受.以前总是听说html5是如何的强大,如何的将要改变世界.总是充满了神秘感.首先来谈一下我接触的第一个属性是  input的里面的一个属性是 type="email".以前用html的时候,type是有很多类型的,有text,password,summit.就是没听说过email.当得知这个email是验证输入的内容是否为email格式的时候.我顿时兴奋了.以前接触到html的时候,如果要验证输入内容时,是需要写js

DrectX11学习笔记Texture2D有关

///////////////////////////////////////////////////////////////////////////////////// 有时候....有时候....我们不是输在大局上而是败在细节上......Fight>>Fight>>Fight /////////////////////////////////////////////////////////////////////////////////////    HRESULT CT

FreeRTOS学习笔记7-FreeRTOS 队列相关

在实际的应用中,常会遇到一个任务或者断服需要和另外进 在实际的应用中,常会遇到一个任务或者断服需要和另外进 行"沟通交流", 行"沟通交流", 行"沟通交流", 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 的过程.在 的过程.在 没有操作系统的时候两个应

PyQt5学习笔记15----PyQt 线程相关类

QThread是我们将要详细介绍的第一个类.它也是 Qt 线程类中最核心的底层类.由于 PyQt 的跨平台特性,QThread要隐藏掉所有平台相关的代码. 正如前面所说,要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread.run()函数: class Thread(QThread): def __init__(self): super(Thread,self).__init__() def run(self): pass #线程相关代码 然后我们这样新建一个新的

STL学习笔记(迭代器相关辅助函数)

advance()可令迭代器前进 #include <iterator> void advance(InputIterator& pos,Dist n); 面对Random Access(随机存取)迭代器,该函数只是简单的调用pos+=n.而对于其他任何类型的迭代器则调用++pos(--pos)n次. distance()可以处理迭代器之间的距离 #include <iterator> Dist distance(InputIterator pos1,InputIterat

【前端学习笔记】arguments相关

arguments转数组: (function() { console.log(arguments instanceof Array); // --> false console.log(Object.prototype.toString.call(arguments)); // --> [object Arguments] var args = Array.prototype.slice.apply(arguments); console.log(args instanceof Array)