Tag: glkit

使用GLKit和OpenGL-ES,如何绘制两个三angular形,一个纹理,另一个坚实

我是OpenGL-ES的新手,已经开始通过Buck的学习OpenGL ES for iOS书籍工作。 第2章介绍用纯色绘制三angular形,第3章继续使用纹理。 作为个人学习练习,我试图改变示例代码来绘制两个三angular形; 一个是质地,另一个是固体。 看起来像一个非常基本的练习,但作为一个OpenGL-ES初学者 – 是一个棘手的问题。 到目前为止,我已经尝试了一些组合。 首先,我准备绘制GLKVertexAttribPosition ,然后GLKVertexAttribTexCoord0 。 然后我用三angular形1绘制我的顶点缓冲区。 接下来,我尝试了几件事情,包括: glDisableVertexAttribArray(GLKVertexAttribTexCoord0); 和 GLuint name = self.textureInfo0.name; glDeleteTextures(1, &name); 然后再绘制颜色属性: [self.vertexBuffer prepareToDrawWithAttrib:GLKVertexAttribColor numberOfCoordinates:3 attribOffset:offsetof(SceneVertex, colours) shouldEnable:YES]; 在屏幕截图中可以看到,左下angular的三angular形具有与顶点颜色属性混合的纹理。 正方形 – 使广场 – 是完全黑色的。 请注意, prepareToDrawWithAttrib方法调用是Buck的实用程序类,主要调用glVertexAttribPointer方法。 需要注意的是我在这里使用GLKit ,所以没有着色器或任何东西。 这是截图: 任何想法非常赞赏。

GLKit掩盖或混合两个来自jpeg无纹理的纹理

我正在使用GLKit,并在24 fps我需要采取一个CGImageRef(没有alpha层),并应用另一个CGImageRef(无alpha层)作为它的掩码(黑白图像),并呈现为一个GLKit纹理的结果。 起初我尝试了这种方法: CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask(imgRef, actualMask); 而且,虽然将分配产生的UIImage到一个UIImageView工作,这不会作为一个GLKit纹理(该掩码将不会被应用)。 但是,如果我使用以下方法重新绘制图像: UIImage *maskedImg = [UIImage imageWithCGImage:masked]; UIGraphicsBeginImageContext(maskedImg.size); [maskedImg drawInRect:CGRectMake(0, 0, maskedImg.size.width, maskedImg.size.height)]; UIImage* resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 生成的图像将在GLKit纹理中被遮罩并正确渲染。 但是,这将iPhone 4S的性能降低到6 fps左右。 我尝试过这种掩蔽方法,但没有成功。 我已经试过没有Core Graphics和使用GLKit混合,如Ray Wenderlich在这个例子中所示。 但是,这需要面具上的alpha透明度,这对我来说是一个难题。 我还发现了一个有趣的例子,我正在做一个名为AVAnimator的库和一个名为KittyBoom的例子。 这里他们正在手动replace像素。 我想用GLKit得到相同的结果。 任何进一步的方向或指导将在这里有所帮助。 提前致谢。

以固定的时间间隔为单个图像加载两个纹理 – GLkit openglES

我使用下面的代码来加载对象的纹理。 – (void)ldText:(UIImage *)Image { 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 = Image.CGImage; float Width = CGImageGetWidth(cgImage); float Height = CGImageGetHeight(cgImage); CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage)); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, CFDataGetBytePtr(data)); } 纹理得到正确映射。 我现在需要加载两个纹理。 纹理应该定期更换。 可能吗? 有人可以指导我如何从这里出发? * 更新:我用Image2加载了另一个纹理,函数ldText2。 并在每个“更新视图”中进行更新。 现在我在同一个对象上得到两个纹理,每当调用“update”函数的时候就会发生变化。 每次调用“更新”function时,我都会交换纹理1和纹理2。 但问题是时间间隔! 我希望它发生缓慢。 如何为此设置一个时间间隔? *

iOS:GLKitmatrix乘法被打破,据我所知

