- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 openGL 的新手,我一直在尝试使用我目前正在阅读的一本关于 iphone 游戏编程的书中的一些示例代码。其中一个示例是 3d 游戏,我能够在 iOS 模拟器(全屏)上成功编译和运行它。
我遇到的问题是,当我在实际硬件(ipod touch 4G)上运行它时,游戏不会全屏显示(它只占据屏幕的 1/4)。我能够将问题缩小到以下代码:
GLint backingWidth, backingHeight;
- (BOOL) bindLayer
{
....
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
....
}
出于某种原因,在上述调用之后,backingWidth 和 backingHeight 分别设置为 640 和 960(我预计它是 320 x 480,这是 iphone 的屏幕尺寸)。在 iOS 模拟器和较旧的 ipod touch (2g) 上,它工作得很好。
上面的代码是 UIView 的子类对象的一部分,并覆盖了 drawRect 方法(尽管它是空的)。让我感到困惑的是,当我删除 drawRect 方法(因此没有覆盖它)时,它以某种方式解决了我上面描述的问题。
任何人都可以阐明这一点吗?在 openGL 中绘图时覆盖 View 的 drawRect 方法不安全吗?为什么它可以在模拟器和较旧的 ipod touch 上运行?
最佳答案
您看到的伪像是由于配备 Retina 显示屏的较新设备上的点和像素差异造成的。正如我在回答中描述的那样 here , UIKit 使用点来调整大小,这些点在旧设备上与像素有 1:1 的映射,但现在在当前的 Retina 显示屏上有 1:2 的映射。
OpenGL ES 相反,使用像素进行测量,这就是为什么您在查询其背景大小时看到返回 640x960 的原因。这是应该用于 OpenGL ES 场景视口(viewport)的大小。
我猜想在您尝试运行的代码中某处将 OpenGL ES 场景的视口(viewport)设置为以 View 或图层的点为单位的大小,而不是以像素为单位的适当大小。这导致它缩小到只有四分之一的 View ,就像我在上面的链接答案中发生的情况一样。查找 glViewPort()
和相关调用,并确保它们使用的是背景宽度和高度,而不是 View 或层的宽度和高度。
-drawRect:
应该与此无关,除非某处有设置视口(viewport)大小的代码。
关于iphone - iOS/openGL ES - 覆盖 drawRect 似乎会使 openGL 函数 "glGetRenderbufferParameterivOES"行为异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960458/
在 settings.py LANGUAGE_CODE = 'es-mx'或 LANGUAGE_CODE = 'es-ar'不起作用,但是 LANGUAGE_CODE = 'es'或 LANGUAGE
我想知道OpenGL ES 2.0和OpenGL ES 3.0之间有什么区别。 OpenGL ES 3.0的主要优点是什么? 最佳答案 总体而言,这些变化通过更大的缓冲区、更多的格式、更多的统一等提高
这是我为此端点使用 Postman localhost:9201/response_v2_862875ee3a88a6d09c95bdbda029ce2b/_search 的请求正文 { "_sour
OpenGL ES 2.0 没有 ES 1.0 那样的 GL_POINT_SMOOTH 定义。这意味着我用来绘制圆圈的代码不再有效: glEnable(GL_POINT_SMOOTH); glPoin
我尝试编译这个着色器: varying vec2 TexCoords; varying vec4 color; uniform sampler2D text; uniform vec3 textCol
我是 OpenGL ES 的新手,我使用的是 OpenGL ES 2.0 版本。我可以在片段着色器中使用按位操作(右移、左移)吗? 最佳答案 OpenGL ES 2.0 没有按位运算符。 ES 3.0
有没有办法只用线画一个三角形? 我认为GL_TRIANGLES选项可使三角形充满颜色。 最佳答案 使用glPolygonMode(face, model)设置填充模式: glPolygonMode(G
我想用一个包含 yuv 数据的采样器在 opengl es 着色器中将 yuv 转换为 rgb。我的代码如下: 1)我将 yuv 数据发送到纹理: GLES20.glTexImage2D(GLES20
我正在使用这样的域: http://www.domain.com/es/blabla.html 我想更改 .es 的/es 部分并将 URLS 转换为类似以下内容: http://www.domain
有谁知道OpenGL ES是否支持GL_TEXTURE_RECTANGLE?我计划将它用于 2D 图形以支持非二次幂图像。我当前的实现使用 alpha=0 填充的 POT 纹理,对于拉伸(stretc
我需要在具有 PowerVR SGX 硬件的 ARM 设备上实现离屏纹理渲染。 一切都完成了(使用了像素缓冲区和 OpenGL ES 2.0 API)。唯一 Unresolved 问题是速度很慢glR
这是一个奇怪的事情。我有一个片段着色器,据我所知只能返回黑色或红色,但它将像素渲染为白色。如果我删除一根特定的线,它会返回我期望的颜色。它适用于 WebGL,但不适用于 Raspberry Pi 上的
我正在考虑将一些 OpenGL 代码移植到 OpenGL ES 并且想知道这段代码到底做了什么: glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 因为 g
我正在考虑将一些 OpenGL 代码移植到 OpenGL ES 并且想知道这段代码到底做了什么: glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) 因为 g
GLSL ES最多可以编译多少个程序?所以假设我创建了 100 个片段着色器,每个都有不同的效果。所以在运行时我编译所有这些并动态地我用 glUseProgram 交换它们。我假设每次我编译一个新的
我正在尝试使用顶点缓冲区对象来绘制圆,并在 iPhone 上的 OpenGL ES 2.0 中启用 GL_POINT_SMOOTH 来绘制点。 我使用以下 ES 1.0 渲染代码在 iPhone 4
为什么在 OpenGL ES 1.x 中缩放(均匀)对象会导致对象变轻? 更有意义的是它会更暗,因为法线被缩小是否也会使对象更暗?但由于某种原因,物体变轻了。当我放大时,对象变得更暗。在我看来,这应该
我正在尝试通过移植 some code 在 iOS 上的 OpenGL ES 2.0 中获得一些阴影效果。来自标准 GL。部分示例涉及将深度缓冲区复制到纹理: glBindTexture(GL_TEX
所以我正在使用 2D 骨骼动画系统。 有 X 个骨骼,每个骨骼至少有 1 个部分(一个四边形,两个三角形)。平均而言,我可能有 20 块骨头和 30 个部分。大多数骨骼都依赖于父骨骼,骨骼会每帧移动。
我在使用 ES 着色器时遇到了一些晦涩难懂的问题,而且我现在几乎没有想法了。 这是一些代码: .. precision mediump float; .. #define STEP (1f/6f) 5
我是一名优秀的程序员,十分优秀!