如何在Direct3D 11中从CPU访问帧缓冲区?

辣椒

我正在创建一个简单的框架,用于在C ++ / D3D11下教授基本的图形概念。需要该框架以通过简单的界面功能(例如Putpixel( x,y,r,g,b )直接操纵屏幕栅格内容

在D3D9下,这是一个相对简单的目标,方法是在CPU组成表面的堆上分配表面缓冲区。然后将锁定后缓冲区,并将堆缓冲区的内容传输到后缓冲区。据我了解,在D3D11下不可能直接从CPU访问后缓冲区。必须准备纹理资源,然后通过某种全屏几何图形将其绘制到后缓冲区。

我已经考虑过用于这种程序的两个系统。第一个包括D3D11_USAGE_DEFAULT纹理和D3D11_USAGE_STAGING纹理。首先映射过渡纹理,然后从CPU提取过渡纹理。场景完成后,将取消映射临时纹理并将其复制到默认纹理CopyResource(如果我没记错的话,它将使用GPU进行复制),然后通过全屏纹理四边形将默认纹理绘制到后缓冲区。

第二系统包括D3D11_USAGE_DYNAMIC纹理和分配在堆上的帧缓冲器。组成场景时,将映射动态纹理,通过CPU将堆缓冲区的内容复制到动态纹理,取消映射动态纹理,然后通过全屏纹理四边形将其绘制到后缓冲区。

我给人的印象是,通过读写访问创建的纹理D3D11_USAGE_STAGING将驻留在系统内存中,但是我进行的性能测试似乎表明情况并非如此。即,通过CPU用暂存纹理绘制一个简单的200x200填充矩形比使用堆缓冲区慢大约3倍(两种情况下都需要完全相同的反汇编(紧密rep stos循环)),这强烈暗示了暂存纹理驻留在图形适配器内存中。

我更喜欢使用暂存纹理系统,因为它可以将渲染到后缓冲区的工作以及从系统内存到图形内存的复制工作都卸载到GPU上。但是,在任何情况下,我都希望将CPU访问速度优先于这种能力。

那么对于这种使用情况,哪种方法是最佳的呢?我的两种方法的任何暗示,修改或完全不同的方法的建议,将不胜感激。

galop1n

动态和暂存都可能在系统内存中,但是您的问题很有可能是写入组合内存。这是一种缓存模式,其中将单个写入合并在一起,但是如果您尝试读取(因为它是未缓存的),则每次加载都要付出全部内存访问的代价。您甚至必须非常小心,因为c ++*data=something;有时可能还会导致不必要的读取。

动态纹理没有问题,GPU可以读取系统内存,但是您需要小心,创建一些内存,并使用map_nooverwrite循环每个帧,以禁止代价高昂的驱动程序缓冲区重命名丢弃对象。当然,永远不要在读写中进行映射,仅在写入时进行映射,否则您将引入gpu / cpu同步并杀死并行性。

最后,如果您想要一个持久的表面,并且每帧只有几个putpixel(甚至很多),我将使用无序访问视图和一个计算着色器,该着色器会消耗具有更新颜色的像素位置缓冲区。该缓冲区将再次成为没有覆盖覆盖映射的动态缓冲区。使用该解决方案,主表面将驻留在视频存储器中。

就个人而言,我什至不会去教CPU表面操纵,这几乎总是一种不好的做法,并且是性能的杀手,而不是现代gpu架构中的必经之路。十年前,这还不是一个基本的图形概念。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Direct3D 11中从CPU访问帧缓冲区?

来自分类Dev

Direct3D 11 中附加/消耗缓冲区的视图

来自分类Dev

如何在Direct3D 11中实现“渲染到纹理”管道?

来自分类Dev

如何在Direct3D 11中启用深度测试?

来自分类Dev

如何在Java程序中访问系统显示内存/帧缓冲区?

来自分类Dev

如何访问默认帧缓冲区的纹理

来自分类Dev

如何在Windows 8中为32位应用程序启用Direct3D加速?

来自分类Dev

Direct3D多个顶点缓冲区,非交错元素

来自分类Dev

什么是Direct3D 12.0上的“映射默认缓冲区”?

来自分类Dev

Direct3D多个顶点缓冲区,非交织元素

来自分类Dev

如何强制MPlayer在帧缓冲区中留下碎片?

来自分类Dev

Linux中如何测量帧缓冲区的渲染时间?

来自分类Dev

如何在NSIS中本机访问内存缓冲区

来自分类Dev

如何在Direct3D 11中将附近的像素数据发送到Pixel-Shader?

来自分类Dev

Direct3D编程的新手:11 vs 12

来自分类Dev

如何将Direct3D 11覆盖层与WPF Viewport3D同步?

来自分类Dev

在Visual Studio中安装Directx和Direct3D

来自分类Dev

如何使用包裹在ComPtr中的Direct3D 11指针来获取11.1接口?

来自分类Dev

Direct3D 11:如何访问CPU侧内存中的多维数据集映射面(ID3D11DeviceContext :: Map是否可与子资源一起使用?)?

来自分类Dev

如何在 WebGL 中为输出纹理或帧缓冲区提供偏移量?

来自分类Dev

如何在虚幻引擎 4 中获取帧缓冲区?

来自分类Dev

如何从OpenGL中的帧缓冲区纹理中采样像素?

来自分类Dev

随机访问HLSL中具有R8G8B8A8_UNorm格式的D3D11缓冲区

来自分类Dev

随机访问HLSL中具有R8G8B8A8_UNorm格式的D3D11缓冲区

来自分类Dev

如何在 OpenGL 中重新定位绑定到帧缓冲区的 2D 纹理?

来自分类Dev

glClear上的“无效帧缓冲区操作”-在OpenGL ES3中使用sRGB

来自分类Dev

将GL_2D_ARRAY_TEXTURE中的特定层附加到帧缓冲区

来自分类Dev

如何检查OpenGL中当前绑定了哪个帧缓冲区对象?

来自分类Dev

如何,何时从Vulkan中的帧缓冲区捕获图像到文件

Related 相关文章

  1. 1

    如何在Direct3D 11中从CPU访问帧缓冲区?

  2. 2

    Direct3D 11 中附加/消耗缓冲区的视图

  3. 3

    如何在Direct3D 11中实现“渲染到纹理”管道?

  4. 4

    如何在Direct3D 11中启用深度测试?

  5. 5

    如何在Java程序中访问系统显示内存/帧缓冲区?

  6. 6

    如何访问默认帧缓冲区的纹理

  7. 7

    如何在Windows 8中为32位应用程序启用Direct3D加速?

  8. 8

    Direct3D多个顶点缓冲区,非交错元素

  9. 9

    什么是Direct3D 12.0上的“映射默认缓冲区”?

  10. 10

    Direct3D多个顶点缓冲区,非交织元素

  11. 11

    如何强制MPlayer在帧缓冲区中留下碎片?

  12. 12

    Linux中如何测量帧缓冲区的渲染时间?

  13. 13

    如何在NSIS中本机访问内存缓冲区

  14. 14

    如何在Direct3D 11中将附近的像素数据发送到Pixel-Shader?

  15. 15

    Direct3D编程的新手:11 vs 12

  16. 16

    如何将Direct3D 11覆盖层与WPF Viewport3D同步?

  17. 17

    在Visual Studio中安装Directx和Direct3D

  18. 18

    如何使用包裹在ComPtr中的Direct3D 11指针来获取11.1接口?

  19. 19

    Direct3D 11:如何访问CPU侧内存中的多维数据集映射面(ID3D11DeviceContext :: Map是否可与子资源一起使用?)?

  20. 20

    如何在 WebGL 中为输出纹理或帧缓冲区提供偏移量?

  21. 21

    如何在虚幻引擎 4 中获取帧缓冲区?

  22. 22

    如何从OpenGL中的帧缓冲区纹理中采样像素?

  23. 23

    随机访问HLSL中具有R8G8B8A8_UNorm格式的D3D11缓冲区

  24. 24

    随机访问HLSL中具有R8G8B8A8_UNorm格式的D3D11缓冲区

  25. 25

    如何在 OpenGL 中重新定位绑定到帧缓冲区的 2D 纹理?

  26. 26

    glClear上的“无效帧缓冲区操作”-在OpenGL ES3中使用sRGB

  27. 27

    将GL_2D_ARRAY_TEXTURE中的特定层附加到帧缓冲区

  28. 28

    如何检查OpenGL中当前绑定了哪个帧缓冲区对象?

  29. 29

    如何,何时从Vulkan中的帧缓冲区捕获图像到文件

热门标签

归档