【发布时间】:2012-02-04 00:38:11
【问题描述】:
msdn documentation 解释说,在 directx 11 中,有多种方法可以通过编程方式填充 directx 11 纹理:
(1) 使用默认使用纹理创建纹理并使用内存中的数据对其进行初始化
(2) 使用动态使用创建纹理,使用DeviceContext Map 获取指向纹理内存的指针,写入它,然后使用Unmap 指示您已完成(此时我猜它已复制到gpu)
(3) 使用暂存使用创建纹理并按照与动态纹理相同的步骤进行操作,但随后调用 ID3D11DeviceContext.CopyResource 以使用此暂存纹理依次填充(非不可变)默认或动态纹理。
但是文档根本没有解释每种方法的优缺点,而且我对directx还是很陌生,所以对我来说根本不清楚。
在directx 11中以编程方式创建纹理的每种方法的优缺点是什么?
旁注:我已经读过,在暂存纹理的上下文中,从 gpu 读取没有缓冲,因此您必须自己进行双缓冲。但我不知道这是否准确,以及它是否适用于使用 staging 纹理进行写作(甚至它的真正含义)。
第二个注释: Map 方法文档说它获取指向子资源中数据的指针,并拒绝 GPU 访问该子资源。当 GPU 想要访问其底层数据已被 Map 调用的纹理时,它会做什么?地摊? (我问是因为这听起来像是我询问的利弊的一部分)
【问题讨论】:
-
边学边添加笔记。显然,您无法使用上述方法 (1) 以编程方式创建多重采样默认纹理。
-
虽然在directx 11 中调用map 中的D3D11_MAP_FLAG 非常模糊,但它显然告诉GPU 如果它需要映射的资源该怎么做。目前只记录了一个标志,不清楚使用 0 是否意味着停止。
-
显然 D3D11_USAGE_DYNAMIC 资源的 miplevel 必须等于 1。
标签: directx textures directx-11