看起来GL已经成为所有游戏平台的主流(甚至是手持设备!) 这促使现代GPU芯片组部署到大量消费者手中。
这太棒了。
现在有了现代GPU系统,是否可以制作通用的老式图形 编程(aka - 使用VRAM从X rect到Y rect的blit)? (想想Amiga)或者以运营为中心 在顶点和像素着色器周围?
这可以从GL访问吗? OpenGL ES?
渲染纹理四边形是可以的,但它需要双缓冲并重新渲染整个场景。看看我是否可以避免这种情况。
答案 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