标签: glkit

GLKit中的纹理映射不仅适用于设备

我使用此链接中的代码来映射人脸的纹理.此代码使用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)

模拟器的图像:

在模拟器中输出

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

设备输出

有什么东西我不见了?

iphone opengl-es objective-c ios glkit

7
推荐指数
1
解决办法
1431
查看次数

调整GLKView的大小

GLKView调整大小,有担当的是,缓冲区和上下文的地方一些幕后的操作GLKView.在执行这些幕后操作所花费的时间内,绘制到GLKView不会产生正确的结果.

在我的场景中,我GLKView已经setNeedsDisplay启用了一个,因此无论何时我需要在屏幕上更新它的内容,我只需要调用-setNeedsDisplayGLKView.我正在使用GLKView绘制图像,所以如果我需要绘制不同大小的图像,我还需要更改图像的大小GLKView.

问题:当我更改GLKView并调用setNeedsDisplay该视图的大小时,屏幕上的结果不正确.这是因为在GLKView尝试绘制新图像之前,没有完成新尺寸更改所调用的幕后操作.

我通过调用找到了解决方法:performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0而不仅仅是setNeedsDisplayGLKView.这基本上迫使主线程在调用之前等待所有幕后的openGL操作完成setNeedsDisplay.虽然这项工作正常,但我想知道是否有更好的解决方案.例如,是否存在openGL调用以使线程等待所有openGL操作在继续之前完成?

opengl-es ios opengl-es-2.0 ios5 glkit

6
推荐指数
1
解决办法
2270
查看次数

使用GLKit进行跨平台开发?

我刚刚安装了当前的Xcode 4版本,并实现了新的"GLKit"API,它也用于iOS的OpenGL模板.所以,我想为iOS,Mac和Windows开发一款跨平台游戏.GLKit在便携性方面似乎倒退了一步,但GLKit功能(特别像异步纹理加载)是很好的好处......

如何使用GLKit开发跨平台游戏?我需要两次写任何grapics代码,对吗?或者是否有类似于Windows的GLKit实现?

任何想法,变通方法,代码设计建议(如何将GLKit代码与其他组件分开?)都是受欢迎的 - 谢谢!

iphone cross-platform opengl-es-2.0 glkit

6
推荐指数
1
解决办法
2758
查看次数

替换iOS中特定颜色的图像

我想用其他用户选择的颜色替换图像的特定颜色.在替换图像颜色时,我想保持原始颜色的渐变效果.例如,请参阅附加的图像. image1.png
image2.png

我试图用CoreGraphics这样做,我成功地取代了颜色.但是替换颜色不能保持图像中原始颜色的渐变效果.

有人可以帮我吗?CoreGraphics是正确的方法吗?提前致谢.

opengl-es core-graphics image-processing ios glkit

6
推荐指数
1
解决办法
1829
查看次数

GLKTextureLoader没有在"新iPad"上加载jpg

我试图在GLKit中从网络创建六个jpg文件的立方体贴图.它在我的iPhone 6+上工作得很好但是当我在"新iPad"上运行相同的代码时,立方体贴图在应用于对象时只是黑色.如果我用png文件尝试相同的东西,它的工作原理.是否有任何特定的东西需要在某些硬件上正确加载jpg?

来自cubeMapWithContentsOfFiles的错误是nil因为它看起来像GLKit认为它正确加载纹理.

这是一个演示项目http://s.swic.name/Yw8F

iphone opengl-es ipad ios glkit

6
推荐指数
1
解决办法
157
查看次数

glkView:drawInRect:和glkViewControllerUpdate之间的区别:?OpenGL ES 2 - iOS

在渲染循环中,这两种方法之间应该有什么区别?

苹果有这个说....

关于update() 视图控制器调用其委托的glkViewControllerUpdate:方法.您的代理人应更新不涉及将结果呈现到屏幕的帧数据.

关于drawInRect: GLKView对象使其OpenGL ES上下文成为当前上下文,并将其framebuffer绑定为OpenGL ES呈现命令的目标.然后,您的委托方法应该绘制视图的内容.

所以基本上,当我在我的视图控制器中创建一个GLKView时,该控制器就变成了一个delate,所以我正在并排查看这些方法.

我假设update()应该包含任何变换或其他逻辑.

3d opengl-es ios glkit

5
推荐指数
1
解决办法
2902
查看次数

IOS:UIScrollView 和 OpenGL

所以我有一个 OpenGL(glView) 视图,它正在渲染一个我打算滚动的菜单。我试图避免重新发明 UIScrollView,因此我在 glView 顶部放置了一个滚动视图。

问题是滚动滚动视图会暂停渲染

此处讨论了类似的问题当 UIScrollView 在 iPhone 上拖动时,OpenGL ES 视图中的动画会冻结

问题是我不知道什么 [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 指的是

我制作了一个新的 CADisplayLink 并尝试在没有运气的情况下执行上述操作

我试过在 scrollViewDidScroll 中调用渲染方法

我试过调用 [self.view setNeedsDisplay];

我还发现了一个指的是调用timerLoop?

谁能帮我一下

iphone opengl-es uiscrollview ios glkit

5
推荐指数
1
解决办法
2157
查看次数

带四元数的Arcball旋转(使用iOS GLKit)

我正在寻找带有四元数的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)

opengl-es quaternions arcball ios glkit

5
推荐指数
1
解决办法
4322
查看次数

如何将此OpenGL指针数学转换为Swift?

我正在学习本教程关于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)

opengl-es ios glkit swift

5
推荐指数
1
解决办法
1501
查看次数

如何使用GLKView的帧缓冲区避免使用逻辑缓冲区存储?

在一个非常简单的应用程序上运行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)

opengl-es ios glkit

5
推荐指数
0
解决办法
327
查看次数