创建并加载用于 openGL 的 RGBA4444 RGBA5551 中的 .png

2024-03-22

我正在创建一个 openGL 游戏,到目前为止,我一直在使用 RGBA8888 格式的 .png 作为纹理表,但这些太占用内存了,而且我的应用程序经常崩溃。我在 Apple 网站上读到,这种格式仅在需要太多质量时才使用,并建议使用 RGBA4444 和 RGBA5551(我已经将纹理转换为 PVR,但大多数精灵表中的质量损失太大)。

我只需要在纹理加载器类中的 glTexImage2D 调用中使用 GL_UNSIGNED_SHORT_5_5_5_1 或 GL_UNSIGNED_SHORT_4_4_4_4 来加载我的纹理,但我需要将纹理表转换为 RGBA4444 和 RGBA5551,而且我对如何实现这一点一无所知。


严重地?有一些库可以进行这种转换。但坦率地说,这有点无聊。有些库使用 asm 或专门的 SSE 命令来加速这一过程,速度会很快,但在 C/C++ 中使用您自己的格式转换器非常容易。 您的基本流程是:

  • 给定一个 RGBA8888 编码值的缓冲区
  • 创建一个足够大的缓冲区来容纳 RGBA4444 或 RGBA5551 值。在这种情况下,很简单——尺寸减半。
  • 循环源缓冲区,解包每个组件,重新打包为目标格式,并将其写入目标缓冲区。

    void* rgba8888_to_rgba4444(
      void* src, // IN, pointer to source buffer
      int cb)    // IN size of source buffer, in bytes
    {
      // this code assumes that a long is 4 bytes and short is 2.
      //on some compilers this isnt true
      int i;
      // compute the actual number of pixel elements in the buffer.
      int cpel = cb/4;
      unsigned long* psrc = (unsigned long*)src;
      // create the RGBA4444 buffer
      unsigned short* pdst = (unsigned short*)malloc(cpel*2);
      // convert every pixel
      for(i=0;i<cpel; i++)
      {
        // read a source pixel
        unsigned pel = psrc[i];
        // unpack the source data as 8 bit values
        unsigned r = p & 0xff;
        unsigned g = (pel >> 8) & 0xff;
        unsigned b = (pel >> 16) & 0xff; 
        unsigned a = (pel >> 24) & 0xff;
        //convert to 4 bit vales
        r >>= 4;
        g >>= 4;
        b >>= 4;
        a >>= 4;
        // and store
        pdst[i] = r | g << 4  | b << 8 | a << 12;
      }
      return pdst;
    } 
    

