OpenGL ES 像素艺术 - 缩放

2024-04-16

我在 iPhone 上的 OpenGL Es 1.1 上显示基于像素的艺术(想想复古瓷砖和艺术)时遇到问题。

图块使用 8 个字节(每行 1 个字节)表示,每一位代表一个像素是否被设置。

例如数字为 8 的图块:

0 0 0 0 0 0 0 0      ->
0 0 1 1 1 0 0 0      ->        xxx
0 1 0 0 0 1 0 0      ->       x   x
0 1 0 0 0 1 0 0      ->       x   x
0 0 1 1 1 0 0 0      ->        xxx
0 1 0 0 0 1 0 0      ->       x   x
0 1 0 0 0 1 0 0      ->       x   x
0 0 1 1 1 0 0 0      ->        xxx

在 iPhone 上使用以下命令将其转换为 OpenGL

glDrawArrays(GL_POINTS, 0, 64);

逻辑是对的,但问题是没有复古的效果。我一直在寻找更多的块状/复古风格。我读到我可以关闭像素平滑,这会导致像素显示为正方形。(我认为这是 GL_Disable(POINT_SMOOTH),但不确定这是否会影响 ES,因为没有任何改变。)

我发现相关问题的可能解决方案:

  1. 使用帧缓冲区渲染到较小的分辨率,然后在渲染缓冲区中将其放大。我不知道这是如何做到的或者是否有效。
  2. 从像素创建图像,从该图像创建纹理,最后渲染该纹理。

我想到的可能的解决方案:

  1. 对于每个像素,在水平和垂直方向上绘制两个像素。
  2. 使用三角形将每个像素绘制为正方形。
  3. 使用 GLPointSize - 设置为 2 时会产生正确的效果,但坐标会变得混乱。对齐变得更加困难。

最终我希望呈现瓷砖:

这让我更多地了解了 OpenGL 和像素的工作原理,并且我正在使用 Gameboy 模拟器来解决这个问题。如果有人认为正确的方法是手动创建图形并将其加载为纹理,那么这不是可行的答案。


有很多方法可以做到这一点,我建议您使用第一个已经找到的方法。将场景绘制到较小的缓冲区,然后将其重新绘制到画布上。

您在这里寻找的是 FBO(帧缓冲区对象)。查找一些有关如何创建 FBO 并向其附加纹理的示例。这将为您创建一个包含您输入的任何尺寸的缓冲区。这里的一些常见问题是,您很可能需要 POT 纹理(2 维的幂:2、4、8、16...例如 64x128 缓冲区),因此要控制不同的大小,您应该使用视口,然后视口将仅使用您需要的缓冲区的一部分。

所以最终这将创建一个低分辨率纹理,可用于绘制到画布(视图)。你如何绘制一些你应该尝试的东西。这些点可能不是最好的解决方案,即使在缓冲区的情况下,我也会使用您在示例中定义的点之间的线。此时,您必须选择使用或不使用抗锯齿进行绘制。要启用它,请在 iOS 上寻找多重采样。

获得绘制形状的纹理后,您需要将其重新绘制到视图中。这几乎是在绘制全屏纹理。同样,你有多种绘制它的方法。这里最强大的工具是纹理参数:使用最接近的将丢弃所有颜色插值,并且方块应该可见;使用线性(或三线性)将进行一些插值,结果可能会更接近您想要实现的效果。然后您可以再次使用多重采样来创建抗锯齿并获得更好的结果。

所以这里的权力是:

  • 不同的 FBO 缓冲区大小
  • FBO 上的抗锯齿
  • 纹理参数
  • 重绘到画布时抗锯齿

对于 FBO 来说,这是最简单的事情之一:

  • 生成帧缓冲区(glGenFramebuffers)
  • 绑定帧缓冲区(glBindFramebuffer)
  • 创建纹理(glGenTextures)并绑定它(glBindTexture)
  • 设置纹理数据glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, twidth, theight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
  • 将纹理附加到帧缓冲区glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.textureID, 0);
  • 现在,当您绘制到纹理时,您需要绑定 FBO 帧缓冲区,而当您绘制到主缓冲区时,只需绑定该帧缓冲区。

由于这是一个相当广泛的答案(就像问题一样)...如果您将要实现这一点并且有其他疑问或问题,最好创建一个单独的问题并可能在评论中链接它们。

祝你好运。

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

