DirectX 11 啥是着色器资源视图

Posted

技术标签:

【中文标题】DirectX 11 啥是着色器资源视图【英文标题】:DirectX 11 What Is A Shader Resource ViewDirectX 11 什么是着色器资源视图 【发布时间】:2018-03-11 15:38:16 【问题描述】:

阅读书籍:《Practical Rendering and Computation with Direct3D 11》,并在网上寻找定义:https://docs.microsoft.com/en-us/windows/uwp/graphics-concepts/shader-resource-view--srv-

我仍然对 ID3D11ShaderResourceView 是什么感到困惑。

请记住,我正在学习 DirectX 11 来创建视频游戏。考虑到这一点......

什么是着色器资源视图?在什么情况下你会使用着色器资源视图?最重要的是,如何使用着色器资源视图?

我假设您可以在您的 HLSL 代码中使用此资源,但在书中我还没有看到有关如何执行此操作的示例,以及它用于视频游戏引擎的通用方式。

谢谢!

【问题讨论】:

【参考方案1】:

在旧版本(例如 Direct3D 9)中,您拥有单个接口,例如 IDirect3DTexture9IDirect3DCubeTexture9IDirect3DVolumeTexture9,它们封装了图像位本身和预期的使用语义。这有特殊的逻辑使它也可以作为渲染目标。

在 Direct3D 10 中,这被分为两个元素:

ID3DxxTexture1DID3DxxTexture2DID3DxxTexture3D 等资源(即图像位)

用法的语义是ID3DxxShaderResourceView,用于在着色器中读取纹理-或-ID3DxxRenderTargetView,用于渲染到纹理。还有一个ID3D11UnorderedAccessView 用于使用 DirectCompute。

较新设计的优势在于,您可以拥有一个 ID3DxxTexture2D 资源,并且在使用它进行渲染时拥有一个 SRV,在将其用作渲染纹理时拥有一个 RTV。您可以将立方体贴图视为数组大小为 6 的 2D 纹理。

您可能会发现 Microsoft Docs 上的旧文档很有帮助。

你应该看看DirectX Tool Kit tutorials

【讨论】:

好的!为了在着色器中实际使用纹理,您必须有一个 ShaderResourceView? 您必须有一个 SRV 才能将资源绑定到着色器以供读取。您必须拥有 RTV 才能将资源绑定到渲染管道输出。 谢谢!更有意义!【参考方案2】:

所以现实生活中的例子是阴影 - 基本上你从填充深度缓冲区的灯光位置遍历几何体,然后从相机位置遍历几何体并使用深度缓冲区中的数据来计算像素是否处于阴影中。因此,DirectX 中的 *View 可以翻译为“将此资源视为”。在第一部分中,您将使用纹理作为 DepthStencilView(“将此纹理视为深度模板”),在下一部分中,您将使用相同的纹理作为着色器的输入(ShaderResourceView,“将此纹理视为着色器资源) .

这个“过渡”在资源同步方面非常重要。在 DX11 中,这是由驱动程序为您完成的,但在 DX12 中,您必须注意这一点。

【讨论】:

以上是关于DirectX 11 啥是着色器资源视图的主要内容,如果未能解决你的问题,请参考以下文章

DirectX11 With Windows SDK--26 计算着色器:入门

DirectX11 C++ 着色器缓冲区在多边形布局描述中变为空

DirectX11--HLSL编译着色器的三种方法

DirectX11 With Windows SDK--26 计算着色器:入门

DirectX11--深入理解Effects11使用着色器反射机制(Shader Reflection)实现一个复杂Effects框架

DirectX11 Windows Windows SDK--28 计算着色器:波浪(水波)