D3D渲染技术之纹理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/82824741

纹理映射是一种将图像数据映射到三角形上的技术,从而能增加场景的细节和真实感。 例如,我们可以通过在每一侧绘制板条纹理来构建一个立方体并将其转换为板条箱如下图所示。
在这里插入图片描述
在这里给读者教读者如何学习纹理技术:
1、要了解如何指定映射到三角形的纹理部分。
2、了解如何创建和启用纹理。
3、了解如何过滤纹理以创建更平滑的图像。
4、要了解如何使用地址模式多次平铺纹理。
5、了解如何组合多个纹理以创建新纹理和特殊效果。
6、要学习如何通过纹理动画创建一些基本效果。

纹理和资源回顾

回想一下,前面我们已经使用了纹理; 特别地,深度缓冲区和后台缓冲区是由ID3D12Resource接口表示的2D纹理对象,D3D12_RESOURCE_DESC :: Dimension为D3D12_RESOURCE_DIMENSION_TEXTURE2D。
2D纹理是数据元素的矩阵, 2D纹理的一个用途是存储2D图像数据,其中纹理中的每个元素存储像素的颜色。 但是,这不是唯一的用法; 例如,在法线贴图的高级技术中,纹理中的每个元素都存储3D矢量而不是颜色, 因此,尽管将纹理视为存储图像数据是常见的,但它们实际上更为通用。 1D纹理(D3D12_RESOURCE_DIMENSION_TEXTURE1D)类似于数据元素的1D阵列,3D纹理(D3D12_RESOURCE_DIMENSION_TEXTURE3D)类似于数据元素的3D数组。 1D,2D和3D纹理界面均由通用ID3D12Resource表示。
纹理与缓冲区资源不同,缓冲区资源只存储数据数组;纹理可以具有mipmap级别,GPU可以对它们执行特殊操作,例如应用过滤器和多重采样。由于纹理资源支持这些特殊操作,它们仅限于某种数据格式,而缓冲资源可以存储任意数据。纹理支持的数据格式由DXGI_FORMAT枚举类型描述,一些示例格式是:
DXGI_FORMAT_R32G32B32_FLOAT
DXGI_FORMAT_R16G16B16A16_UNORM
DXGI_FORMAT_R32G32_UINT
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_SNORM
DXGI_FORMAT_R8G8B8A8_SINT
请注意,R,G,B,A字母分别代表红色,绿色,蓝色和alpha。 但是,正如我们之前所说,纹理不需要存储颜色信息; 例如,格式
DXGI_FORMAT_R32G32B32_FLOAT
具有三个浮点组件,因此可以存储具有浮点坐标的3D矢量(不一定是颜色矢量), 还有无类型格式,我们只保留内存,然后指定当纹理绑定到渲染管道时如何在以后重新解释数据(有点像转换); 例如,以下无类型格式保留具有四个8位组件的元素,但不指定数据类型(例如,整数,浮点,无符号整数):
DXGI_FORMAT_R8G8B8A8_TYPELESS
注意,DirectX 11 SDK文档说:“创建完全类型的资源会将资源限制为使用它创建的格式。 这使运行时能够优化访问[…]。“因此,如果我们真的需要,应该只创建无类型资源; 否则,创建一个完全类型的资源。

纹理可以绑定到渲染管道的不同阶段;一个常见的例子是使用纹理作为渲染目标(即Direct3D绘制到纹理中)和作为着色器资源(即,纹理将在着色器中采样)。纹理既可以用作渲染目标,也可以用作着色器资源,但不能同时使用。渲染到纹理然后将其用作着色器资源,一种称为渲染到纹理的方法允许一些有趣的特殊效果,我们将在后面使用它们。对于要用作渲染目标和着色器资源的纹理,我们需要为该纹理资源创建两个描述符:
1)一个存在于渲染目标堆中(即D3D12_DESCRIPTOR_HEAP_TYPE_RTV)
2)存在于其中的一个着色器资源堆(即D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV)。 (请注意,着色器资源堆还可以存储常量缓冲区视图描述符和无序访问视图描述符。)然后,资源可以绑定为渲染目标,或绑定为根签名中的根参数的着色器输入(但不在同时):

// Bind as render target.
CD3DX12_CPU_DESCRIPTOR_HANDLE rtv = …;
CD3DX12_CPU_DESCRIPTOR_HANDLE dsv = …;
cmdList->OMSetRenderTargets(1, &rtv, true, &dsv);
     
// Bind as shader input to root parameter.
CD3DX12_GPU_DESCRIPTOR_HANDLE tex = …;
cmdList->SetGraphicsRootDescriptorTable(rootParamIndex, tex);

资源描述符基本上做了两件事:它们告诉Direct3D资源将如何使用(即,将绑定它的管道的哪个阶段),如果资源格式在创建时被指定为无类型,那么我们现在必须说明 在创建视图时键入。 因此,对于无类型格式,纹理的元素可以在一个管道阶段中被视为浮点值,而在另一个管道阶段中被视为整数;这基本上相当于数据的重新解释。

阅读更多

扫码向博主提问

海洋_

博客专家

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 3D引擎架构
  • 服务器架构
  • GPU渲染
  • 客户端架构
  • 引擎优化
去开通我的Chat快问

没有更多推荐了,返回首页