iOS OpenGL ES - 模拟器和设备上的不同纹理行为

2023-12-22

我正在使用 OpenGL ES 加载纹理,下面是我的代码。

该图形由 2 个相同大小的纹理、停止按钮和后面的蓝色发光组成。

下面的第一张图是使用 xCode 中的 iPad 模拟器拍摄的,第二张图是在实际设备上拍摄的。第一个图形是我从 Illustrator 导出图形时的正确输出。然而,当我在 iPad 上加载该程序时,它给了我第二个图形。不知怎的,停止按钮后面的蓝光纹理似乎变小了。为什么会这样呢?

我可以通过增大蓝光纹理来进行补偿,但这并不正确,因为它在 Illustrator 中的外观应该是第一个图形。

这是我的代码。

//
//  OpenGLES_Ch3_4ViewController.m
//  OpenGLES_Ch3_4
//

#import "OpenGLES_Ch3_4ViewController.h"
#import "AGLKVertexAttribArrayBuffer.h"
#import "AGLKContext.h"

#define Y_POS 1.0
#define ASPECT_RATIO 0.75f
#define SIZE 0.8

@implementation OpenGLES_Ch3_4ViewController

@synthesize baseEffect;
@synthesize vertexBuffer;
@synthesize textureInfo0;
@synthesize textureInfo1;

/////////////////////////////////////////////////////////////////
// This data type is used to store information for each vertex
typedef struct {
   GLKVector3  positionCoords;
   GLKVector2  textureCoords;
}
SceneVertex;

/////////////////////////////////////////////////////////////////
// Define vertex data for a triangle to use in example
//static const SceneVertex vertices[] = 

static const SceneVertex vertices[] =
{
    {{-1.0f*SIZE, -ASPECT_RATIO*SIZE, 0.0f}, {0.0f, 0.0f}},  // first triangle
    {{ 0.0f*SIZE, -ASPECT_RATIO*SIZE, 0.0f}, {1.0f, 0.0f}},
    {{-1.0f*SIZE,          0.0f*SIZE, 0.0f}, {0.0f, 1.0f}},
    {{ 0.0f*SIZE, -ASPECT_RATIO*SIZE, 0.0f}, {1.0f, 0.0f}},  // second triangle
    {{-1.0f*SIZE,          0.0f*SIZE, 0.0f}, {0.0f, 1.0f}},
    {{ 0.0f*SIZE,          0.0f*SIZE, 0.0f}, {1.0f, 1.0f}},
};

/////////////////////////////////////////////////////////////////
// Called when the view controller's view is loaded
// Perform initialization before the view is asked to draw
- (void)viewDidLoad
{
   [super viewDidLoad];

   // Verify the type of view created automatically by the
   // Interface Builder storyboard
   GLKView *view = (GLKView *)self.view;
   NSAssert([view isKindOfClass:[GLKView class]],
      @"View controller's view is not a GLKView");

   // Create an OpenGL ES 2.0 context and provide it to the
   // view
   view.context = [[AGLKContext alloc] 
      initWithAPI:kEAGLRenderingAPIOpenGLES2];

   // Make the new context current
   [AGLKContext setCurrentContext:view.context];

   // Create a base effect that provides standard OpenGL ES 2.0
   // shading language programs and set constants to be used for 
   // all subsequent rendering
   self.baseEffect = [[GLKBaseEffect alloc] init];
   self.baseEffect.useConstantColor = GL_TRUE;
   self.baseEffect.constantColor = GLKVector4Make(
      1.0f, // Red
      1.0f, // Green
      1.0f, // Blue
      1.0f);// Alpha

   // Set the background color stored in the current context 
   ((AGLKContext *)view.context).clearColor = GLKVector4Make(
      0.0f, // Red 
      0.0f, // Green 
      0.0f, // Blue 
      1.0f);// Alpha 

   // Create vertex buffer containing vertices to draw
   self.vertexBuffer = [[AGLKVertexAttribArrayBuffer alloc]
      initWithAttribStride:sizeof(SceneVertex)
      numberOfVertices:sizeof(vertices) / sizeof(SceneVertex)
      bytes:vertices
      usage:GL_STATIC_DRAW];

   // Setup texture0
   CGImageRef imageRef0 = 
      [[UIImage imageNamed:@"stoplight_full.png"] CGImage];

   self.textureInfo0 = [GLKTextureLoader 
      textureWithCGImage:imageRef0 
      options:[NSDictionary dictionaryWithObjectsAndKeys:
         [NSNumber numberWithBool:YES], 
         GLKTextureLoaderOriginBottomLeft, nil] 
      error:NULL];

    self.textureInfo0_2 = [GLKTextureLoader
                         textureWithCGImage:imageRef0
                         options:nil
                         error:NULL];

   // Setup texture1
   CGImageRef imageRef1 = 
      [[UIImage imageNamed:@"stop_button.png"] CGImage];

   self.textureInfo1 = [GLKTextureLoader 
      textureWithCGImage:imageRef1 
      options:[NSDictionary dictionaryWithObjectsAndKeys:
         [NSNumber numberWithBool:YES], 
         GLKTextureLoaderOriginBottomLeft, nil] 
      error:NULL];

    self.textureInfo1_2 = [GLKTextureLoader
                         textureWithCGImage:imageRef1
                           options:nil
                           error:NULL];

   // Enable fragment blending with Frame Buffer contents
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}


