【问题标题】:What is the result of sample with an uninitialized texture in DirectX?DirectX 中带有未初始化纹理的样本的结果是什么?
【发布时间】:2016-11-09 05:03:11
【问题描述】:

OpenGL 对此有its description,但是DirectX 呢?

在我的猜测中,示例结果是float(0, 0, 0, 0),或者是由驱动程序导致的崩溃。无论如何,这只是我的猜测,或者如果只是我自己测试的话,也是部分情况。我要说清楚。

未初始化的纹理意味着,没有通过D3DDevice::CreateTexture2D() 传递任何数据,也没有通过mapupdate resource

如果可能,我想获取有关 DirectX 11 版本的说明。

【问题讨论】:

    标签: directx directx-11


    【解决方案1】:

    来自 Create2DTexture 函数(您链接的):

    如果不向 pInitialData 传递任何内容,则资源的内存初始内容是未定义的。在这种情况下,您需要在读取资源之前以其他方式写入资源内容。

    未定义可以意味着任何事情,驱动程序将确定确切的行为。它不太可能崩溃,但与未定义的行为一样,一切皆有可能。来自该纹理的样本当然不能保证float4(0,0,0,0),因为它具有未绑定的纹理。

    这类似于访问未初始化的系统内存。内容可能是从分配相同内存的先前操作写入的已填充内存(取决于分配器的行为)。如果您想要一致的行为,我建议您使用未绑定的纹理,或者初始化内容。

    【讨论】:

      【解决方案2】:

      是的,如果从空纹理中采样,所有值都为 0。

      我不记得我在哪里读过它,但我知道它在 MSDN 文档中,我也碰巧不时这样做,因为我在开始时分配了大部分纹理\缓冲区\视图并在我填充时去吧,如果我从 null 或未初始化的样本中采样,那么它只是读取 0。

      【讨论】:

      • 他不是在询问未绑定的纹理,而是在询问内容尚未初始化的纹理。
      • 它仍然返回 0 不是吗?我什至说过“如果我从 null 或未初始化的样本中采样,那么它的读数就是 0。”我刚刚测试它,你得到 float4(0,0,0,0)
      • 您的驱动程序返回 float4(0,0,0,0) 和您的样本。不代表每个人的意愿,甚至你在不同情况下的意愿。看我的回答。
      • 这很有趣,只是因为我已经在两次重写和 3 个不同的 GPU 中进行了类似的操作,其中 2 个来自 AMD 和一个来自 Nvida,并且发生了同样的事情。就像在 SRV 被填满之前读取它一样,还是这是一个特殊情况?不管怎样,谢谢,就像我说的很有趣!
      • 不存在未初始化的 SRV... CreateShaderResourceView 总是完全初始化它。如果您的意思是从指向未初始化资源的 SRV 读取,是的,它适用于所有资源类型,无法保证您将从未初始化的资源读取中得到什么。通常它是 0,但是,我以前见过它不是。以这种方式做事是不好的做法 - 如果你想要零,只需取消绑定资源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      相关资源
      最近更新 更多