`

State :ID3D11SamplerState

 
阅读更多

纹理采样:在3D渲染中,一般我们会为每个显示在屏幕上的平面贴上纹理。在处理这个过程中,我们需要创建纹理图和与之对应的采样器,采样器的作用就是按照某种规则把纹理上的像素点采集并绘制到模型平面上。除了极少数特殊情况,一般情况下纹理大小与目标面的大小是不对等的,包括形状有时候都不一样,除此之外有用视距的原因目标平面还会出现动态缩放的情况,这个时候又存在MIP(多级纹理)这个东西,它也增加了纹理采样的复杂度。

在DX9的效果框架里,HLSL可以直接创建一个采样状态,但是由于DX11微软对效果框架的放权,导致其直接支持比较模糊。所以,我所看到比较常见的做法是在DX中构建一个采样状态对象,然后传递到相应的着色器里面。

 

创建一个采样器 :ID3D11Device

HRESULT CreateSamplerState(
  [in]   const D3D11_SAMPLER_DESC *pSamplerDesc,
  [out]  ID3D11SamplerState **ppSamplerState
);

 

 传入一个D3D11_SAMPLER_DESC参数作为采样器的描述

 typedef struct D3D11_SAMPLER_DESC {

  D3D11_FILTER               Filter;  // 这个过滤器描述了三项类容
  D3D11_TEXTURE_ADDRESS_MODE AddressU; // 1
  D3D11_TEXTURE_ADDRESS_MODE AddressV; // 1
  D3D11_TEXTURE_ADDRESS_MODE AddressW; // 1
  FLOAT                      MipLODBias; // 这个是lod用的,如果mipmap=3,MipLODBias=2,则实际mipmap=5   UINT                       MaxAnisotropy; // 各向异性过滤器会用到,钳位值0-16,
  D3D11_COMPARISON_FUNC      ComparisonFunc; // 过滤器使用的比较?
  FLOAT                      BorderColor[4]; // 边框颜色
  FLOAT                      MinLOD; // mipmap的范围
  FLOAT                      MaxLOD; // mipmap的范围
} D3D11_SAMPLER_DESC;

typedef enum D3D11_TEXTURE_ADDRESS_MODE { // 当目标面比纹理大时,超出部分按照何种方式采集
  D3D11_TEXTURE_ADDRESS_WRAP         = 1,  // 像贴瓷砖一样不停的重复,直到目标面贴满
  D3D11_TEXTURE_ADDRESS_MIRROR       = 2, // 与1类似,只不过重复的时候会镜面反转一下
  D3D11_TEXTURE_ADDRESS_CLAMP        = 3,  // 超出部分按照超边边的颜色向外拉伸,想象一下扯麦芽糖就是那个样子
  D3D11_TEXTURE_ADDRESS_BORDER       = 4, // 超出部分作为一个边框存在,边框的颜色为上面的第4个参数
  D3D11_TEXTURE_ADDRESS_MIRROR_ONCE  = 5 // 这个没弄明白 
} D3D11_TEXTURE_ADDRESS_MODE;

D3D11_FILTER :

 

typedef enum D3D11_FILTER { 
  D3D11_FILTER_MIN_MAG_MIP_POINT                           = 0,
  D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR                    = 0x1,
  D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT              = 0x4,
  D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR                    = 0x5,
  D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT                    = 0x10,
  D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR             = 0x11,
  D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT                    = 0x14,
  D3D11_FILTER_MIN_MAG_MIP_LINEAR                          = 0x15,
  D3D11_FILTER_ANISOTROPIC                                 = 0x55,
  D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT                = 0x80,
  D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR         = 0x81,
  D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT   = 0x84,
  D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR         = 0x85,
  D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT         = 0x90,
  D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR  = 0x91,
  D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT         = 0x94,
  D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR               = 0x95,
  D3D11_FILTER_COMPARISON_ANISOTROPIC                      = 0xd5,
  D3D11_FILTER_TEXT_1BIT                                   = 0x80000000
} D3D11_FILTER;

 D3D11_FILTER :其实就是缩小,放大和mipmap按照点取样,线性插值取样和各项异性插值取样进行对应映射的关系。

其实这了不是很好理解的就是点取样,线性插值取样和各项异性插值取样,这里贴一下网上的理解:

1.点取样:这个是最基本的方式,距离最近的点进行四舍五入计算,这种方式容易走样。

是不是觉得没有走样,这个图不明显,放大会出现马赛克,缩小会出现失真。

2.线性插值取样:在网上看到三次线性取样,我还以为是神马。结果是缩小,放大,mipmap都用。

感觉比第一种方式还模糊一些。

3.各项异性采样:一个屏幕像素被反映射到纹理上的区域是一块近似的平行四边形(应该不是标准的平行四边形),然后用短边决定MipMap的层,再在长边的方向上多采样几次做混合,用短边决定MipMap层就使得层数不会太深,然后再用长边多次采样混合,这样就缓解了上面提到的模糊问题。

不是很理解。

 

设置采样状态:

 

void VSSetSamplers( 
  [in]  UINT StartSlot, // 起始坐标
  [in]  UINT NumSamplers, // 个数 StartSlot + NumSamplers不能大于一个常数
  [in]  ID3D11SamplerState *const *ppSamplers // 是一个数组
);

DX11没有SetSamplerState方法,是不是意味着所以的变量都得用map进行改变。

 

 

分享到:
评论

相关推荐

    8.5纹理采样1

    // 在缩减上使用点过滤,倍增上使用线性过滤,多级渐进纹理上使用点过滤。SamplerState mySampler2 { Filter = MIN_POINT

    厄普西隆

    ε-ε 基于学习经验的改进的等距...在整数缩放级别上,SamplerState.PointClamp看起来最佳。 当使用非整数缩放时,实心sprite的各向异性效果很好,但半透明的sprite的边缘效果很差。 调查批处理期间更改采样器状态?

    前18大旋转修整器企业占据全球87%的市场份额.docx

    前18大旋转修整器企业占据全球87%的市场份额

    Planet-SkySat-Imagery-Product-Specification-Jan2020.pdf

    SKYSAT IMAGERY PRODUCT SPECIFICATION PLANET.COM VIDEO Full motion videos are collected between 30 and 120 seconds by a single camera from any of the active SkySats. Videos are collected using only the Panchromatic half of the camera, hence all videos are PAN only. Videos are packaged and delivered with a video mpeg-4 file, plus all image frames with accompanying video metadata and a frame index file (reference Product Types below)

    Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg

    Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg

    2019年A~F题特等奖论文合集.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文

    雷达物位变送器安装和操作手册

    雷达物位变送器安装和操作手册

    node-v11.6.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Python3实现快速排序(源代码)

    快速排序是一种基于分治策略的排序算法,通过选择一个基准元素,将待排序的数组划分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于基准的元素,然后递归地对这两个子数组进行快速排序。快速排序在平均情况下具有O(n log n)的时间复杂度,是一种非常高效的排序算法。然而,在最坏情况下,当输入数据已经有序或接近有序时,快速排序的性能会退化为O(n^2)。此外,快速排序是不稳定的排序算法,即相等的元素可能在排序过程中改变相对位置。尽管如此,快速排序仍然因其高效的平均性能而在实际应用中广泛使用。在Python3中,可以通过递归或迭代的方式实现快速排序算法,但为了避免额外的空间开销,通常会采用原地排序的方式来实现。

    毕业课设基于51单片机的出租车计价器(昼夜)

    【作品名称】:基于51单片机的出租车计价器(昼夜) 含(程序、仿真图、流程图、原理图) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 出租车计价器: 1、不同情况具有不同的收费标准,具有白天和夜晚不同的计价能力 2、能进行手动修改单价 3、具有数据的复位功能(起步价,起步公里数,里程单价,白天晚上不一样) 4、能够在掉电的情况下存储单价等数据 5、步进电机模拟里程,一圈表示一里路

    2024年中国API 11P往复式气体压缩机行业研究报告.docx

    2024年中国API 11P往复式气体压缩机行业研究报告

    Windows 10系统上安装和配置Tomcat的步骤

    附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    广东工业大学《计算网络A》实验报告期末考试试题回忆版.doc

    此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。

    数据库+人大金仓+Linux系统安装

    数据库+人大金仓+Linux系统安装

    2023年美赛特等奖论文-C-2309397-解密.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文

    opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl

    opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl

    减肥管理,全球前10强生产商排名及市场份额.docx

    减肥管理,全球前10强生产商排名及市场份额

    上海大学大学生创新创业训练计划申请书(创新训练项目).doc

    内容概要:《上海大学大学生创新创业训练计划申请书(创新训练项目)》是用于申请参加上海大学的大学生创新创业训练计划的申请书,旨在帮助学生提出创新项目计划,获得培训和支持,促进学生创新创业能力的提升。 适用人群:适合上海大学的在校大学生,特别是对创新创业感兴趣、有创新想法和创业计划的学生,希望通过该计划获得指导和资源支持,实现自己的创业梦想。 使用场景及目标:申请书的使用场景是为了参加上海大学的大学生创新创业训练计划,目标是通过提交详细的创新项目计划,获得评审通过并获得培训、指导和资金支持,从而推动学生的创新创业实践和能力提升。 其他说明:申请书应包括清晰的创新项目描述、项目可行性分析、预期目标和计划、团队介绍等内容,以展现学生的创新能力和项目潜力。申请书的撰写需要认真准备,体现出学生对创新创业的热情和才华,以提高申请成功的机会。

    IEC 60364-7-716-2023 第7-716部分:特殊装置或场所要求.信息和通信技术ICT电缆基础设施上ELV直流配电

    IEC 60364-7-716-2023 低压电气装置.第7-716部分:特殊装置或场所的要求.信息和通信技术(ICT)电缆基础设施上的ELV直流配电.pdf

    IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器电动汽车导电带电系统特殊要求

    IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器的电动汽车导电带电系统的特殊要求.pdf

Global site tag (gtag.js) - Google Analytics