当前位置: 首页 > 知识库问答 >
问题:

纹理用作FBO颜色附件,同时用作着色器程序的2D采样器

闾丘成礼
2023-03-14

我创建了一个FBO,并有一个纹理绑定作为其颜色附件,我有多个着色器程序,对纹理做一些后处理,一切都很好,但它对我来说没有意义,纹理可以用作输入(sampler2D)以及同时着色器的输出。

以下是我采取的步骤:

  1. 创建一个FBOfboA
  2. 创建一个纹理texture A,并将其绑定为fboA的颜色附件。
  3. 调用glBindFrameBufferfboA绑定到帧缓冲区目标。
  4. 调用glUseProgram使用着色器程序shaderA
  5. 调用glDrawArray来绘制一些东西(最终在texture A上绘制,因为fboA当前绑定)。
  6. 调用glUseProgram使用shader程序shaderB,它在片段着色器中具有sampler2D统一。
  7. texture A绑定为sampler2D着色器程序shaderB的统一。
  8. 在片段着色器中,texture A用于设置片段颜色

我感到困惑的是最后两个步骤,其中textureA被用作片段着色器的输入,但它仍然绑定到当前帧缓冲区。在我看来,碎片着色器正在读取和写入同一块内存,这不是某种未定义的行为吗?为什么它仍然正常工作?

共有1个答案

扈俊健
2023-03-14

这不是某种未定义的行为吗,为什么它仍然正确工作?

因为“未定义的行为”并不排除该行为看似“正常工作”的可能性。UB意味着任何事情都可能发生,包括你真正想要发生的事情。

当然,它明天可能会突然停止“工作”。或者当你把你的代码放到另一个GPU上。或者如果你开始渲染更多的东西。或者如果你在电脑上呼吸非常困难。

未定义的行为是未定义的。

如果您想使其定义明确,那么您需要使用纹理屏障功能并遵守其规则:屏障之间的每个片段不超过一个读取/修改/写入,或者只是读取和写入不重叠的片段集。

 类似资料:
  • 我需要一个着色程序,然后我需要一个着色程序。一旦我从我的着色器中获得和后,是否可以将它们作为采样器发送到着色器中,以便在屏幕上渲染到四元体上? 我需要将颜色附件发送到第二个着色器的原因是,我正在不同的监视器上渲染和将出现在一个屏幕上,而将出现在另一个屏幕上。。。 我正在做测试视力的心理实验。我的第一个着色器处理我的原始纹理集,但由于两个输出纹理所需的大部分处理是相同的,所以如果不需要,我基本上不想

  • 我想在FBO中加载两个纹理,其中一个纹理包含HDR图像,我的第一个目标是将图像从第一个纹理“复制”到第二个纹理(该纹理为空),并称为“下采样纹理”。 所以我创建FBO,加载我想用颜色_附件_0书写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,其中包含我要在GL\u texture\u 0中读取的纹理。 然后我解开FBO并绑定“DownSamplingTex”,然后画一个四元组。 我不

  • 主要的cpp 附言 输入布局(顶点属性)工作正常。TexIndex已正确传输。1.0f和0.0f 但问题是 //片段着色器 两者都返回相同的纹理颜色,但它实际上与test1的纹理不同。png和test2。巴布亚新几内亚。我的代码有什么问题? 我试着跟随@rabbi76的答案 已应用颜色,但仍从同一纹理采样。看起来有点像glActiveTexture(i);没用。 ps.test1。png和test

  • 应该是这样的: 而不是这个: 我的屏幕宽度是1000,高度是600。 我正在使用OpenGL(lwjgl)在java中制作2d游戏。我可以画一个三角形,但使用我的着色器时它不起作用。着色器编译没有错误,但屏幕变黑了。 我完全不知道该怎么做,我必须启用什么吗? 这是我在GLSL中的vertexShader代码 这是片段着色器: 我最近发现,如果我只运行它有效的片段着色器,我就会得到指定的颜色。但是如

  • 标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方

  • 我一直在尝试渲染到一个FBO,并将两个FBO渲染到屏幕上,但在合并两个FBO时进行深度测试失败。我尝试使用计算着色器合并纹理,但无法读取深度纹理的值(所有值都是值1,但渲染到FBO时深度测试有效)。有人知道我做错了什么,或者知道其他方法来合并两个FBO吗? 以下是我创建FBO的方式: 以下是我向FBO渲染的方式: 我尝试用glBindTexture绑定纹理(所有值均为1): 计算着色器: 我已尝试