是否有可能在现代GPU上做旧派2d blitting?

时间:2010-02-28 09:43:37

标签: opengl opengl-es gpu

看起来GL已经成为所有游戏平台的主流(甚至是手持设备!) 这促使现代GPU芯片组部署到大量消费者手中。

这太棒了。

现在有了现代GPU系统,是否可以制作通用的老式图形 编程(aka - 使用VRAM从X rect到Y rect的blit)? (想想Amiga)或者以运营为中心 在顶点和像素着色器周围?

这可以从GL访问吗? OpenGL ES?

渲染纹理四边形是可以的,但它需要双缓冲并重新渲染整个场景。看看我是否可以避免这种情况。

6 个答案:

答案 0 :(得分:7)

检查BlitFramebuffer例程(Framebuffer Object)。您需要更新的驱动程序。

请记住,您可以使用默认的帧缓冲区,但我认为使用帧缓冲区对象会更有趣。

将你的精灵保存在单独的frambuffers中(可能使用OpenGL渲染),并将它们设置为read(使用glReadBuffers)并在draw framebuffer上使用glDrawBuffers进行blit。它非常简单快速。

答案 1 :(得分:2)

好吧,您可以使用libSDL并获取指向屏幕帧缓冲区的指针,并使用像素执行您想要的任何操作。 或者你可以将所有绘图都放到内存缓冲区,加载到GL纹理并绘制纹理四边形,这可能因为硬件加速而更快。

答案 2 :(得分:1)

在某些嵌入式系统上可能会有一个帧缓冲区指针并直接写入它,但是现在你最好使用OpenGL | ES并渲染纹理。它会更便携,而且可能更快。

您可以在主内存中创建一个缓冲区,完成所需的所有操作,然后将其渲染为纹理。您可以将纹理数据DMA转换为VRAM以获得速度,然后将其渲染为四边形(相当于一个blit),但不使用任何CPU周期,并且运行速度与GPU可以处理的速度一样快。

如今,您可以使用着色器和可编程管道来实现这一目标。

答案 3 :(得分:1)

如果您正在绘制纹理四边形,使用它可以轻松模拟“旧学校”blitting,那么GPU确实会从视频内存中复制像素。另请注意,虽然在OpenGL中可以进行位图操作,但由于3D路径在消费级视频卡上进行了优化,因此它们可能会非常慢,而2D路径可能不是。

答案 4 :(得分:0)

另外,如果你正确设置了环境,glCopyPixels似乎就可以了。

答案 5 :(得分:0)

在Windows上,您可以使用低级位图复制功能,这些功能可以准确匹配旧描述而无需任何OpenGL等。

BOOL BitBlt(
  _In_ HDC   hdcDest,
  _In_ int   nXDest,
  _In_ int   nYDest,
  _In_ int   nWidth,
  _In_ int   nHeight,
  _In_ HDC   hdcSrc,
  _In_ int   nXSrc,
  _In_ int   nYSrc,
  _In_ DWORD dwRop
);

https://msdn.microsoft.com/en-us/library/dd183370%28v=vs.85%29.aspx