在 Android openGL 中使用多个着色器
Use multiply shaders in Android open GL
我有两个不同的片段着色器:
- 第一个静态
- 其次取决于每个 onDrawFrame 事件改变的值
如何使用这两个着色器?我需要先更改图像,然后再更改结果?
我尝试将所有代码放在一个着色器中,但它运行缓慢
如果您可以将 2 个着色器合并为一个着色器,那么这通常是最快的方法。当您有很多片段重绘时,会发生速度较慢的情况。例如,一个普通的 3D 场景可能每个像素平均重绘 5 次,这意味着片段着色器将比最佳调用多 5 次。在这种情况下,保持此着色器尽可能基本并使用 post 处理是有意义的。
在您的情况下,如果您添加了一些着色器代码并解释了您正在做什么,这可能会有所帮助。但是看看你的问题,你正在寻找的似乎是带有附加纹理的 FBO(帧缓冲区对象)。
为此,您需要创建一个新的帧缓冲区 (glGenFramebuffers
) 并绑定它。然后你需要用 NULL
数据创建一个新的空纹理 glTexImage2D
。使用 glFramebufferTexture2D
将 2 与颜色连接在一起。成功执行此操作后,其余代码应该或多或少相同,结果是您现在直接绘制到纹理而不是主缓冲区。
一些注意事项:除非启用,否则您的纹理大小必须是 POT。记得设置合适的视口。
所以现在你有 2 个帧缓冲区,FBO 和你的主缓冲区。您收到了 FBO 的 ID,而我认为主缓冲区的 ID 应该是 0
。所以现在你需要绑定你的 FBO 并用第一个着色器绘制它。完成后,您需要绑定主帧缓冲区并使用第二个着色器将纹理从 FBO 重绘到主缓冲区。
重绘到主缓冲区仅意味着您需要绘制一个填满整个屏幕的二维纹理矩形。使用来自 FBO 的纹理。
我有两个不同的片段着色器:
- 第一个静态
- 其次取决于每个 onDrawFrame 事件改变的值
如何使用这两个着色器?我需要先更改图像,然后再更改结果?
我尝试将所有代码放在一个着色器中,但它运行缓慢
如果您可以将 2 个着色器合并为一个着色器,那么这通常是最快的方法。当您有很多片段重绘时,会发生速度较慢的情况。例如,一个普通的 3D 场景可能每个像素平均重绘 5 次,这意味着片段着色器将比最佳调用多 5 次。在这种情况下,保持此着色器尽可能基本并使用 post 处理是有意义的。
在您的情况下,如果您添加了一些着色器代码并解释了您正在做什么,这可能会有所帮助。但是看看你的问题,你正在寻找的似乎是带有附加纹理的 FBO(帧缓冲区对象)。
为此,您需要创建一个新的帧缓冲区 (glGenFramebuffers
) 并绑定它。然后你需要用 NULL
数据创建一个新的空纹理 glTexImage2D
。使用 glFramebufferTexture2D
将 2 与颜色连接在一起。成功执行此操作后,其余代码应该或多或少相同,结果是您现在直接绘制到纹理而不是主缓冲区。
一些注意事项:除非启用,否则您的纹理大小必须是 POT。记得设置合适的视口。
所以现在你有 2 个帧缓冲区,FBO 和你的主缓冲区。您收到了 FBO 的 ID,而我认为主缓冲区的 ID 应该是 0
。所以现在你需要绑定你的 FBO 并用第一个着色器绘制它。完成后,您需要绑定主帧缓冲区并使用第二个着色器将纹理从 FBO 重绘到主缓冲区。
重绘到主缓冲区仅意味着您需要绘制一个填满整个屏幕的二维纹理矩形。使用来自 FBO 的纹理。