【问题标题】:Fragment shaders: output variables片段着色器:输出变量
【发布时间】:2019-09-04 23:19:50
【问题描述】:

阅读 GLSL 1.40 规范:

片段输出只能是浮点数, 浮点向量,有符号或 无符号整数或整数向量, 或任何这些数组。矩阵和 无法输出结构。分段 输出被声明为 以下示例:

out vec4 FragmentColor; out uint Luminosity;

片段颜色定义为 gl_FragColor... 是吗?有人可以清除我对这些输出的想法吗?我可以只写示例的“FragmentColor”来确定片段颜色吗?我可以复读它们吗(例如“Luminosity”)?

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    在 GLSL 版本 120 之后,不推荐使用全局输出变量 gl_FragColor。 现在你必须自己给它一个名字和类型,就像你的例子一样。 关于几个输出, 此链接为您提供有关映射的信息:http://www.opengl.org/wiki/GLSL_Objects#Program_linking

    (我发现该链接位于:http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270999

    希望这会有所帮助! :D

    哎呀!我看到 kvark 给出了相关信息。无论如何,也许你也从我的文字中得到了一些东西。

    【讨论】:

      【解决方案2】:

      您的示例有 2 个输出。在 GLSL 程序链接之后,它们具有关联的相应 FBO 插槽。您可以使用glBindFragDataLocation 重定向它们。

      一旦您激活了着色器并绑定了 FBO,这一切都取决于由glDrawBuffers 设置的绘制蒙版。例如,如果您在那里传递了GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT2,这意味着输出索引0 将转到附件0,而输出索引1 将转到颜色附件2。

      【讨论】:

        【解决方案3】:

        我想举几个例子:

        void add(in float a, in float b, out float c)
        {
            //you can not use c here. only set value
            //changing values of a and b does not change anything.
            c = a + b;
        }
        
        void getColor(out float r, out float g, out float b)
        {
           //you can not use r, g, b here. only set value
           r = gl_FragColor.r;
           g = gl_FragColor.g;
           b = gl_FragColor.b;
        }
        
        void amplify(inout vec4 pixelColor, in value)
        {
           //inout is like a reference
           pixelColor = pixelColor * value;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-10
          • 2013-07-30
          • 2021-04-27
          • 2017-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多