游戏使用软件渲染在内存中绘制全屏调色板(8 位)图像。
使用 OpenGL 将图像显示在屏幕上的最快方法是什么?
我尝试过的事情:
-
glDrawPixels
with glPixelMap
指定调色板,并让 OpenGL 进行调色板映射。性能非常糟糕(~5 FPS)。
- 在软件中进行调色板映射(索引 -> BGRX),然后使用
glDrawPixels
。性能更好,但 CPU 占用率仍然比使用 32 位高很多DirectDraw
使用相同的软件调色板映射。
我应该使用某种纹理来代替吗?
- glDrawPixels 和 glPixelMap 来指定调色板,并让 OpenGL 进行调色板映射。性能非常糟糕(~5 FPS)。
这并不奇怪。 glDrawPixels 一开始并不是很快,而 glPixelMap 将以肯定不是很优化的代码路径在 CPU 上执行索引/调色板 → RGB 转换。
- 在软件中进行调色板映射(索引 -> BGRX),然后使用 glDrawPixels 进行绘制。
glDrawPixels 是 OpenGL 中最慢的函数之一。这有两个主要原因:首先,它是一个没有太多优化的代码补丁,其次,它直接写入目标帧缓冲区,因此每次调用时都会强制管道同步。此外,在大多数 GPU 上,它不受任何缓存的支持。
我建议您将索引图像放入单通道纹理中,例如GL_R8(对于 OpenGL-3 或更高版本)或 GL_LUMINANCE8,并将调色板转换为 1D RGB 纹理,以便用作纹理坐标的索引确实会查找颜色。使用纹理作为 LUT 是完全正常的。通过这种组合,您可以使用片段着色器进行现场调色板索引到颜色的转换。
片段着色器看起来像这样
#version 330
uniform sampler2D image;
uniform sampler1D palette;
in vec2 texcoord;
void main()
{
float index = tex2D(image, texcoord).r * 255.f; // 255 for a 8 bit palette
gl_FragColor = texelFetch(palette, index, 0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)