OpenGL:渲染到具有深度附件的 FBO,同时从相同深度纹理读取,glDepthMask 为假
OpenGL: Render into FBO with depth attachment, while reading from same depth texture, with glDepthMask being false
我知道在从附加到该 FBO 的深度纹理中获取的同时渲染到 FBO 是错误的(至少没有 texture_barrier 扩展)。
但是,如果glDepthMask为false,这样做也是错误的吗?
反馈循环不是错误;他们是未定义的行为。如果是错误,你可以试试看是否失败。
如果您未使用 GL 4.5 或 ARB_texture_barrier(或 NV_texture_barrier)不可用,那么按照您的建议进行操作将产生未定义的行为。
rules for feedback loops before that feature 非常严厉。这些规则只关心附加和绑定的内容。将纹理附加到 FBO 并将其绑定以供着色器访问的简单操作会调用未定义的行为。唯一可以阻止它的状态是使用 mipmap base/max 级别,使着色器无法访问附加到 FBO 的 mipmap 级别。
如果您确实可以访问 GL 4.5/ARB_texture_barrier/NV_texture_barrier,那么它应该可以工作...前提是您在切换到阅读之前使用障碍。新文本清楚地表明它正在读取已写入(通过片段着色器输出)的数据,这就是问题所在,深度掩码可防止写入发生。有了纹理屏障,您就可以将之前写入的数据提供给着色器。
我知道在从附加到该 FBO 的深度纹理中获取的同时渲染到 FBO 是错误的(至少没有 texture_barrier 扩展)。
但是,如果glDepthMask为false,这样做也是错误的吗?
反馈循环不是错误;他们是未定义的行为。如果是错误,你可以试试看是否失败。
如果您未使用 GL 4.5 或 ARB_texture_barrier(或 NV_texture_barrier)不可用,那么按照您的建议进行操作将产生未定义的行为。
rules for feedback loops before that feature 非常严厉。这些规则只关心附加和绑定的内容。将纹理附加到 FBO 并将其绑定以供着色器访问的简单操作会调用未定义的行为。唯一可以阻止它的状态是使用 mipmap base/max 级别,使着色器无法访问附加到 FBO 的 mipmap 级别。
如果您确实可以访问 GL 4.5/ARB_texture_barrier/NV_texture_barrier,那么它应该可以工作...前提是您在切换到阅读之前使用障碍。新文本清楚地表明它正在读取已写入(通过片段着色器输出)的数据,这就是问题所在,深度掩码可防止写入发生。有了纹理屏障,您就可以将之前写入的数据提供给着色器。