【问题标题】:Fastest way to draw to screen with software 3D rendering使用软件 3D 渲染在屏幕上绘制的最快方法
【发布时间】:2014-05-27 03:05:22
【问题描述】:

我目前正在从头开始学习多边形 3D 渲染课程。我们编写自己的线条绘制和裁剪算法,最终使用我们自己编写的透视变换代码在 3D 空间中绘制多边形。本课程的假设是我们写入表示窗口、视口或显示设备的二维数组。在课程的第一周,我们编写代码将这些二维数组写为位图文件,以便我们查看输出。

现在我想实时查看我的软件渲染器的输出并与之交互。例如,在 Mac OSX 10.9 中,将 2D 位图数组绘制到屏幕上的最快方法是什么? Linux?窗户?

我在这里专门寻找速度,因为我希望 GPU 做的唯一事情是绘制我刚刚在运行时在主内存中渲染的 2D 数组。

【问题讨论】:

  • 我直接通过 GDI 将渲染的位图绘制到 Win32 Window Canvas 比将 bmp 加载到 GL 并渲染回来要快得多......而且我通过 ScanLine[] 直接渲染到位图没有必要有单独的副本数组...只需在指针数组中创建扫描线列表,这样它会很快(没有 GDI 检查)(有 2 个 bmps,一个用于颜色,一个用于 Z 缓冲区)
  • @Spektre 如果您使用 GDI,那么您的输出将受制于 DWM(Windows Vista+)并且会有开销。但是,如果您使用 3D API 请求直接全屏访问,您将绕过 DWM 直接写入最终的 GPU 内存缓冲区。
  • @JAre 我不使用 GDI 进行渲染,只是为了最终交换缓冲区......所以很少的开销没问题我不需要 2000fps
  • @Spektre 据我所知,在 Windows Vista+ 中,每个窗口都表示为它自己的某种帧缓冲区。当所有窗口都渲染到纹理集(可能是某种图集)并且所有内部上下文(如 Flash 或 DirectX)嵌入到窗口时 - 然后 DWM(桌面窗口管理器)将进行 z 排序、混合(应用窗口等效果Aero 模糊 alpha)并将它们组合到将显示的最终渲染缓冲区。但!如果您请求独家全屏上下文(就像所有现代 3D 游戏在全屏模式下所做的那样),您将直接渲染到最终缓冲区,而无需 DWM。
  • @Spektre 所以这就是为什么 GDI 不是最快的方式,即使它允许您在没有开销的情况下通过总线发送位图数据,对于 OpenGL 或 DirectX 来说也是一样的,但他们会推动它绕过操作系统的图形管理器进入独家模式的最后阶段。在这两种情况下,都会在着色器端使用某种脚手架。

标签: graphics 3d drawing 2d rendering


【解决方案1】:

如果没有初始化步骤,它应该是在屏幕对齐的四边形上进行位图的 OpenGL 渲染(What's the best way to draw a fullscreen quad in OpenGL 3.2?) 只有昂贵的操作才会上传位图,但无论如何这是不可避免的。

【讨论】:

  • 这不会将我的位图大小限制为 (2^n x 2^n) 吗?
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多