OpenGL ES 2.0中的多遍着色器

时间:2012-09-28 18:42:39

标签: opengl-es opengl-es-2.0 glsl

首先 - 子程序是否需要GLSL 4.0+?那么它在OpenGL ES 2.0的GLSL版本中不可用吗?

完全了解多遍着色器是什么 那么我的照片是什么:

  1. 使用某个着色器将一组内容(例如精灵)绘制到FBO。
  2. 将FBO视为大屏幕四边形的大纹理,并使用另一个着色器,例如,将纹理颜色转换为灰度。
  3. 使用灰度颜色将FBO纹理四边形绘制到屏幕上。
  4. 或者这叫别的吗?

    所以multi-pass =使用另一个着色器输出到另一个着色器输入?所以我们渲染一个对象两次或更多?着色器输出如何获得另一个着色器输入?

    例如

    glUseProgram(shader_prog_1);//Just plain sprite draw
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, /*some texture_id*/);
     //Setting input for shader_prog_1
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    //Disabling arrays, buffers
    glUseProgram(shader_prog_1);//Uses same vertex, but different fragment shader program
    //Setting input for shader_prog_2
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    

    任何人都可以用基本的方式提供这方面的简单例子吗?

1 个答案:

答案 0 :(得分:10)

通常,术语“多次渲染”是指使用不同着色器多次渲染同一对象,并将结果累积到帧缓冲区中。积累通常通过混合完成,而不是使用着色器。也就是说,第二个着色器获取第一个着色器的输出。它们各自执行部分计算,混合阶段将它们组合成最终值。

如今,这主要是针对前向渲染场景中的照明。您为每个灯光渲染一次每个对象,传递不同的光照参数,并且每次渲染灯光时可能使用不同的着色器。用于累积结果的混合模式是附加的,因为光反射是一种附加属性。

  

子程序是否需要GLSL 4.0+?那么它在OpenGL ES 2.0的GLSL版本中不可用吗?

这是与你的其他帖子完全不同的问题,但答案是肯定的,不是。

不,从某种意义上说,ARB_shader_subroutine是一个OpenGL扩展,因此可以通过任何OpenGL实现来实现。是的,实际上,实际上可以实现shader_subroutine的任何硬件也可以实现GL 4.x的其余部分,因此已经宣传了4.x功能。

实际上,你不会发现非4.x OpenGL实现支持shader_subroutine。

它在GLSL ES 2.0中不可用,因为它是GLSL ES 。不要将桌面OpenGL 与OpenGL ES 混淆。它们是两个不同的东西,具有不同的GLSL版本和不同的功能集。他们甚至不共享扩展(除了极少数的扩展名)。