D3D11的着色器资源视图和资源视图有什么区别
2024-06-19
38
0
在Direct3D 11中,着色器资源视图(Shader Resource View,SRV)和渲染目标视图(Render Target View,RTV)是两个不同的概念。
着色器资源视图(SRV):
- 主要用途是将资源(如纹理、缓冲区等)绑定到着色器阶段(如像素着色器、顶点着色器等)。
- 可以用来从资源中读取数据,比如从纹理中采样像素数据。
- 在渲染过程中,用来向着色器传递资源数据。
渲染目标视图(RTV):
- 主要用于指定将渲染输出写入的目标(如后台缓冲区或纹理)。
- 通常用于像素着色器输出到屏幕或者后处理效果。
使用区别:
- SRV 用于读取资源数据,是输入布局的一部分,供着色器消费。
- RTV 用于写入渲染输出,是输出布局的一部分,用于指定渲染目标。
总结:
- SRV 和 RTV 都是用来访问 GPU 资源的视图,但用途和操作方向不同:SRV 用于读取资源数据到着色器,而 RTV 用于将着色器输出到渲染目标。
更多详见:https://www.vaczh.com/article/detail-64.html
纹理资源视图
纹理可以被绑定到渲染管线(rendering pipeline) 的不同阶段(stage)。
- 比如将纹理作为渲染目标(即,Direct3D 渲染到纹理)或着色器资源(即,在着色器中对纹理进行采样)。
- 当创建用于这两种目的的纹理资源时,应使用绑定标志值:D3D11_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE
指定纹理所要绑定的两个管线阶段。资源不能被直接绑定到一个管线阶段;我们只能把与资源关联的资源视图绑定到不同的管线阶段。无论以哪种方式使用纹理,Direct3D始终要求我们在初始化时为纹理创建相关的资源视图(resource view)。
- 作用:这样有助于提高运行效率,正如 SDK 文档指出的那样:“运行时环境与驱动程序可以在视图创建执行相应的验证和映射,减少绑定时的类型检查”。所以,当把纹理作为一个渲染目标和着色器资源时,我们要为它创建两种视图:渲染目标视图(ID3D11RenderTargetView)和着色器资源视图(ID3D11ShaderResourceView)。
- 资源视图主要有两个功能:
- (1)告诉 Direct3D 如何使用资源(即,指定资源所要绑定的管线阶段);
- (2)如果在创建资源时指定的是弱类型(typeless)格式,那么在为它创建资源视图时就必须指定明确的资源类型。对于弱类型格式,纹理元素可能会在一个管线阶段中视为浮点数,而在另一个管线阶段中视为整数
为了给资源创建一个特定视图,我们必须在创建资源时使用特定的绑定标志值。
- 例如,如果在创建资源没有使用 D3D11_BIND_DEPTH_STENCIL 绑定标志值(该标志值表示纹理 将作为一个深度/模板缓冲区绑定到管线上), 那我们就无法为该资源创建ID3D11DepthStencilView 视图。
- 只要你试一下就会发现 Direct3D 会给出如下调试错误:
- ERROR: ID3D11Device::CreateDepthStencilView: A DepthStencilView cannot be60 / 529
- created of a Resource that did not specify D3D10_BIND_DEPTH_STENCI