我使用此链接中的代码来映射人脸的纹理.此代码使用GLKIT渲染图像.代码在模拟器中工作正常,但如果我在设备中运行它无法正常工作,则代码相同.以下是图像的屏幕截图,它在设备中工作,而不是在我的ipad中.
我用来加载纹理的代码:
- (void)loadTexture:(UIImage *)textureImage
{
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
CGImageRef cgImage = textureImage.CGImage;
float imageWidth = CGImageGetWidth(cgImage);
float imageHeight = CGImageGetHeight(cgImage);
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA,
GL_UNSIGNED_BYTE, CFDataGetBytePtr(data));
}
Run Code Online (Sandbox Code Playgroud)
模拟器的图像:

设备中的相同代码提供以下输出:

有什么东西我不见了?
当GLKView调整大小,有担当的是,缓冲区和上下文的地方一些幕后的操作GLKView.在执行这些幕后操作所花费的时间内,绘制到GLKView不会产生正确的结果.
在我的场景中,我GLKView已经setNeedsDisplay启用了一个,因此无论何时我需要在屏幕上更新它的内容,我只需要调用-setNeedsDisplay它
GLKView.我正在使用GLKView绘制图像,所以如果我需要绘制不同大小的图像,我还需要更改图像的大小GLKView.
问题:当我更改GLKView并调用setNeedsDisplay该视图的大小时,屏幕上的结果不正确.这是因为在GLKView尝试绘制新图像之前,没有完成新尺寸更改所调用的幕后操作.
我通过调用找到了解决方法:performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0而不仅仅是setNeedsDisplay在GLKView.这基本上迫使主线程在调用之前等待所有幕后的openGL操作完成setNeedsDisplay.虽然这项工作正常,但我想知道是否有更好的解决方案.例如,是否存在openGL调用以使线程等待所有openGL操作在继续之前完成?
我刚刚安装了当前的Xcode 4版本,并实现了新的"GLKit"API,它也用于iOS的OpenGL模板.所以,我想为iOS,Mac和Windows开发一款跨平台游戏.GLKit在便携性方面似乎倒退了一步,但GLKit功能(特别像异步纹理加载)是很好的好处......
如何使用GLKit开发跨平台游戏?我需要两次写任何grapics代码,对吗?或者是否有类似于Windows的GLKit实现?
任何想法,变通方法,代码设计建议(如何将GLKit代码与其他组件分开?)都是受欢迎的 - 谢谢!
我试图在GLKit中从网络创建六个jpg文件的立方体贴图.它在我的iPhone 6+上工作得很好但是当我在"新iPad"上运行相同的代码时,立方体贴图在应用于对象时只是黑色.如果我用png文件尝试相同的东西,它的工作原理.是否有任何特定的东西需要在某些硬件上正确加载jpg?
来自cubeMapWithContentsOfFiles的错误是nil因为它看起来像GLKit认为它正确加载纹理.
这是一个演示项目http://s.swic.name/Yw8F
在渲染循环中,这两种方法之间应该有什么区别?
苹果有这个说....
关于update() 视图控制器调用其委托的glkViewControllerUpdate:方法.您的代理人应更新不涉及将结果呈现到屏幕的帧数据.
关于drawInRect: GLKView对象使其OpenGL ES上下文成为当前上下文,并将其framebuffer绑定为OpenGL ES呈现命令的目标.然后,您的委托方法应该绘制视图的内容.
所以基本上,当我在我的视图控制器中创建一个GLKView时,该控制器就变成了一个delate,所以我正在并排查看这些方法.
我假设update()应该包含任何变换或其他逻辑.
所以我有一个 OpenGL(glView) 视图,它正在渲染一个我打算滚动的菜单。我试图避免重新发明 UIScrollView,因此我在 glView 顶部放置了一个滚动视图。
问题是滚动滚动视图会暂停渲染
此处讨论了类似的问题当 UIScrollView 在 iPhone 上拖动时,OpenGL ES 视图中的动画会冻结
问题是我不知道什么 [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 指的是
我制作了一个新的 CADisplayLink 并尝试在没有运气的情况下执行上述操作
我试过在 scrollViewDidScroll 中调用渲染方法
我试过调用 [self.view setNeedsDisplay];
我还发现了一个指的是调用timerLoop?
谁能帮我一下
我正在寻找带有四元数的3D模型上的弧形旋转的简单实现,特别是在iOS上使用GLKit.到目前为止,我已经检查了以下来源:
我也一直试图从这里和这里了解源代码和数学.我可以旋转我的物体,但它在某些角度不停跳跃,所以我担心万向节锁在起作用.我正在使用手势识别器来控制旋转(平移手势会影响滚动和偏航,旋转手势会影响音高).我将附加我的代码用于四元数处理以及模型视图矩阵转换.
变量:
GLKQuaternion rotationE;四元数处理:
- (void)rotateWithXY:(float)x and:(float)y
{
const float rate = M_PI/360.0f;
GLKVector3 up = GLKVector3Make(0.0f, 1.0f, 0.0f);
GLKVector3 right = GLKVector3Make(1.0f, 0.0f, 0.0f);
up = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), up);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(x*rate, up));
right = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), right);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(y*rate, right));
}
- (void)rotateWithZ:(float)z
{
GLKVector3 front = GLKVector3Make(0.0f, 0.0f, -1.0f);
front = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), front);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(z, front));
}
Run Code Online (Sandbox Code Playgroud)
模型视图矩阵变换(内部绘制循环):
// Get Quaternion Rotation …Run Code Online (Sandbox Code Playgroud) 我正在学习本教程关于iOS的OpenGL/GLKit的,但试图在Swift中实现它.在我到达这个部分之前一切正常:
- (void)render {
// 1
self.effect.texture2d0.name = self.textureInfo.name;
self.effect.texture2d0.enabled = YES;
// 2
[self.effect prepareToDraw];
// 3
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
//---------------- This is where things break down...
long offset = (long)&_quad;
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex)));
// 5
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
@end
Run Code Online (Sandbox Code Playgroud)
我有一个房产 self.quad像这样的Swift结构:
struct TexturedVertex {
let geometryVertex: CGPoint
let textureVertex: CGPoint
}
struct TexturedQuad {
let bottomLeft: …Run Code Online (Sandbox Code Playgroud) 在一个非常简单的应用程序上运行Xcode的OpenGL ES诊断,该应用程序切换到第二个帧缓冲区并返回(适当使用glClear和glInvalidateFramebuffer),在切换到第二个帧缓冲区时显示有关逻辑缓冲区存储的警告:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// At this point, GLKView's framebuffer is bound
// Clear (to avoid logical buffer load)
glClear(GL_COLOR_BUFFER_BIT);
// Invalidate (to avoid logical buffer store)
glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 });
// Switch to our own framebuffer, and attach a texture as the color attachment
// At this point, Xcode's OpenGL ES tool warns:
// "For best performance keep logical buffer store operations to a minimum."
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture, 0);
// Clear (to …Run Code Online (Sandbox Code Playgroud) glkit ×10
ios ×9
opengl-es ×9
iphone ×4
3d ×1
arcball ×1
ios5 ×1
ipad ×1
objective-c ×1
quaternions ×1
swift ×1
uiscrollview ×1