【问题标题】:ID3D10Texture2D scroll contentsID3D10Texture2D 滚动内容
【发布时间】:2012-03-21 12:24:40
【问题描述】:

我是 DirectX 技术的新手。

如何滚动 ID3D10Texture2D 的内容?使用bitblt。 GDI 设备上下文中的 BitBlt 之类的东西,其中 src 和 dst hdc 相同。

我有来自 IDXGISurface 的 ID3D10Texture2D,滚动是我的真正目标,但在 dxgi api 中找不到任何东西。

【问题讨论】:

    标签: direct3d direct2d dxgi


    【解决方案1】:

    滚动相当容易。要绘制整个纹理,您的纹理从 0、0 到 1,1。现在改为将 0.5 添加到每个 x 坐标,这样您就会得到以下结果:

    0.5, 0.0----------------1.5, 0.0
       |                       |
       |                       |
       |                       |
       |                       |
       |                       |
    0.5, 1.0----------------1.5, 1.0
    

    您现在会发现纹理向右滚动了一半宽度。

    希望有帮助!

    编辑:如果您不能执行上述操作,那么您可能会稍微卡住,因为您无法从同一纹理读取和写入(在某些驱动程序上您可以,但其行为未定义) .所以你有两个选择。

    1) 创建一个渲染目标纹理,然后使用您的偏移量将原始纹理(如上)渲染到新的渲染目标。然后使用渲染目标纹理纹理。

    2) 锁定(映射)纹理并将单个字节复制到新位置(由于 PCIe 总线复制,这将非常慢)。

    因此,理想情况下,您会按照我在 1 中的建议进行操作。但是,为了获得最佳性能,您需要设置一个“滚动纹理顶点着色器”,在其中将滚动量设置为常数,然后将每个顶点的纹理坐标偏移为原来描述的。这将是迄今为止性能最高的方法。

    【讨论】:

    • 我问的是如何滚动纹理内容,而不是如何在另一个位置绘制它。
    • @Roman ...那你到底是什么意思?上面的描述会向右滚动一半宽度的纹理吗?将纹理设置为环绕模式也意味着数据“脱落”右侧将“环绕”到左侧......如果您想滚动实际的纹理数据,那么我必须建议您不要这样做。这将产生一个可怕的管道气泡,因为您需要通过 PCIe 总线从图形卡复制数据或将数据复制到图形卡。
    • @Roman:嗯,我已经更新了我的答案,但你会发现最好的方法仍然,几乎就像我最初描述的那样。
    • 谢谢,您回答不可能从同一个纹理读取和写入。因此,似乎无法滚动内容,然后将其用作渲染目标重绘缺失的部分。
    • @Roman:总有办法去做你想做的事……不要被“你”想做的事情所吸引。有许多替代解决方案。您可能会发现,如果您能更好地解释您的用例,人们将能够为您的问题提供解决方案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多