【问题标题】:How to create a core graphics texture on a background thread that can be use for open GL如何在后台线程上创建可用于 open GL 的核心图形纹理
【发布时间】:2014-05-15 08:13:05
【问题描述】:

我已经搜索了一个多星期,寻找这个问题的答案,没有结果。

有没有办法在cocos2d的后台线程上制作一个核心图形纹理,然后返回一个纹理(CCTexture2D)。

我试图在后台线程上渲染它,但我只得到一个黑色纹理(CCTexture2D)作为返回。

这是渲染关卡创建的代码

1.我新建一个NSThread

 -(void)loadLevelByString:(NSString*)level objects:(NSArray*)o{

        [NSThread detachNewThreadSelector:@selector(loadingLevelThread:) toTarget:self withObject:[NSArray arrayWithObjects:level,o, nil]];    

    }

2.线程调用loadingLevelThread方法加载关卡数据。

-(void)loadingLevelThread:(NSArray*)objects{

    //This line allocs the level class
    id object = [[[NSClassFromString(@"LevelLoader") alloc] initWithLevel:[objects objectAtIndex:0] objects:[objects objectAtIndex:1]] autorelease];

    if([object respondsToSelector:@selector(loadLevel)]){
        id loadedLevel = [object performSelector:@selector(loadLevel)];

        [self performSelectorOnMainThread:@selector(replaceSceneWithNew:) withObject:loadedLevel waitUntilDone:YES];

    }

}

我在loadedLevel 调用中创建了纹理(上图)。 我创建这样的纹理

1.首先我用核心图形制作了一个CGContext,并绘制了我喜欢的纹理。 这行得通。

2.然后我用上面创建的上下文图像初始化 CCTexture2D 类

CCTexture2D *texture = [[CCTexture2D alloc] initWithCGImage:contextImage.CGImage resolutionType:kCCTexture2DPixelFormat_RGBA8888];

3.比我将 CCTexture 也保存为全局共享处理程序

[[runing_session_data sharedSession] setText:texture];

4. 创建纹理时,我会创建用于绘制纹理的 CCSprite(shape)。 创建此 CCSprite(shape) 后,我将其添加到舞台并用我刚刚加载的场景替换 cocos2d 场景。

5.在主线程上,我使用 CCSprite(shape) -(void)draw 方法来渲染打开的 GL 内容。 在这里,我还从全局共享处理程序中获取纹理并绑定到打开的 GL 上下文。

这就是draw方法代码的样子。

CC_NODE_DRAW_SETUP();

//Here I get the texture that I created on the background thread and binds it to the GL_TEXTURE_2D
ccGLBindTexture2D( [[runing_session_data sharedSession] getTexture].name);
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords | kCCVertexAttribFlag_Color);

glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0 , bC);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, bCC);

glDrawArrays(GL_TRIANGLES, beginReadVertsAt, endReadVertsAt);

当输出出现时,draw 方法可以正常工作。但这一切都是黑色的。质地已经 以某种方式删除。

如果有人可以回答,那会很有帮助,

谢谢。

【问题讨论】:

  • 您确实需要提供更多信息,例如您的实际代码,但请确保将其减少到绝对必要

标签: ios multithreading opengl cocos2d-iphone


【解决方案1】:

您将需要多个 OpenGL 上下文,每个线程一个(单个 OpenGL 上下文可能仅在单个线程中处于活动状态并由单个线程使用),并启用共享。我不确定这在移动 GPU / iOS 上是否可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多