DirectX11 采样状态对象

2023-12-20 09:18
文章标签 对象 状态 采样 directx11

本文主要是介绍DirectX11 采样状态对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

采样状态对象

1. 采用状态对象有什么用?

采样状态描述用于描述纹理贴图的采样方式。一个采样状态对象允许我们访问一个纹理的采样状态信息。后面我们看采样状态描述结构体就知道有哪些内容可以描述了。

2. 采样状态可以描述哪些内容?

我们来看采样状态描述结构体D3D11_SAMPLER_DESC有哪些成员:

  • Filter,它指定被采样的纹理怎样过滤。纹理过滤描述从源数据怎样被读取和联合,使得用于着色器。过滤能够提升画质但是在纹理采样时会有更多的性能开销,因为一些过滤类型是由于读取和结合多个纹理元素值来产生一个在着色器中看到的单一的颜色值。下面会详细介绍。
  • AddressU,纹理寻址模式。下面会详细介绍。
  • AddressU,纹理寻址模式。下面会详细介绍。
  • AddressW,纹理寻址模式。下面会详细介绍。
  • MipLODBias,用于 MIP 的级别细节(level-of-detail,简称 LOD)偏移。该值是一个通过 Direct3D 使用的 MIP 级别机制的偏移量。例如,如果 Direct3D 指定使用第 2 级别的 MIP 并且偏移量为 3,则实际上 MIP 使用的是第 5 级别。
  • MaxAnisotropy,最大各向异性值,用于各向异性过滤和比较函数。该值范围是 1-16 之间的整数,它不用于点和双线性过滤。
  • ComparisonFunc, COMPARISON函数的返回值用于判定贴图过滤标识的比较。比较标识在D3D11_COMPARISON_FUNC 中指定,其比较状态的本质是比较两个值之间的等于,大于小于关系。
  • BorderColor,如果贴图地址模式使用了D3D11_TEXTURE_ADDRESS_BORDER,这个成员就可以指定颜色值(RGBA值必须在0~1)。
  • MinLOD,指定Mip最小级别。
  • MinLOD,指定Mip最大级别。例如,如果最大值指定为 1,那么级别为 0 的 MIP纹理就不会被访问到(注意级别为 0 的 MIP 就是分辨率最高的纹理)。
3. Filter成员如何填充?

在 Direct3D 11 中可用的过滤类型如下:

typedef enum D3D11_FILTER {
D3D11_FILTER_MIN_MAG_MIP_POINT
D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR
D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT
D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR
D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT
D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR
D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT
D3D11_FILTER_MIN_MAG_MIP_LINEAR
D3D11_FILTER_ANISOTROPIC
D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT
D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR
D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT
D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR
D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT
D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR
D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT
D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR
D3D11_FILTER_COMPARISON_ANISOTROPIC
D3D11_FILTER_TEXT_1BIT
} D3D11_FILTER;

我们看到上面一堆东西先不要慌乱,其实上面这么多内容都是组合出来的,我们把它们拆开一个个小的组合子,就只有下面几种:

  1. POINT,点采样,也就是最邻近采样,是用于过滤的一种最快的采样方式。它直接从纹理中取得单一的值作为采样结果,而不进行修改。
  2. LINEAR,线性采样。
    (1)用于Mip(下面会谈到)时,即为双线性采样, 在被采样点的纹理坐标处进行双线性内插值,除了包围采样的边框附件的那些采样点。这些内插值(已经双线性采样后的结果)将是在着色器中可见。选择此采样方式是通过过滤(双线性组合)在像素中心周围的最接近的四个纹理元素完成。这种组合多个附近的纹理元素的方式能够使得结果更加的平滑,该采样方式能够有效减少在渲染中的锯齿效果。
    (2)用于MIN和MAG时,即为三线性采样,通过在最接近的 MIP 分级纹理中分别进行双线性采样,然后再内插值完成。 当一个网格表面从使用一个 MIP 等级到另一个等级时,该物体表表面将会出现一些明显的变化。而在最邻近的 MIP 等级之间使用插值,在两个等级之间使用双线性过滤后,能够很大的减少渲染的人工痕迹(译者注:就是使用三线性采样在物体远离或靠近时,表面纹理能够平滑过渡)。
  3. ANISOTROPIC,各向异性。各向异性过滤,使用三线性采样在不等边四边形上来代替正方形区域。双线性和三线性过滤(采样)能够在当视线方向垂直于表面时工作得很好,因为是符合正方形采样,但是斜视物体表面时(视线与物体表面夹角为一个锐角),例如在观察 3D 游戏中的天花板或地面时,将会出现明显的模糊和渲染痕迹。各向异性过滤在用于不同形状的区域的贴图采样时会将角度考虑进去。