我所做的实际转换循环非常浪费,可以在一次传递中提取、转换和重新打包组件,从而实现更快的代码。我这样做是为了使转换明确并且易于更改。另外,我不确定我是否以正确的方式获得了组件订单。因此它可能是 b、r、g、a,但它不应该影响函数的结果,因为它以相同的顺序重新打包到目标缓冲区中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建并加载用于 openGL 的 RGBA4444 RGBA5551 中的 .png 的相关文章

  • iPhone - SSL 连接

    学习通过 iPhone 连接 ssl Web 服务的最佳起点是什么 到目前为止 我通过 SOAP 等通过 http 进行了一些基本连接 但我没有使用 https 的经验 任何好的资源 教程 起始参考 use nsurl class 都值得赞
  • 应用程序未运行时处理推送通知

    当我的应用程序是not运行并收到推送通知 如果我单击该通知 应用程序将启动 但随后它不会提示用户我设置的警报视图 询问他们是否要查看通知的内容 它刚刚启动 就坐在那里 推送通知确实有效完美当应用程序is正在运行 无论是作为活动应用程序还是在
  • 如果按下子视图的按钮如何取消 UIGestureRecognizer

    我正在努力从手势识别器中获得我想要的行为 特别是在其他手势已触发时取消某些手势 我有一个滚动视图设置为分页和每个页面中的多个子视图 我添加了一个触摸手势识别器 如果用户点击页面的右侧或左侧 则可以滚动到下一页或上一页 Add a gestu
  • 如何解决 iPhone 应用程序中的无效转换说明符警告

    我有 iphone 应用程序 其中为标签分配值 但是当我构建它时 它显示以下警告无效转换说明符 这是标签赋值的代码 label1 text NSString stringWithFormat d newvalue1 The 被解释为格式字符
  • “试图弹出到不存在的视图控制器。”

    当我调用我的方法 DismissView 时 我收到此错误 这是方法存根 IBAction dismissView RootViewController rootController RootViewController alloc ini
  • 如何在ios中重置触摸、触摸移动的NSTimer

    我正在开发一个应用程序 其中我必须在 3 秒后隐藏控制按钮 所以我使用 NSTimer 编写代码 然后开始触摸 它可以工作 但问题是 当我再次触摸任何其他按钮时 我的计时器不会重置 即使我像拖动一样移动我的触摸示例 如果我拖动或移动触摸 它
  • UIWebView 是否在请求标头中发送与移动 Safari 相同的用户代理?

    抱歉 我只想自己测试一下 但我目前没有 Mac UIWebView 内部发出的 Web 请求是否发送与移动 Safari 发出的 Web 请求相同的用户代理信息 从 UIWebView 发出的 Web 请求不会在用户代理字符串中包含单词 S
  • 支持从右到左的纯布局

    iOS纯布局支持从右到左的语言吗 我们如何在阿拉伯语言的代码中实现它 而不需要去设置并选择区域和格式语言 Thanks 您可以通过在 Xcode gt 编辑方案 gt 运行 gt 选项 选项卡 gt 应用程序语言 gt 从右到左伪语言中选择
  • 如何在 iPhone 中使用可达性代码查找服务器是否可达?

    我有客户端服务器说 http abc com 我想检查该服务器是否响应 如何使用苹果的可达性代码检查这一点 当我看到该代码但无法找到在哪里编写我的客户的网址来检查这一点 请建议我 这是一个同步示例 您可能希望异步执行此操作 但这将帮助您完成
  • 自定义绘制的 UITableViewCell 中的可访问性

    当您进行自定义绘图时 UITableViewCells 滚动速度会显着提高 但是辅助功能会中断 应该如何向这样的单元添加辅助功能支持 老问题了 但 iOS 已经内置了对这种辅助功能的支持 看看UIAccessibilityContainer
  • 如何使用 Codable 解析此 JSON?

    我一直在尝试从我的中解析这个对象JSON并不断收到此错误 错误 类型不匹配 Swift Array Swift DecodingError Context codingPath debugDescription 本应解码数组 但找到了字典
  • PWA 可以访问联系人、GPS 或使用手机摄像头吗?

    PWA 可以访问联系人 GPS 或使用手机摄像头吗 这在任何系统 ios android 中都可能吗 是否有任何开发计划来实现这些功能 PWA 无法克服一些限制 you cannot访问电话上的联系人列表 另一方面 你can拍照并使用 GP
  • 我可以在 iOS 中测量蓝牙信号强度吗?

    Can I 测量信号强度我的 iPhone 范围内的蓝牙设备数量 基本上我想要做的是扫描范围内的设备列表 然后查看哪个设备的信号强度最高 在 iOS 中是否可行 如果可以 我该怎么做 是的 有一种方法可以测量蓝牙低功耗 4 0 的信号强度
  • Windows 下 iOS 开发的替代方案 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 使用 Javascript 获取 Mobile Safari 中选定的文本

    因此 我正在开发一个小书签 对于我来说 使用 循环 获取用户选择的内容是理想的选择 window getSelection 和 document getSelection 都是我可以调用的函数 但是它们始终返回空字符串 我相信问题在于 当您
  • 左右并排放置两个 UILabels,而不知道左标签中文本的字符串长度

    在 iPhone fb 应用程序的照片选项卡中 对于每个表格视图单元格 他们都会放置相册标题 后跟相册中的图片数量 例如 第一张专辑 22 最后也是最后的 12 我认为有两个标签 一个用于标题 一个用于数字 因为数字实际上是不同的 UICo
  • UITableView 如何一次显示两个不同的数组?

    下面的代码有效 但不符合我的意愿 我希望当我单击 UIbutton 时 它会自动更新 UITableview 中的新值而不是旧值 下面的代码仅在我按下 UIbuttons 时有效 之后当我滚动 UITableview 时它会更新具有新值的
  • 一个 UITableView 中的两种不同的单元格类型

    大家好 我对如何在一个具有两个部分的 UITableView 中使用两种不同的单元格类型感到非常困惑 第一部分应返回一个大单元格 其中包含大量文本 另一部分应返回三个单元格 以导航到其他视图 我尝试过这样的 UITableViewCell
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 如何防止 iPhone 4 在添加到主屏幕时截断我的标题?

    我的网页标题很长 当添加到 iPhone 旧版本的主屏幕时 整个标题在确认对话框中可见 当我添加到 iPhone 4 的主屏幕时 标题在第 12 个符号之后被切断 有没有办法阻止这种剪切 让 iPhone 默认显示完整标题 显然会有一个无证