OpenGL ES 像素艺术 - 缩放 的相关文章

  • 为什么我的matchedGeometryEffect根据右下点移动?

    我只是尝试使用matchedGeometryEffect 制作一些动画 但是 存在一个错误 即该对象是根据右下点而不是中心进行动画处理的 我使用的代码在这里 import SwiftUI struct Test View Namespace
  • 将深层链接传递到 iOS 模拟器?

    我想找到一种更简单的方法来在 iOS 模拟器中调用深层链接 在 Android 上 您可以使用 ADB 通过控制台将链接传输到模拟器中 是否有类似的方法或解决方法来打开最新 iOS 模拟器的深层链接 您可以在终端中输入以下内容 xcrun
  • 无法转换“String”类型的值?预期参数类型“URL”

    我正在尝试从主包中的文件加载数据 当我使用这段代码时 let path Bundle main path forResource abc ofType txt let dataTwo try Data contentsOf path err
  • 动态框架中未定义的架构符号

    我正在开发一个 iOS 框架 该框架包含多个第三方框架并使用 UnitySendMessage C 方法与 Unity 进行通信 我想创建一个动态框架 支持 iOS8 但我偶然发现以下编译错误 Undefined symbols for a
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE
  • Iphone safari 无法在键盘打开时调整视口大小

    当键盘弹出时 Mobile safari 不会更新 window innerHeight 至少在9 3 5中 并且有几个答案 例如this https stackoverflow com a 17604856 2423187一 有评论说在
  • Swift iOS 9.2 中的每日本地通知

    尝试快速发送每日本地通知 然而 由于某种原因 它只是每分钟发送一次 我希望第一个通知在应用程序打开后 30 分钟发送 然后每天重复此通知 在 swift fie 中我有以下代码 每日通知代码 同时在应用程序委托中添加部分 让 Date NS
  • 如何获取 HKWorkoutActivityType 的字符串描述?

    我正在开发一项功能 可以从健康应用程序中读取 HKWorkout 样本 我想向用户显示一个描述字符串 告诉他们锻炼是什么 我能看到的唯一可能向用户指示样本代表的活动类型的属性是workoutActivityType财产 我应该如何将 HKW
  • “未发现包含任何钥匙串签名证书的未过期配置文件”恐怖

    我看到了其他一些涉及这个主题的问题 但没有一个像我的 昨天我无意中将一个设备添加到设备列表中 问题 我的印象是 一旦添加设备 它现在就会链接到配置文件 然而 我相信它没有链接到我的分发配置文件之一 因此 我进入编辑配置文件 单击设备旁边的复
  • 为什么每次用户启动应用程序时都要注册推送通知?

    在Apple文档中你可以找到下面这句话 应用程序应在每次启动时进行注册 并向其提供者提供当前令牌 它调用 registerForRemoteNotificationTypes 来启动注册过程 因此 当我在应用程序中实现推送通知时 我必须注册
  • 如何在UIWindow中添加视图?

    我想添加一个视图UIWindow与以下代码 AppDelegate delegate AppDelegate UIApplication sharedApplication delegate UIWindow window delegate
  • swift:移动动画

    我在故事板中有 viewController 还有4个正方形 我想将我的方块放在视图中 首先我想显示两个正方形 如果我按下按钮 我希望我的红色 2 个方块向左移动 然后显示接下来的 2 个蓝色方块 就像这部动画 我需要创建一个scrollV
  • UICollectionView 装饰和补充视图无法移动

    In UICollectionView装饰和补充意见似乎是一个很大的谜团 目前似乎几乎没有示例代码 我设法让这两种类型在自定义布局中工作 请参阅此post https stackoverflow com questions 12810628
  • iOS图片上的线测量

    我需要一些帮助来开始绘制末端带有圆圈的线条 并测量其长度 我能够划清界限 但无法让它移动 花了几个小时决定在 SO 上发布 因此 请参阅下图并指导我开始 任何使用 Objective C 的示例或教程都会有帮助 谢谢 这个想法看起来实现起来
  • UITextField 中光标闪烁,但键盘不出现

    我得到了一个带有文本字段的简单详细视图 在详细的viewController中我写了这段代码 void viewDidAppear BOOL animated self textField becomeFirstResponder NSLo
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • libgdx SpriteBatch 渲染到纹理

    是否可以使用 libGdx 适用于 Android 桌面的 Java 引擎 中的 SpriteBatch 渲染到纹理 如果是这样 怎么办 基本上我想将所有内容渲染到 512 x 256 纹理的 320 x 240 区域 然后缩放区域以适合屏
  • 检测 UITableViewCell 何时离开屏幕

    我正在实施一个丰富的UITableView与定制创建UITableViewCell 我以一种方式在屏幕上显示这些 但是一旦它们离开屏幕 我想记下这一点 因为它们第二次出现时我希望它们以不同的方式显示 认为离开屏幕时自动 标记为已读 我一直在
  • ios - ARKit - 如何创建旋转对象手势功能?

    我是 ARKit 新手 我想创建一个旋转对象的函数 这是我关于拖动和旋转对象的代码 Rotate object objc func rotateRecognized sender UIPanGestureRecognizer let sce

