微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Direct2D 平铺限制?

如何解决Direct2D 平铺限制?

Direct2D 磁贴大小可以增长多少有限制吗?

D2D1_RENDERING_CONTROLS 中,我可以设置 Direct2D 缓冲的平铺。

            D2D1_RENDERING_CONTROLS r4c = {};
            m_d2dContext->GetRenderingControls(&r4c);
            if (r4c.tileSize.width < (UINT32)wi || r4c.tileSize.height < (UINT32)he)
            {
                r4c.tileSize.width = wi;
                r4c.tileSize.height = he;
                m_d2dContext->SetRenderingControls(r4c);
                m_d2dContext->GetRenderingControls(&r4c);
                nop();
            }

当分辨率达到 4K 时,效果的渲染一次获得整个纹理:

enter image description here

当我达到 8K 时,就会出现平铺,表明 Direct2D 不止一次通过纹理:

enter image description here

这对我的 custom HLSL effects 来说是致命的,它需要整个纹理才能运行,比如这种特殊的照明效果

这是预期功能吗?一个错误一个未被发现的问题?我最终会被迫使用 OpenGL 渲染吗?

这与我的 GF 卡无关 - 我用 RTX 2070 测试,出现同样的错误

编辑:here一个完整的 VS 2019 解决方案,具有简单的漩涡效果

// When you try plain 1920x1080 or 3840x2160,ok
int wi = 7680;
int he = 4320;
// With the above,the swirling is tiled x4.

编辑:在 EndDraw() 上,我在调试输出中有这个:

Exception thrown at 0x00007FFBE6324B89 in d2dbug.exe: Microsoft C++ exception: _com_error at memory location 0x000000EBC4D5CE58.
Exception thrown at 0x00007FFBE6324B89 in d2dbug.exe: Microsoft C++ exception: _com_error at memory location 0x000000EBC4D5CE58.
Exception thrown at 0x00007FFBE6324B89 in d2dbug.exe: Microsoft C++ exception: _com_error at memory location 0x000000EBC4D5CE58.

解决方法

微软给出了答案。

我建议使用位图作为效果的输入,而不是 比图像源。只需将图像源绘制到其中 位图应该工作。他们还可以从 WIC 创建位图 位图源使用 D2D API CreateBitmapFromWicBitmap。

这有效,尽管效果的输出返回一个 ID2D1Image,然后必须通过代码 here 将其转换为 ID2D1Bitmap。

我仍在与他们讨论当链中有太多效果并且每个效果都必须手动转换为 ID2D1Bitmap 时可能出现的性能问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。