随机推荐

  • Firebase-perf 与 let 插件冲突

    最近 我们被要求在 Android 应用程序上实现 Firebase 性能监控 但它给我们带来了许多不同的问题 该应用程序曾经工作得很好 但是在添加 firebase perf 后 它可以编译 但在运行时我们发现让插件 https gith
  • 在 Javascript/jQuery 中解码 base64 文件以供下载

    今天我一直在尝试 SQL 二进制对象 我首先将图像存储在表中 发出 AJAX 请求以对图像进行 Base64 编码 然后使用 来显示它 img src 图像显示良好 我正在从事的网络项目也需要文件下载 主要是 PDF 太棒了 我想 我也将
  • 无法创建新的雅虎应用程序

    这个链接过去一直很挑剔 现在似乎完全失效了 https developer yahoo com apps create https developer yahoo com apps create 是不是不能再创建 Yahoo 应用程序了 N
  • PHPhotoLibrary.requestAuthorization() 在 iOS 9 上不触发授权提示

    我有以下功能 显示带有两个不同选项的操作表 目前 唯一实施的选项是标题为 照片 的选项 正确呈现操作表并调用正确的操作 我的问题是 在模拟器和实际设备上 我无法显示请求访问照片库的提示 PHPhotoLibrary authorizatio
  • 由于行高与垂直对齐冲突,文本被截断:顶部

    我有一个表格 其中包含一个表格内格式类似于文本的提交按钮 一般情况下 所有表行都设置为vertical align top 如果我不对格式化文本应用行高 则其底部部分将被切断 如以下字母所示p q等等 小提琴的底部 如果我确实将其应用行高
  • Xcode 12 - 下载更多模拟器运行时为空

    I can t add more simulator OS version in XCode 12 for example iOS 13 the list is empty 如何添加更多不同ios版本的模拟器 我遇到了完全相同的问题 苹果返
  • 以 cweb 或 noweb 样式导出代码块名称?

    在 Org 模式下编写 Lite 程序时 导出类似于在早期的 Lite 编程工具 例如 cweb 或 noweb 中编织 这些工具会将代码块名称添加到编织 导出 输出中 在组织模式下 它看起来像这样 组织文件 NAME mycodebloc
  • Firestore.firestore() 失败并显示“类型‘Firestore’没有成员‘firestore’”

    我正在尝试为我的 Firestore 设置数据库 但是我尝试重新安装 Pod 和许多其他东西 但我仍然无法让它工作 因为它显示了以下错误 Type Firestore has no member firebase 我不知道为什么会这样 因为
  • Javascript 保持 div 隐藏,直到您单击按钮,需要帮助修改

    基本上 我的代码现在隐藏了我网站上的一些 div 然后当您单击链接时 它会使 div 出现 我需要帮助 以便当我单击一个链接时出现一个 div 然后单击另一个链接时 前一个链接会消失 假设我点击 关于 链接 div 出现了 很好 然后我点击
  • 汇编中的蛇,使用什么数据结构?

    我对汇编完全陌生 不管你信不信 我们的第一个任务是在汇编中创建蛇 我应该如何储存蛇 我应该把它放在堆栈中 还是应该将它放入某个寄存器中 我已经对这种 可怕的 语言进行了大约 3 天的研究 但无法找到一个好的开始方法 我可能会在 c 中使用某
  • 如何用Java读取.EXE文件的内容

    在 Java 中读取可执行文件有哪些可能的选项和最合适的选项 我想生成 exe 文件的十六进制表示形式 我正在考虑以二进制方式读取文件 然后进行转换 但是我怎样才能读取 exe呢 1 以字节形式读取文件 使用 BufferedInputSt
  • 在单个 RecyclerView 中使用来自 Firestore 和 Firebase RTDB 的数据

    我有一个 RecyclerView 它由存储在 Firestore 数据库中的帖子填充 每个帖子都被编写为具有唯一 postID 的文档 存储发布的消息 时间戳和点赞计数器 mUploads is defined as private Li
  • 如何解析 C# 的命令行输出?

    我想从 C 执行一个应用程序 命令行应用程序 并且我想在执行该应用程序并向其提供输入后 我想解析将产生它的输出 因为 它会输出很多东西 而我想从中获取我需要的东西 我怎样才能做到这一点 我怎样才能得到c 中的输出 然后只从中获取我需要的东西
  • Tensorflow:计算关于高阶张量的 Hessian 矩阵(仅对角部分)

    我想计算我指定的损失相对于 vgg16 conv4 3 层内核 3x3x512x512 维矩阵 的每个特征图的一阶和二阶导数 Hessian 的对角部分 如果根据以下公式尊重低阶导数 我知道如何计算导数如何在Tensorflow中计算所有二
  • commitHandler 和 .validate() 问题

    最近我在将文件附加到电子邮件中时遇到问题 我处理了这个问题 顺便说一句 谢谢你们 现在我遇到了与 固定 附加文件有关的下一个问题 其实问题比我想象的还要多 1 在下面的代码中 在验证插件中 我认为调用类似 名称 必需 的规则就足够了 但事实
  • Coq 中 MSet 的使用示例

    MSets https coq inria fr library Coq MSets MSets html似乎是 OCaml 式有限集的最佳选择 可悲的是 我找不到示例用途 如何定义一个空的MSet或单身人士MSet 我怎样才能结合两个MS
  • 正确实施全局配置

    我的目标是在我正在开发的 C 游戏中拥有全局常量 以表示一些图形信息等 我当前的实现是将它们全部放在 h 中并将它们包含在各处 这是可行的 只是每次我更改设置时 都必须重新编译整个代码库 所以 我的下一个想法是将它们放入一些配置 txt 文
  • 如何替换 JUnit 5 中的 WireMock @Rule 注释?

    我在测试中使用 WireMock 并有这样一行代码 Rule public WireMockRule wireMockRule new WireMockRule 8080 我想切换到 JUnit 5 所以我添加了下一个依赖项 使用 Grad
  • C++ 数组中对象的多态性

    我是一名嵌入式软件工程师 来自位和 C 世界 在那个世界里 闪存中有数据 用C语言的const表示 RAM中有数据 RAM 昂贵且有限 而闪存则便宜且足够 此外 由于碎片问题或安全规定 不允许使用 new delete malloc 等动态
  • 创建并加载用于 openGL 的 RGBA4444 RGBA5551 中的 .png

    我正在创建一个 openGL 游戏 到目前为止 我一直在使用 RGBA8888 格式的 png 作为纹理表 但这些太占用内存了 而且我的应用程序经常崩溃 我在 Apple 网站上读到 这种格式仅在需要太多质量时才使用 并建议使用 RGBA4