/////////////////////////////////////////////////////////////////
// GLKView delegate method: Called by the view controller's view
// whenever Cocoa Touch asks the view controller's view to
// draw itself. (In this case, render into a frame buffer that
// shares memory with a Core Animation Layer)
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{   
   // Clear back frame buffer (erase previous drawing)
   [(AGLKContext *)view.context clear:GL_COLOR_BUFFER_BIT];

   [self.vertexBuffer prepareToDrawWithAttrib:GLKVertexAttribPosition
      numberOfCoordinates:3
      attribOffset:offsetof(SceneVertex, positionCoords)
      shouldEnable:YES];
   [self.vertexBuffer prepareToDrawWithAttrib:GLKVertexAttribTexCoord0
      numberOfCoordinates:2
      attribOffset:offsetof(SceneVertex, textureCoords)
      shouldEnable:YES];

   self.baseEffect.texture2d0.name = self.textureInfo0.name;
   self.baseEffect.texture2d0.target = self.textureInfo0.target;
   [self.baseEffect prepareToDraw];

   // Draw triangles using the vertices in the 
   // currently bound vertex buffer
   [self.vertexBuffer drawArrayWithMode:GL_TRIANGLES
      startVertexIndex:0
      numberOfVertices:sizeof(vertices) / sizeof(SceneVertex)];

   self.baseEffect.texture2d0.name = self.textureInfo1.name;
   self.baseEffect.texture2d0.target = self.textureInfo1.target;
   [self.baseEffect prepareToDraw];

   // Draw triangles using currently bound vertex buffer
   [self.vertexBuffer drawArrayWithMode:GL_TRIANGLES
      startVertexIndex:0
      numberOfVertices:sizeof(vertices) / sizeof(SceneVertex)];
 }

对我来说,第二个纹理看起来并不小,只是更暗。 您的笔记本电脑和 iPad 的显示屏很可能具有不同的伽玛值。

校正伽玛的方法有很多,提供了很棒的介绍here http://www.arcsynthesis.org/gltut/Illumination/Tut12%20Monitors%20and%20Gamma.html.

值得注意的是,如今许多现代显卡也可以为您做到这一点,但据我所知,到目前为止 OpenGL ES 还不支持:sRGB 颜色格式 http://www.arcsynthesis.org/gltut/Texturing/Tutorial%2016.html.

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

