我创建了一个FBO,并有一个纹理绑定作为其颜色附件,我有多个着色器程序,对纹理做一些后处理,一切都很好,但它对我来说没有意义,纹理可以用作输入(sampler2D)以及同时着色器的输出。
以下是我采取的步骤:
fboA
。texture A
,并将其绑定为fboA
的颜色附件。glBindFrameBuffer
将fboA
绑定到帧缓冲区目标。glUseProgram
使用着色器程序shaderA
。glDrawArray
来绘制一些东西(最终在texture A
上绘制,因为fboA
当前绑定)。glUseProgram
使用shader程序shaderB
,它在片段着色器中具有sampler2D
统一。texture A
绑定为sampler2D
着色器程序shaderB
的统一。texture A
用于设置片段颜色
。我感到困惑的是最后两个步骤,其中textureA
被用作片段着色器的输入,但它仍然绑定到当前帧缓冲区。在我看来,碎片着色器正在读取和写入同一块内存,这不是某种未定义的行为吗?为什么它仍然正常工作?
这不是某种未定义的行为吗,为什么它仍然正确工作?
因为“未定义的行为”并不排除该行为看似“正常工作”的可能性。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): 计算着色器: 我已尝试