这是源代码。 ANSWER是正确答案, RESULT是实际结果。 我是失明的,还是计算入门33的-1时,它应该是1 ? 代码如下: GLKMatrix4 a = GLKMatrix4Make(-1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000); GLKMatrix4 b = GLKMatrix4Make(1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, -1.000000, 0.000000, 0.000000, 1.000000, -1.000000, 0.000000, 0.000000, 0.000000, 1.000000); GLKMatrix4 ANSWER = GLKMatrix4Make(-1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, -1.000000, […]

iPhone开发:是否有可能扩展多个viewControllers?

在我的应用程序中,我想使用googleAnalytics。 要使用它,我必须扩展GAITrackedViewController,但问题是我已经扩展了GLKViewController,因为我的视图有一个openGL应用程序。 那么是否有可能扩展两个视图控制器的属性?

OpenGL ES 2.0绘制Fullscreen Quad非常慢

当我将内容渲染到具有绑定纹理的FBO上,然后使用基本着色器将该绑定纹理渲染为全屏四边形时,性能会下降得可笑。 例如: 直接渲染(使用基本着色器): 当渲染纹理第一,然后渲染纹理与全屏四:(具有相同的基本着色器,将通常像模糊或开花): 任何人有一个想法如何加快这一点? 由于目前的performance是不可用的。 另外,我正在使用GLKit的基本OpenGL的东西。

在GLKViewController中使用glTexImage2D的EXC_BAD_ACCESS

我在这段代码的最后一行有一个EXC_BAD_ACCESS (这段代码每秒被触发几次),但我不知道是什么问题: [EAGLContext setCurrentContext:_context]; glActiveTexture(GL_TEXTURE0); glPixelStorei(GL_PACK_ALIGNMENT, 1); glBindTexture(GL_TEXTURE_2D, _backgroundTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _outputFrame.cols, _outputFrame.rows, 0, GL_BGRA, GL_UNSIGNED_BYTE, _outputFrame.data); 当debugging时,我确定纹理被创build(id是> 0),输出帧有一个指向数据的有效指针,是一个4通道matrix。 我在GLKViewController的drawRect方法中。 我想我不应该绑定帧缓冲器,因为它是这里自动化的东西之一。 它在第一帧没有崩溃,但在几十帧之后。 有人可以发现问题吗? 更新: 看起来是因为_outputFrame上的竞争条件,它正在被glTexImage2D读取的同时被更新。 我会尝试locking它的阅读,然后报告。

GCD和for循环

我想知道使用for循环和使用GCD的dispatch_apply函数有什么区别,在文档中也找不到答案,也没有在这里的问题。 另外,在运行时使用GCD函数作为GLKit的渲染/更新方法会产生更好的结果吗?

无法在CADisplayLink渲染循环中绑定EAGLDrawable

我使用CADisplayLink渲染循环callback来渲染一系列openGL的图像纹理。 在CADisplayLink的第一个callback调用后,我只是得到这些错误输出 Failed to bind EAGLDrawable: <CAEAGLLayer: 0x946bb40> to GL_RENDERBUFFER 2 Failed to make complete framebuffer object 8cd6 我设置了renderBuffer&frameBuffer并在控制器的viewDidLoad阶段中调用glFramebufferRenderbuffer,glCheckFramebufferStatus的返回在该阶段没有问题。 这是我正在使用的代码。 //GLKViewController.m typedef struct { GLKVector3 positionCoords; GLKVector2 textureCoords; }SceneVertex; static const SceneVertex vertices[] = { {{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f}}, // lower left corner {{ 1.0f, -1.0f, 0.0f}, {1.0f, 0.0f}}, // lower right corner {{-1.0f, […]

GLKBaseEffect prepareToDraw泄漏

似乎每个人都认为这是坏的,你需要摆脱GLKBaseEffect来阻止它泄漏。 但没有人提到你要replace它。 有人能指出我正确的方向吗? 一些示例代码或教程将非常有用! 我正在做非常基本的东西,只是画2D精灵。 除了所有的泄漏之外,工作很好 我只需要知道prepareToDraw正在做什么,并用一些有效的代码replace它。 我发现的所有教程似乎都专注于3D渲染。 我可以使用OpenGL ES1而不是2吗? //—Sprite drawing code ———————- effect.transform.modelviewMatrix = viewMatrix; effect.texture2d0.name = textureInfo.name; effect.texture2d0.envMode = GLKTextureEnvModeReplace; // LEAK Here [effect prepareToDraw]; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, textureVerts); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableVertexAttribArray(GLKVertexAttribPosition); glDisableVertexAttribArray(GLKVertexAttribTexCoord0); glDisable(GL_BLEND);