代码之家  ›  专栏  ›  技术社区  ›  HolyBlackCat

在片段着色器中声明一个过大的输出数组并保留一些未使用的索引可以吗?

  •  3
  • HolyBlackCat  · 技术社区  · 6 年前

    一些背景:

    #version 120 )在“新”GLSL上(比如 #version 150 core

    #version 150 :

    #version 150 core
    #define texture2D texture
    out vec4 _gl_FragData[gl_MaxDrawBuffers];
    #define gl_FragData _gl_Fragdata
    #define gl_FragColor gl_Fragdata[0]
    

    问题:

    我有点担心这句话:

    // In a fragment shader
    out vec4 _gl_FragData[gl_MaxDrawBuffers];
    

    _gl_FragData[1 ... gl_MaxDrawBuffers-1]

    glsl1.50规范说有一个隐式定义的 out vec4 gl_FragData[gl_MaxDrawBuffers]; ,所以 大概吧 我所做的一切都很好,不需要额外费用。
    gl_FragData

    TL;DR:

    (未被任何帧缓冲区连接点接收) ?

    这些未使用的索引的存在是否会对常见的实现产生任何不受欢迎的影响或开销?

    1 回复  |  直到 6 年前
        1
  •  3
  •   derhass    6 年前

    如果我的片段着色器输出是一个数组,是否允许我不写入数组末尾的某些元素,因为这些元素的值被丢弃(任何帧缓冲区连接点都没有接收到)?

    您总是可以不写入任何输出变量,无论它们是否被使用。

    既然你用了 #version 150 ,我指的是 GLSL 1.50 spec

    输出 非限定全局变量。 它们的值在着色器退出时复制到后续管道阶段。

    价值 . OpenGL 3.2 core profile specification ,第3.9节“片段着色器”,小节“着色器输出”

    与片段关联的任何颜色或颜色组件,而不是由片段编写的 着色器未定义。

    OpenGL 4.6 core profile ,更清楚这一点(第17.4节“整个帧缓冲区操作”):

    如果片段着色器写入用户定义的输出变量, DrawBuffers 指定一组绘制缓冲区,其中定义了每个输出颜色 如果片段着色器写入“否” 执行未定义,每个片段颜色可能不同。如果有的话,但不是 所有用户定义的输出变量都被写入,片段颜色的值相应

    GLSL 1.50规格还包括:

    只需写入后续管道阶段读取的输出变量; 它被允许

    不写那些无论如何都不会被使用的输出变量是非常好的。

    这些未使用的索引的存在是否会对常见的实现产生任何不受欢迎的影响或开销?

    德国劳埃德船级社从未做出任何此类保证。我只能说两件事:

    1. 如果你真的需要确定的话,你必须对你关心的实际实现进行基准测试/评测。