随机推荐

  • r - 如何清除 rJava 使用的内存?

    我正在使用 xlsx 包创建工作簿 工作表 将数据写入工作表 然后保存工作簿 然而 当我多次重复这组操作时 我开始出现错误消息 gt Error in jcheck silent FALSE java lang OutOfMemoryErr
  • DbSet、模型构建器和 EF 导航属性

    我正在尝试实现一个多租户应用程序 在其中通过租户对象查询数据库 而不是直接从上下文中查询 在我拥有这个之前 public User GetUserByEmail string email using var db CreateContext
  • 为子域设置了 Cookie,但 IE 开发工具在根域显示 Cookie。我缺少什么?

    我们有许多网站挂在根域上 例如 dev mydomain co nz test mydomain co nz www mydomain co nz 我使用 Fiddler 监控与 dev mydomain co nz 的连接 并收到一个带有
  • Eclipse:无法加载 JNI 共享库“C:\Program Files(x86)\Java\jdk1.7.0_15\bin\..\jre\bin\client\jvm.dll

    我正在尝试安装 Eclipse 为了安装我已经完成了以下操作 安装JDK 7u15 64位 实际下载名称 jdk 7u15 windows i586 exe 在C Program Files x86 Java JDK 1 7 0 15 我在
  • 使用 Python 可视化 LDA 模型

    我有一个 LDA 模型 包含 10K 文档中 10 个最常见的主题 现在它只是对每个主题的单词及其相应概率分布的概述 我想知道 python 是否有可用的东西来可视化这些主题 pyLDAvis https pypi python org p
  • cudaMallocManaged() 返回“不支持的操作”

    在 CUDA 6 0 中尝试托管内存给了我operation not supported打电话时cudaMallocManaged include cuda runtime h include
  • 合理的密码强度正则表达式

    我们使用标准的 ASP NET 身份验证提供程序 恰好是 AspNetSqlMembershipProvider 默认密码强度要求对于我们的需求来说有点过高 我们要求用户输入至少由字母数字组成的密码 即 必须包含字母和至少一个数字 如果用户
  • 拒绝 git 推送

    To email protected cdn cgi l email protection xxx xxxxx git rejected master gt master non fast forward error failed to p
  • F# 类型函数和 [] 属性

    这两个 F 类型函数有什么区别 let defaultInstance1 lt a when a new unit gt a gt new a
  • 使用 Firebase 的 GoogleApiClient 中出现罕见的 NullPointerException

    我正在使用 GoogleApiClient 使用 Google 帐户登录用户 基本上 我使用 Firebase Auth 和 Google 登录 但我每天都会在某些设备上遇到这种崩溃 当我在自己的一些设备 OnePlus 3 Nexus 5
  • Spring应用程序不会在包之外启动

    我正在关注this https spring io guides gs scheduling tasks 使用 Spring 构建基本应用程序的教程 只要我遵循这个子目录结构 它就可以完美地工作 src main java hello 如果
  • WebRTC 和 Asp.Net Core

    我想将音频流从我的 Angular Web 应用程序录制到我的 Asp net Core Api 我认为 使用 SignalR 及其 websockets 是实现这一目标的好方法 通过这个打字稿代码 我可以获得一个 MediaStream
  • 如何从 AngularJS 模板中的嵌套 JSON 数组获取值?

    我下面有一些 JSON 数据 tracks album released 2013 href spotify album 3qGeRY1wt4rrLIt1YuSwHR name The Marshall Mathers LP2 Deluxe
  • 增强多边形序列化

    我在我的项目中使用增强几何体 并且需要序列化多边形 我一直在使用 boost 序列化 对于许多 boost 数据类型都没有问题 但 boost 几何似乎当前不支持序列化 因为我在序列化文件夹中找不到任何标头 有没有众所周知的方法来实现这一目
  • log4go的异常行为

    我找到了log4go http code google com p log4go w list包有时会丢失日志 以下是一个简单的代码片段 我移动了log4go目录 因此以下导入就可以了 package main import log4go
  • 如何在 QGraphicsView 中启用 QOpenGLWidget 的抗锯齿功能?

    我已通过 QGraphicsProxyWidget 将 QOpenGLWidget 添加到 QGraphicsView 不使用 setviewport QSurfaceFormat format QSurfaceFormat format
  • 如何在不使用 C++ 中的字符串函数的情况下检查字符串是否为回文

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的任务是创建一个程序来检查输入的字符串是否是回文 所以我在这里有这个简单的程序 include
  • 如何从 LDAP 目录中提取 TNSNames

    我一直在尝试查询 LDAP 目录服务器以检索 tnsnames 条目 我可以使用以下代码 但味道不对 是因为它是错误的 还是因为查询 ldap 涉及几个间接级别 let identifier LdapDirectoryIdentifier
  • Bitbucket:从提示绑定文件以供下载

    我在一个私人存储库中工作 并与我的朋友合作 他对 SCM 之类的东西不太友好 他所需要的只是监控我开发的最新版本 这是 1 个可执行文件 我想知道 而不是每次他想要获取最新更改时克隆整个存储库 有时我的更改集可能由几个仅在开发时使用而不是测
  • OpenGL ES 像素艺术 - 缩放

    我在 iPhone 上的 OpenGL Es 1 1 上显示基于像素的艺术 想想复古瓷砖和艺术 时遇到问题 图块使用 8 个字节 每行 1 个字节 表示 每一位代表一个像素是否被设置 例如数字为 8 的图块 0 0 0 0 0 0 0 0