opengl-es - OpenGL ES 2.0 中的多 channel 着色器

标签 opengl-es opengl-es-2.0 glsl

第一 - 是否 子程序 需要 GLSL 4.0+?所以它在 OpenGL ES 2.0 的 GLSL 版本中不可用?

我很明白什么是多 channel 着色器。
那么我的图片是什么:

  • 使用一些着色器将一组东西(例如 Sprite )绘制到 FBO。
  • 将 FBO 视为大屏幕四边形的大纹理,并使用另一个着色器,例如,将纹理颜色转换为灰度。
  • 用灰度颜色将 FBO 纹理四边形绘制到屏幕上。

  • 还是这叫别的?

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

    例如
    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);
    

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

    最佳答案

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

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

    Does subroutines require GLSL 4.0+? So it unavailable in GLSL version of OpenGL ES 2.0?



    这是一个与您帖子的其余部分完全不同的问题,但答案是肯定的和否定的。

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

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

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

    关于opengl-es - OpenGL ES 2.0 中的多 channel 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12645609/

    相关文章:

    c - arm-linux-gnueabi-gcc 找不到库

    Android OpenGL|ES 2.0 纹理

    c++ - 为什么我的 GLSL 转换没有渲染?

    c++ - OpenGL在不同的VBO中绘制具有不同颜色、顶点位置和顶点颜色的点?

    ios - 绘制由 vImage 计算的直方图

    opengl - 分析图形着色器

    android - 如何在 Android 上使用 OpenCL?

    android - Canvas 上的位图对于任何带有移动对象的游戏来说都是一个坏主意

    iphone - 接到来电时,录制的视频已损坏,并且 AVFoundation 方法出现错误

    android - 混合和 Z 缓冲区在 2 个独立的着色器程序之间共享?