SRV
- 着色器资源视图 shader resource view
- 一般来说是制定格式,但是有时候格式未指定可以通过更改srv来解释
- 不总是很贵,但是在优化时,请执行显而易见的操作——尽可能按材质排序以避免不必要的状态更改等
采样器工作 once the texture coordinates arrive
- 如果这是一个
Sample
或SampleBias
类型的请求,请先计算纹理坐标梯度。 - 如果没有给出显式 mip 级别,则计算从梯度中采样的 mip 级别,并在指定的情况下添加 LOD 偏差。
- 对于每个生成的样本位置,应用地址模式(环绕/钳位/镜像等)以获取纹理中要采样的正确位置,以归一化的 [0,1] 坐标表示。
- 如果这是一个立方体贴图,我们还需要确定要从哪个立方体面采样(基于 u/v/w 坐标的绝对值和符号),并进行除法以将坐标投影到单位立方体上,使其处于 [-1,1] 区间内。我们还需要丢弃 3 个坐标中的一个(基于立方体面),并缩放/偏移另外 2 个坐标,使其处于与常规纹理样本相同的 [0,1] 归一化坐标空间中。
- 接下来,将 [0,1] 归一化坐标转换为定点像素坐标以进行采样 - 我们需要一些小数位来进行双线性插值。
- 最后,从整数 x/y/z 和纹理数组索引,我们现在可以计算出读取纹素的地址。嘿,在这一点上,朋友之间再多几个乘法和加法又有什么关系呢?
texture cache
1. 主要工作的区域是采样器的l2 cache,执行周期长,l1cache容量小,但是有额外功能就是解码
- 在梯度正确的情况下,采样大概有一次的miss,而双线性采样由于是在同一篇cache内,采样器要读取4个点来。因此可能在同一片内存中读取,造成的cache miss不是想象中的4次,统计下来大概是1.25次
- 优化其实就是纹理压缩,压缩好的纹理在l1中解压缩,助于减少纹理读取的带宽需求.l2中放大为128位,4x4x8,这样更可能在一次双线性采样中能让四个点在同一片cache中被采样
这里为什么是4x4的块呢,我们可以这样想,因为实际采样总是会有大概一个像素的偏移,所以吗直接用一个quad也就是四个像素来代替就行了。这样就确保能采样到,然后4x4的块就差不多能读到4个像素点来做双线性过滤。
所以,总的来说原始大概采样一个有1次miss,双线性过滤后大概采样机从得到的坐标得到一个像素大概有1.25个cache miss,而之后l2优化后把这个分摊到16个像素点当中l.所以cachemiss就是1.25/16