). 到目前为止,我在针对 #version -6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:24:57 26 4
gpt4 key购买 nike

一些背景:

我正在寻找一种简单的方法来在"new"GLSL(假设#version 150 core)上运行“旧”着色器(假设#version 120) >).

到目前为止,我在针对 #version 150 时向我的片段着色器添加了以下 header :

#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] 将不被使用,即不是由着色器写入,并且缺少用于接收值的帧缓冲区附件。我担心这些未使用元素的存在是否会使我的着色器格式错误(或产生任何不良效果或开销)。

GLSL 1.50 规范表示有一个隐式定义的已弃用的 out vec4 gl_FragData[gl_MaxDrawBuffers];,因此大概我正在做的事情很好并且不会产生任何开销。
但我也知道内置 gl_FragData 在某些方面是“神奇的”,并且类似的用户提供的声明可能会产生不同的效果。

TL;博士:

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

有点太宽泛了,但是:这些未使用的索引的存在是否会对常见实现产生任何不良影响或开销?

最佳答案

If my fragment shader output is an array, am I allowed to not write to some of the elements at the end of the array, given that the values of those elements are discarded (not received by any framebuffer attachment point)?

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

由于您使用#version 150,我指的是GLSL 1.50 spec 。第 4.3.6 节“输出”指出(强调我的):

Output variables must be declared at global scope. During shader execution they will behave as normal unqualified global variables. Their values are copied out to the subsequent pipeline stage on shader exit.

如果您声明一个变量但从未对其进行写入,您将获得未定义的,但不会出现未定义的行为。这也得到 OpenGL 3.2 core profile specification 的支持。 ,第 3.9 节“片段着色器”,“着色器输出”小节

Any colors, or color components, associated with a fragment that are not written by the fragment shader are undefined.

GL 规范的更现代版本,例如OpenGL 4.6 core profile ,对于这一点更加清楚(第 17.4 节“整个帧缓冲区操作”):

If a fragment shader writes to a user-defined output variable, DrawBuffers specifies a set of draw buffers into which each of the multiple output colors defined by these variables are separately written. If a fragment shader writes to no user-defined output variables, the values of the fragment colors following shader execution are undefined, and may differ for each fragment color. If some, but not all user-defined output variables are written, the values of fragment colors corresponding to unwritten variables are similarly undefined.

GLSL 1.50 规范继续如下:

Only output variables that are read by the subsequent pipeline stage need to be written; it is allowed to have superfluous declarations of output variables.

不写入不会被使用的输出变量是完全可以的。

你的第二个问题有点棘手:

Does the presence of those unused indices have any undersirable effects or overhead on common implementations?

GL 规范从未做出任何此类保证。我只能说两点:

  1. 我从来没有注意到有一些额外的未使用的 FS 输出有任何负面影响(但我也没有经常这样做)。我也不希望在这种情况下合理的实现会带来明显的开销。
  2. 如果您确实需要确定,则必须对您关心的实际实现进行基准测试/分析。

关于opengl - 可以在片段着色器中声明一个超大的输出数组并保留一些未使用的索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52173024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com