使用 OpenGL 进行快速调色板屏幕块传输

2023-12-08

游戏使用软件渲染在内存中绘制全屏调色板(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(使用前将#替换为@)

使用 OpenGL 进行快速调色板屏幕块传输 的相关文章

  • 云或烟雾的粒子系统

    我正在尝试使用 OpenGL 和 CUDA 制作一个简单的用于云和烟雾模拟的粒子系统 如何使粒子系统中的粒子表现得像真正的云或烟雾在低湍流风中的表现 我现在遇到的一些问题是 颗粒聚集成一个大球 粒子扩散到无限远 粒子突然弹射离开 我已经完成
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • OpenGL 使用着色器将 NV12 转换为 RGB24

    我尝试编写一个应用程序来在 OpenGL 中显示 YUV 图像 我使用此代码片段在 C 中成功将 Y UV 转换为 RGB source https blog csdn net subfate article details 4730514
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • 在 3D 场景中实现“抓取”相机平移工具

    在我的场景中 我有想要 抓取 的地形 然后在移动光标时让相机平移 其高度 视图向量 视野等全部保持不变 因此 最初的 抓取 点将是世界空间中的工作点 我希望在拖动时该点保留在光标下方 我当前的解决方案是获取前一个和当前的屏幕点 取消投影它们
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其
  • 将 Spritekit 游戏转换为 Android?

    是否有任何新选项可以将 spritekit 游戏转换为 Android 游戏 似乎唯一的选择是用 Java 重新编码所有内容或使用 Cocos2D LibGDX 等 很不幸的是 不行 而且带有 Apportable 服务的跨平台 Sprit
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错
  • 使用 gl_FragColor 与 vec4 颜色?

    似乎有很多不明确的地方gl FragColor被弃用 例如 它缺失在GLSL 4 40 规范 https www khronos org registry OpenGL specs gl GLSLangSpec 4 40 pdf 但它包含在
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • 之前对 GL.Color3 的调用使我的纹理使用了错误的颜色

    制作 2D OpenGL 游戏 渲染帧时 我需要首先绘制一些计算的四边形几何体 然后绘制一些纹理精灵 当我的渲染方法主体仅绘制精灵时 一切正常 但是 当我尝试在精灵之前绘制几何四边形时 精灵的纹理会更改为之前使用的最后一个 GL Color
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • 是否可以在 Mac OS X 上构建 FreeGLUT?

    我正在做一些关于 OpenGL 的教程 http www arcsynthesis org gltut Basics Tutorial 2001 html那个使用FreeGLUT http freeglut sourceforge net
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • 线性/非线性纹理映射扭曲的四边形

    In my 上一个问题 https stackoverflow com questions 10832909 quad strip texturing distortion 已经确定 当对四边形进行纹理化时 面被分解为三角形 并且纹理坐标以
  • 如何在 Moderngl EGL 后端添加深度缓冲区?

    此代码渲染一个带有抗锯齿功能的彩色三角形 samples 8 当深度缓冲线depth attachment ctx depth texture 512 512 samples 8 被评论 但是当我添加深度缓冲区时 它会在绑定处返回 GL 错

随机推荐

  • Request.IsAuthenticated 始终返回 false

    我正在努力向我正在构建的站点添加登录功能 但登录后 Request IsAuthenticated 属性始终返回 true 我搜索了这个错误并一遍又一遍地找到相同的答案 但这些解决方案对我不起作用 来自 AccountController
  • Android:在 ConstraintLayout 中保留全宽和未定义高度 ImageView 的比例?

    In a ConstraintLayout an ImageView与其父级绑定的方式如下 它的左侧绑定到屏幕的左侧 它的右侧绑定到屏幕的右侧 它的顶部绑定到小部件的底部 它的底边绑定到屏幕的底边 Thus my ImageView看起来是
  • .Value = .Value 的作用与 VBA 中的 Evaluate() 函数类似吗?

    考虑以下片段 它将相同的公式写入两个单元格A1 and A2 Sub Main With Range A1 Formula 1 1 End With With Range A2 Formula 1 1 Value Value End Wit
  • 日期之间的差异

    我想计算两个时间之间的差异 其中一个是当前时间 另一个是 HH MM 格式 始终是未来时间 如果我只是从 now 中减去 futuretime 它当然应该是一个正数 这工作正常 直到 如果 now 是下午或晚上 而 futuretime 是
  • PHP按位左移32位问题以及大数算术运算的不良结果

    我有以下问题 第一 我试图对一个大数进行 32 位按位左移 并且由于某种原因该数字总是按原样返回 例如 echo 516103988 lt lt 32 echoes 516103988 因为将位向左移动一位相当于乘以 2 所以我尝试将数字乘
  • 错误:来自角度控制器的 [ng:areq]

    这是一个很遥远的事情 但是以前有人见过这个错误吗 我正在尝试使用 Express Angular 和 mongoDB 添加 传输器 每当我访问由传输控制器控制的页面时 我都会收到此错误 Error ng areq http errors a
  • 如何正确配置node.js以使用自签名根证书?

    所以 在绝望的路上 我想知道是否有人在某个地方可以帮助我配置nodejs以接受根CA自签名 我需要它才能通过使用 TLS 的节点获取来访问开发中的自定义 API 环境 操作系统 Ubuntu 20 04 作为虚拟机中的来宾 Windows
  • 根据 JavaScript 中的另一个对象数组过滤对象数组

    我有一个像这样的数组 arr1 A red B blue Q green R blue B green M red Q white R blue 每个对象都有两个键 值对 一个字母和颜色 我有另一个像这样的数组 filter A val B
  • Perl:在复杂哈希内生成数组

    为了使我的数据更易于访问 我想将表格数据存储在复杂的哈希中 当脚本循环遍历我的数据时 我试图增长一个 HoHoHoA 根据 perldsc 中的指南 push hash column i date hour data i 该脚本编译并运行没
  • JBoss 上的 JaxWS ClassCastException

    我正在使用 JBoss 5 1 0 GA 适用于 JDK6 和 jaxws 2 2 6 当我调用 Web 服务时 出现以下异常 java util ServiceConfigurationError javax xml ws spi Pro
  • Kotlin 中的简单泛型函数失败

    这是 Kotlin 中的一个简单的泛型函数 fun
  • RGoogleDocs 和现在的 RGoogleData

    RGoogle文档太棒了 它允许人们在 Google 上存储数据并将其实时读取到 R 前几天我尝试将其安装在计算机上 结果发现我能找到的只是 RForge 中的 RGoogleData 这两个包之间有什么关系呢 我尝试在同一搜索中谷歌搜索
  • iOS HTML5 Canvas toDataURL

    我需要一些帮助 我们似乎在 iOS 上遇到了有关通过 HTML 5 Canvas 获取图像的 base64 的问题 如果我们使用画布的默认高度 宽度或对高度和宽度进行硬编码 一切都会正常工作 但是 如果我们将画布高度 宽度设置为图像 src
  • KSQL 表-表左外连接多次发出相同的连接结果

    使用 KSQL 并执行左外连接 我可以看到有时多次发出的连接结果 换句话说 相同的连接结果会被多次发出 我不是在谈论右侧具有空值的联接版本和不具有空值的版本 从字面上看 连接产生的同一条记录会被多次发出 我想知道这是否是预期的行为 一般答案
  • 如何在 Flutter 中嵌套 StreamBuilder?

    我有 2 个流 需要组合起来构建一个小部件 但与我见过的其他问题不同 我需要嵌套流 我有一个从 Firestore 获取文档集合的流 以及一个依赖于第一个文档的数据来获取文档子集合的流 我想将它们组合成一个流 但它们需要嵌套 因为每个文档都
  • 通过传递引用或返回引用来初始化结构是更好的方式吗?

    假设我有以下内容 typedef struct int x int y char a char b myStruct 创建一个新的更好的做法吗 myStruct通过传递对空函数的引用或返回一个函数来使用函数myStruct来自函数 void
  • 正则表达式在特定位置添加空格

    我有一个 14 位长的号码 需要将其拆分成以下格式 xxx xxx xxx xxxxx 我有一个正则表达式 它从末尾开始分割每 3 个字符 因为前瞻 d 3 d 这给了我 xx xxx xxx xxx xxx 我尝试在 regex101 c
  • 在 R 的行组中向前和向后进行最后一个因子观察

    假设我的数据集看起来像 ID Name 1 JAY 1 1 JAY 2 LAY 2 LAY 2 3 NA 3 KAY 3 我想根据组中已有的观察结果用缺失值 空或 NA 填充行 所以结果数据框看起来像 ID Name 1 JAY 1 JAY
  • 无法移出定义“Drop”特征的类型 [E0509]

    我使用以下 Rust 代码Rust Postgres打算在我的结构超出范围后提交事务 struct SqlTransaction lt a gt connection a Connection transaction Transaction
  • 使用 OpenGL 进行快速调色板屏幕块传输

    游戏使用软件渲染在内存中绘制全屏调色板 8 位 图像 使用 OpenGL 将图像显示在屏幕上的最快方法是什么 我尝试过的事情 glDrawPixels with glPixelMap指定调色板 并让 OpenGL 进行调色板映射 性能非常糟