游戏使用软件渲染,在内存中绘制一个全屏幕的(8位)图像。
使用OpenGL将图像放到屏幕上最快的方法是什么?
我尝试过的事情:
glDrawPixels与glPixelMap一起指定调色板,并让OpenGL执行调色板映射。表现极差(~5 FPS)。glDrawPixels绘制。性能更好,但CPU的使用率仍然远远高于使用32位DirectDraw与相同的软件调色板映射。我应该用某种纹理来代替吗?
发布于 2012-09-21 08:42:18
这可不奇怪。glDrawPixels一开始不是很快,glPixelMap将在一个不太优化的代码页中在CPU上执行索引/调色板→RGB转换。
glDrawPixels是OpenGL中最慢的函数之一。这有两个主要原因:第一,它是一个不太优化的代码页,其次,它直接写入目标帧缓冲区,从而迫使管道在每次调用时同步。而且,在大多数GPU上,它没有任何缓存支持。
我建议您将索引图像放置到单通道纹理中,例如GL_R8 (用于OpenGL-3或更高版本)或GL_LUMINANCE8,以及您的调色板为一维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);
}https://stackoverflow.com/questions/12524813
复制相似问题