iOS OpenGL ES - 模拟器和设备上的不同纹理行为 的相关文章

  • 核心蓝牙在后台进行广告和扫描

    我一直在尝试设置一个应用程序 使设备既扫描外围设备又作为外围设备进行广告 目标是当两个设备通过蓝牙发现彼此靠近时在后台被唤醒 从 Apple 文档来看 您似乎应该能够在后台运行 BLE 启用蓝牙中心和蓝牙外设后台模式 并且当一台设备位于前台
  • 如何使用 Unity 在 Android 设备上以各种宽高比显示游戏的相同部分?

    我从 Libgdx 引擎转向 Unity 是一名初级程序员 我尝试在 Unity 中为 Android 和 iOS 设备制作游戏 但在宽高比 分辨率缩放方面遇到问题 在 Libgdx 中 如果您开发了一些东西 您可以指定 默认 分辨率 并且
  • 移动 Safari 中的文件上传和 EXIF

    正如这些问题中所指出的 在某些情况下 iOS 上上传的照片的地理位置和其他 EXIF 元数据会被删除 在 safari 中 https apple stackexchange com questions 326789 gps exif fr
  • CNContact 添加新的联系人问题

    我在通过以下方式添加联系人时遇到问题联系框架 我使用的是装有 iOS 12 1 2 的 iPhone 5s 设备 我添加联系人的代码如下 let saveRequest CNSaveRequest saveRequest add self
  • 使用prefersLargeTitles 和 UITableView 平滑滚动

    我在使用时遇到了滚动问题prefersLargeTitles并添加了UITableView 如果我设置prefersLargeTitles在导航控制器中 其根是UITableViewController一切都很好 导航大标题的滚动方式与我们
  • iOS 上每个选项的带有图像的操作表

    有没有办法在 iOS 上将图像添加到操作表中 与苹果在应用程序商店或苹果音乐应用程序上所做的一样 我对苹果文档的基本搜索表明我没有在操作表中子类化或添加子视图 UIActionSheet 并非设计为子类化 也不应向其层次结构添加视图 苹果文
  • 应用程序图标未刷新

    我更改了新版本应用程序中的图标图像 并且我在设备中安装了旧版本应用程序 然后我安装了新版本 它在 iOS 5 中运行良好 但在 iOS 6 中 图标没有刷新 它仍然显示旧版本图标 徽标 如果没有安装旧版本应用程序 该设备在 iOS 5 和
  • 如何在 RestKit 中为同一类提供两条发布路线

    由于我无法弄清楚如何为同一个类设置两个不同的 POST 资源路径 因此我尝试手动创建 RKObjectLoader 请求 但它似乎不断发送 GET 请求而不是 POST 即使我已将方法设置为邮政 这是我的代码 User user User
  • iOS 解决方案仅当图像尚未使用 SDWebImage 缓存在内存中时才加载带有动画的图像

    我已经为这个问题苦苦挣扎了几天 以前我使用 AFNetworking 类别来加载和缓存图像 但它的回调中没有提供缓存类型 所以我过去常常在每个控制器中跟踪哪些图像已经加载 我浏览了 SDWebImage 它提供了我正在寻找的东西 SDIma
  • 对 UIImage 进行方形裁剪,导致图像拉伸

    当尝试执行 UIImage 的中心裁剪时 我得到以下结果 左侧是原始图像640 1136 右边是适合正方形的裁剪图像UIImageView at 320 320 turns to 我对比率元素进行了相当多的修改 以便它可以正确检测要修剪的量
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • 如何从 NSString 中删除十六进制字符

    我面临一个与字符串中的某些十六进制值相关的问题 我需要从字符串中删除十六进制字符 The problem is when i print object it prints as BLANK line And in debug mode it
  • 为了支持 iPhone 5 的更长屏幕,需要检查什么? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone 5屏幕尺寸如何处理 https stackoverflow com questions 12396545 how to deal with iphone 5 screen size iP
  • 如何将十六进制数组转换为 UIImage?

    有几个与使用 P25mi 动态打印图像相关的未解答问题 没有一个得到公认的答案 下面有几个链接 如何将图像转换为位图代码以便在 iPhone 中进行蓝牙打印 https stackoverflow com questions 1383828
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • 播放(非库)Apple Music 内容 - 请求失败

    我正在尝试使用以下代码播放专辑 let predicate MPMediaPropertyPredicate value 1459938538 forProperty MPMediaItemPropertyAlbumPersistentID
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j
  • 通用类不会将委托调用转发给具体子类

    鉴于以下情况 protocol EntityType var displayString String get extension String EntityType var displayString String return self

