首先 - 是否子程序需要 GLSL 4.0+?那么它在 OpenGL ES 2.0 的 GLSL 版本中不可用吗?
I quite了解什么是多通道着色器。
那么我的照片是什么:
- 使用一些着色器将一些东西(例如精灵)绘制到 FBO。
- 将 FBO 视为大屏幕尺寸四边形的大纹理,并使用另一个着色器,例如,将纹理颜色转换为灰度。
- 使用灰度颜色将 FBO 纹理四边形绘制到屏幕上。
或者这叫别的?
那么多通道 = 使用另一个着色器输出到另一个着色器输入?那么我们渲染一个对象两次或更多次?着色器输出如何到达另一个着色器输入?
例如
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);
谁能以基本方式提供简单的例子?
一般来说,术语“多通道渲染”是指使用不同的着色器多次渲染同一对象,并将结果累积在帧缓冲区中。累积通常是通过混合完成的,而不是使用着色器。也就是第二个着色器doesn't取第一个的输出。它们各自执行部分计算,混合阶段将它们组合成最终值。
如今,这主要是为了前向渲染场景中的照明而完成的。您为每个灯光渲染每个对象一次,传递不同的照明参数,并且每次渲染灯光时可能使用不同的着色器。用于累积结果的混合模式是可加的,因为光反射率是可加的属性。
子例程是否需要 GLSL 4.0+?那么它在 OpenGL ES 2.0 的 GLSL 版本中不可用吗?
这是一个与您帖子的其余部分完全不同的问题,但答案是肯定的和否定的。
不,从某种意义上说,ARB_shader_subroutine 是 OpenGL 扩展,因此可以通过任何 OpenGL 实现来实现。是的,从实际意义上讲,任何硬件实际上could实现 Shader_subroutine 还可以实现 GL 4.x 的其余部分,因此已经在宣传 4.x 功能。
实际上,您不会发现非 4.x OpenGL 实现支持 Shader_subroutine。
它在 GLSL ES 2.0 中不可用,因为它是 GLSLES。不要混淆桌面OpenGL与OpenGLES。它们是两个不同的东西,具有不同的 GLSL 版本和不同的功能集。他们甚至不分享扩展(最近的极少数除外)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)