Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Microsoft在DirectX9运行时限制使用除D16_可锁定和D32_可锁定以外的格式锁定深度缓冲区?_Directx_Directx 9 - Fatal编程技术网

为什么Microsoft在DirectX9运行时限制使用除D16_可锁定和D32_可锁定以外的格式锁定深度缓冲区?

为什么Microsoft在DirectX9运行时限制使用除D16_可锁定和D32_可锁定以外的格式锁定深度缓冲区?,directx,directx-9,Directx,Directx 9,例如,我们无法使用DX9 API LockRect锁定格式为D24S8的深度缓冲区,但是使用相同的API,我们可以锁定格式为D16_Lockable和D32_Lockable的深度缓冲区。许多GPU根本不会保留内存线性深度缓冲区以获得最佳性能。它可能只是一个span缓冲区、一个优化的swizzled缓冲区或某种树。这对GPU有很大帮助。但是如果要锁定这样的缓冲区,GPU必须将其转换为线性缓冲区,这可能会很昂贵。因此,通过获得一个可锁定的缓冲区,您可以告诉GPU跳过所有这些技巧,从一开始就构建一个

例如,我们无法使用DX9 API LockRect锁定格式为D24S8的深度缓冲区,但是使用相同的API,我们可以锁定格式为D16_Lockable和D32_Lockable的深度缓冲区。

许多GPU根本不会保留内存线性深度缓冲区以获得最佳性能。它可能只是一个span缓冲区、一个优化的swizzled缓冲区或某种树。这对GPU有很大帮助。但是如果要锁定这样的缓冲区,GPU必须将其转换为线性缓冲区,这可能会很昂贵。因此,通过获得一个可锁定的缓冲区,您可以告诉GPU跳过所有这些技巧,从一开始就构建一个线性缓冲区

实现可能仍然不同,但这就是在可锁定和不可锁定之间选择API的背后的想法。它允许驾驶员针对每种情况进行优化

通过说D24S8,您可以告诉驱动器您希望缓冲区在精度、特性和渲染方面做什么。然后它就可以以任何奇怪的方式自由地实现它。
通过说Lockable,您告诉它跳过优化,这会影响以后的内存映射回读

明白了!答案被接受。Nvidia驱动程序和硬件支持通过NvAPI_D3D9_Lock API锁定各种表面深度、MSAA、渲染目标等纹理。AMD也可能支持这一点。但是如果开发者不担心性能的话,他们会自行承担锁定的风险。桌面GPU通常有一个非常线性的深度缓冲区。但是像powerVR这样的移动芯片做的更像这样:这就是API试图涵盖的内容。我认为这实际上是一个糟糕的选择,因为任何深度回读都会很糟糕。我相信你会更快地编写一个自定义rgba深度编码,并在实践中阅读它!