在Android Open GL

时间:2017-03-28 08:25:51

标签: android opengl-es-2.0

我有两个不同的片段着色器:

  1. 第一次静态
  2. 第二个取决于更改每个onDrawFrame事件的值
  3. 如何使用这两种着色器?我需要先改变图像而不是第二个结果?

    我尝试将所有代码放在一个着色器中,但它运行缓慢

1 个答案:

答案 0 :(得分:0)

如果您可以将2个着色器加入单个着色器,那么这通常是最快的方式。当您有许多片段重绘时,它会发生较慢的情况。例如,正常3D场景可以具有例如每个像素平均5次重绘,这意味着片段着色器将被调用5次然后最佳。在这种情况下,将此着色器保持为尽可能基本并使用后期处理是有意义的。

在您的情况下,如果您添加了一些着色器代码并解释您正在做什么,这可能会有所帮助。但是看看你的问题,你正在寻找的是具有附加纹理的FBO(帧缓冲对象)。

要实现此目的,您需要创建一个新的帧缓冲区(glGenFramebuffers)并绑定它。然后,您需要使用glTexImage2D数据创建一个新的空纹理NULL。使用glFramebufferTexture2D将2与颜色连接在一起。成功完成此操作后,其余代码应该或多或少相同,结果是您现在直接绘制到纹理而不是主缓冲区。

需要注意的一些事项:除非启用,否则纹理大小必须为POT。请记住设置适当的视口。

所以现在你有2个帧缓冲区,FBO和你的主要。您收到了FBO的ID,而我认为主缓冲区的ID应为0。所以现在你需要绑定你的FBO并用第一个着色器绘制它。完成后,您需要绑定主帧缓冲区并使用第二个着色器将纹理从FBO重绘到主缓冲区。

重绘到主缓冲区只是意味着你需要绘制一个填充整个屏幕的2d纹理矩形。使用来自FBO的纹理。