随机推荐

  • 在特定情况下,LMDB 是否也可以并发写入?

    MDB NOLOCK 如所述mdb env open http www lmdb tech doc group mdb html ga32a193c6bf4d7d5c5d579e71f22e9340 apidoc MDB NOLOCK 不执
  • 如何避免实现 const 和非常量迭代器的代码重复?

    我正在实现一个具有类似 STL 接口的自定义容器 我必须提供一个常规迭代器和一个常量迭代器 这两个版本的迭代器的大部分代码是相同的 我怎样才能避免这种重复 例如我的容器类是Foo 我正在实施FooIterator and FooConstI
  • 在 NSTableView 的同一单元格中显示图标和文本

    我想在表视图的单个单元格中的文本项旁边显示一个图标 我想要实现的一个示例是 系统偏好设置 gt 用户帐户 gt 登录项 中的应用程序列表 有什么好办法呢 这里有一个很好的例子如何做到这一点 http www cocoadev com ind
  • Data.table 与 cor.test 按组

    当我使用data table要使用 cor test 函数计算每个组的相关性 它适用于默认方法 即 pearson 但不适用于 spearman 我收到一个data table error library data table dd lt
  • C++ VS 错误:提供 std::experimental::filesystem 的 标头已被 Microsoft 弃用并将被删除

    我编码了C on 视觉工作室 Windows 10 并收到此错误 error The
  • Spring事务上下文不持久保存数据

    我知道我的问题是一个常见问题 但是我在这里检查了很多问题 检查了Spring文档 我真的不知道我做错了什么 我的问题 我有一个使用 JPA 的 Spring WebFlow 项目 实现 OpenJPA MySQL 数据库 我使用 Sprin
  • Sails JS 和 Mongodb 唯一属性被忽略

    在 SailsJS 中使用 Mongo 时 我似乎无法获得唯一属性来实际检查 验证唯一值 我很容易就得到了相同的用户名 有什么想法吗 我检查了关于此的另一篇文章 但这与使用磁盘 内存数据库有关 航行 0 10 x 电子邮件受保护 cdn c
  • 如何在 twitter bootstrap css 的网格

    我正在尝试使用 Twitter 的 bootstrap CSS 框架 到目前为止只有网格布局 现在我只想对齐每个网格单元的内容 div 至底部 显然我根本不是 CSS 爱好者 这是 HTML div class container div
  • numpy as_strided 的反函数

    我有一个 4 张量x 6张量y计算如下 x np random randn 64 28 28 1 strided shape 64 26 26 3 3 1 y numpy lib stride tricks as strided x str
  • 如何对 IList 执行二分查找?

    简单的问题 给定一个IList
  • 如何在 django 模板中为标签创建动态 ID

    背景 我有一个动态表 就像我直到运行时才知道它的大小 元素 我试图用 JavaScript 函数填充文本区域 为此 我计划将文本区域的 id 以及我想要填充到 javascript 函数中的值一起传递 问题是我无法为每个文本输入字段创建动态
  • Clojure 中的 OAuth1

    我正在尝试使用 Clojure 与 API Context IO 集成 Context IO 使用 OAuth 1 它需要告知用户密钥和用户秘密凭证才能集成 我过去曾使用请求库 https github com request reques
  • 将 Big GeoJSON 转换为 topoJSON

    I have GeoJSON 文件 https github com jgoodall us maps blob master geojson zcta5 json大约有 1 4GB 并且由于文件大小 命令行工具无法工作 我使用 topoj
  • Jquery Datatable sum 条件页脚回调未显示正确的结果

    我正在尝试计算页脚回调中的列总和 但是 它没有给我正确的结果 USE 的总和应该是 12 但它显示的是 24 RAHUL 也显示错误的结果 如果该值重复 例如 6 是 USE 的两倍 并且 6 也出现在 Card 和 Other 中 在这种
  • 如何有效调试缩小后的JS文件?

    我调试时遇到问题缩小版 JS在生产服务器上 虽然你在测试时无法发现机器上的一些错误dev prod服务器 有机会将用户的一些前端错误和异常发送到特殊日志 当 JS 文件被缩小时 调试这段代码就变成了地狱 执行此类工作的最佳实践是什么 Bit
  • GROUP BY 子句中不允许使用 Sql Server XML 方法

    我只是发出一个组 在其中指定 xml 数据 然后出现错误GROUP BY 子句中不允许使用 XML 方法 这是我的sql SELECT HourSheetID MAX RowID 1 as RowID XMLData value Log E
  • 在 Java 桌面应用程序中使用 Firebase Admin(使用 Eclipse)

    我想在我的 java 应用程序中使用 firebase admin 在网站上它说我可以通过 gradle 或 maven 添加它 但我不想那样做 相反 我从 Maven 中央存储库网站下载了 jar 文件 并将其作为库添加到我的项目中 我添
  • 使用动态类型调用通用扩展方法[重复]

    这个问题在这里已经有答案了 我正在尝试执行一个返回类型 T 的对象的扩展方法 但我正在尝试基于标题 详细信息动态泛型类型使类型 T 动态化 这可能有点冗长 using System using System Collections Gene
  • CXF 和 JAX-WS 之间的区别

    我对网络服务还很陌生 我无法找到 JAX WS 和 CXF 之间的区别 根据我的理解 JAX WS是java提供的规范 CXF是实现 如果我错了 请纠正我 是的你是对的 JAX WS 是基于 SOAP 的 Web 服务的 Java 规范 C
  • iOS OpenGL ES - 模拟器和设备上的不同纹理行为

    我正在使用 OpenGL ES 加载纹理 下面是我的代码 该图形由 2 个相同大小的纹理 停止按钮和后面的蓝色发光组成 下面的第一张图是使用 xCode 中的 iPad 模拟器拍摄的 第二张图是在实际设备上拍摄的 第一个图形是我从 Illu