【问题标题】:Do Everyplay supports multiple render pass? (ios)Everyplay 是否支持多个渲染通道? (IOS)
【发布时间】:2013-10-08 07:52:01
【问题描述】:

我一直在使用everyplay SDK 来录制我的项目的游戏玩法(ios-opengles 2.0)。它运作良好。但如果我使用 RenderToTexture(用于阴影)它只会记录空白屏幕。我该如何克服这个问题?

对于阴影,我需要有多个渲染通道来移动 rendertarget 。还有其他方法吗?

【问题讨论】:

  • 是的,应该可以。我在我的 Unity 3d 项目中使用了阴影,并且录制效果很好。可能与您的帧缓冲区有关。您应该确保仅为您在 createframebuffer 中定义的帧缓冲区调用 afterPresentRenderbuffer。

标签: ios opengl-es opengl-es-2.0 everyplay


【解决方案1】:

试试这样:

while(1) { 
    renderShadow();

    glBindFramebuffer(GL_FRAMEBUFFER, fbo1);

    [everyplayCapture afterPresentRenderbuffer:fbo1];

    glClearColor(0.45f, 0.45f, 0.45f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ....
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    ...

    [everyplayCapture beforePresentRenderbuffer:fbo1];

    [(EAGLView *)self.view presentFramebuffer];
}

【讨论】:

  • +1 此过程完全解决了问题。感谢您的指导。
【解决方案2】:

是的,我确定我正在为我在 createframebuffer 中定义的帧缓冲区调用 afterPresentRenderbuffer。因为多次渲染通道需要为单个通道绑定 2 个或更多帧缓冲区。

考虑到 fbo1(framebuffer object) 用于everyplay,fb02 用于阴影,然后是每帧没有阴影的执行顺序

while(1){ 
    glClearColor(0.45f, 0.45f, 0.45f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ....
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    ...
    [(EAGLView *)self.view presentFramebuffer];
 }

以下代码顺序用于渲染阴影

while(1) { 

    glClearColor(0.45f, 0.45f, 0.45f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    renderShadow();
    glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
    ....
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    ...
    [(EAGLView *)self.view presentFramebuffer];
 }

 renderShadow(){
     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
     ....
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     ....

 }

当我用两个 FBo 移动 glBindframebuffer 时,屏幕变为空白,everyplay 记录空白屏幕。 如果我删除 Everyplay 的集成,上面的阴影代码效果很好。 在 Everyplay 为 ios “EveryplayRecord.xcodeproject” 提供的示例项目中,如果我包含该行

glBindFramebuffer(GL_FRAMEBUFFER, defaultFrameBuffer); // in drawRect() method it also renders blank screen.

【讨论】:

  • 如果在 glBindFramebuffer(GL_FRAMEBUFFER, fbo1); 之后移动 [everyplayCapture beforePresentRenderbuffer:fbo1] 会怎样?在你的影子代码示例中?
  • 感谢您的回复。您的建议进行了更改,但并未完全解决问题。放置后 glBindFramebuffer(GL_FRAMEBUFFER, fbo1);在 [everyplayCapture beforePresentRenderbuffer:fbo1] 行旁边,我的游戏在录制时渲染良好,但在单击“PlayLastRecorded”后什么也不显示。我认为它接近解决方案。

  • 请尝试以下答案。 afterPresentRenderBuffer 和 beforePresentRenderbuffer 的正确放置至关重要,在某些情况下,您可能需要使用 Everyplay FAQ 中提到的 setActiveFramebufferCallback。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多