4. Mip、MIN、MAG是什么意思?
  • Mip:当物体越来越远离观察者,在屏幕上被着色的像素随着观察者的远离也越来越少。这意味着,为了表现高品质的画质,我们需要在近处的物体使用高分辨率的图像,但是当对象越来越远离观察者时,高分辨率的图像不必传递给渲染管线,代替的是使用较低分辨率的图像。这一点很是重要,因为我们只需要很少的数据进行移动,其渲染性能能够很好的得到提升。如果有许多物体远离照相机,使用合适的分辨率贴图与使用最高级的分辨率贴图在外观上是没有太大的差别的,而且这是提升性能的一个关键部分。这个出来过程就是著名的 Mip 映射,使用 D3DX11CreateTextureFromFile 将默认会创建全部的 MIP 分级链。使用 Mip 分级机制的另一个好处是能够有效的减少混淆走样。
  • MIN:Minification(缩小系数)发生在已经贴图的物体表面远离观察者时,当表面越来越远离时,越来越多的纹理元素结合为屏幕上的单个颜色,这是因为来自远离物体的多个纹理元素渲染时使用屏幕
  • MAG:Magnification(放大系数)现象发生在当已经贴图的物体表面越来越靠近照相机时,因为屏幕上的多个像素被渲染为物体表面的同一个纹理元素上的同一个像素的原因。
5. 纹理寻址模式是什么?

纹理坐标值被指定范围 0.0-1.0 在纹理的各个尺寸。纹理寻址模式告诉 Direct3D 怎样处理超出该范围的坐标值。纹理寻址模式可以使用如下值:

  • D3D11_TEXTURE_ADDRESS_WRAP,重复(WRAP)纹理地址将导致贴图重复用于周围。例如,如果你有一个方形区域,你想一张贴图在区域的水平方向重复显示两次,只需要指定最右边的顶点的 U 贴图坐标分量为 2.0 即可。这能够使贴图像瓦片一样覆盖一个单一的表面,它的好处就是只需要使用很少量的数据就可以达到整个覆盖的效果。(如下图)
    WRAP
  • D3D11_TEXTURE_ADDRESS_CLAMP,UV范围超出[0,1]将取UV为0或1(即边界)的颜色。
    CLAMP
  • D3D11_TEXTURE_ADDRESS_MIRROR,镜像(MIRROR)纹理地址将导致贴图以镜像形式重复(见下图)。
    镜像
  • D3D11_TEXTURE_ADDRESS_MIRROR_ONCE将会使得贴图的镜像形式出现一次,对负的u,v坐标取绝对值,所以左,上是镜像的效果。对超过[0,1]范围的正的坐标,使用clamp方式。
    镜像一次
  • D3D11_TEXTURE_ADDRESS_BORDER寻址模式将会设置任何在 0.0-1.0 范围之外的像素一个指定的边界颜色。边界颜色通过 D3D11_SAMPLER_DESC 的另一个叫做 BorderColor 的成员来指定,它是一个有四个浮点值得数组。
    COLOR
6. 如何根据采样状态描述创建采样对象?

为了创建一个采样状态对象,我们使用 Direct3D 设备的 CreateSamplerState 函数,它使用采样描述作为参数并且输出所创建的采样状态对象的地址。

7. 创建采样状态对象示例代码
    //创建采样状态对象D3D11_SAMPLER_DESC colorMapDesc;ZeroMemory( &colorMapDesc, sizeof( colorMapDesc ) );colorMapDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;colorMapDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;colorMapDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;colorMapDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;colorMapDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;colorMapDesc.MaxLOD = D3D11_FLOAT32_MAX;d3dResult = d3dDevice_->CreateSamplerState( &colorMapDesc, &colorMapSampler_ );if( FAILED( d3dResult ) ){DXTRACE_MSG( "Failed to create color map sampler state!" );return false;}

这篇关于DirectX11 采样状态对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515517

相关文章

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja