gpt4 book ai didi

opengl - 使用 OpenGL 的快速调色板屏幕 blit

转载 作者:行者123 更新时间:2023-12-02 17:47:46 26 4
gpt4 key购买 nike

游戏使用软件渲染在内存中绘制全屏调色板(8 位)图像。

使用 OpenGL 将图像显示在屏幕上的最快方法是什么?

我尝试过的事情:

  • glDrawPixelsglPixelMap 指定调色板,并让 OpenGL 进行调色板映射。性能非常糟糕(~5 FPS)。
  • 在软件中进行调色板映射(索引 -> BGRX),然后使用 glDrawPixels 进行绘制。性能更好,但 CPU 使用率仍然比使用具有相同软件调色板映射的 32 位 DirectDraw 高得多。

我应该改用某种纹理吗?

最佳答案

  • glDrawPixels with glPixelMap to specify the palette, and letting OpenGL do the palette mapping. Performance was horrendous (~5 FPS).

这并不奇怪。 glDrawPixels 开始时不是很快,glPixelMap 将在 CPU 上以肯定不是非常优化的代码路径进行索引/调色板 → RGB 转换。

  • Doing palette mapping (indexed -> BGRX) in software, then drawing that using glDrawPixels.

glDrawPixels 是 OpenGL 中最慢的函数之一。这有两个主要原因:首先,它是一个优化程度不高的代码补丁,其次,它直接写入目标帧缓冲区,因此每次调用时都会强制管道同步。同样在大多数 GPU 上,它没有任何缓存支持。

我建议您将索引图像放入单 channel 纹理中,例如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);
}

关于opengl - 使用 OpenGL 的快速调色板屏幕 blit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12524813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com