OpenGL混合模式与着色器混合

pol*_*ick 10 opengl shader fragment-shader

我目前正在对OpenGL和着色器进行一些研究,但我似乎无法弄清楚glBlendMode在着色器中使用混合模式或在着色器中编写自己的混合模式之间是否存在任何根本差异.

选择前者或后者的原因是什么?通过选择一个而不是另一个会有任何性能瓶颈吗?或者这仅仅是个人偏好的问题?

Tim*_*Tim 13

无法在着色器中复制与glBlendFunc的传统混合.混合需要在修改目标帧缓冲区之前对其进行采样,这不是可以在当前硬件上完成的.

目前,您只能传递一种颜色,并选择一种有限的混合模式选择(glBlendFunc/glBlendEquation),这些模式将在写入帧缓冲区之前由GPU的光栅化器应用.

  • 这是否意味着着色器不能混合两个纹理并对它们应用混合模式并输出 1 个新纹理?如果人们在网上发布 Photoshop 混合模式着色器,我觉得这有点奇怪。你能详细说明一下吗?谢谢! (2认同)

小智 6

当着色器在同时渲染到相同纹理的同时从纹理中读取时,结果是未定义的.这就是为什么"传统"或固定功能与glBlendFunc和glBlendEquation混合有用的原因.

要使用传统混合混合两个图像,您可以渲染第一个图像,设置混合模式,函数和方程,并渲染第二个图像.这可以保证给出正确的结果,并且通常是实现透明效果的最快方法.

要使用着色器实现相同的效果,您需要将第一个图像渲染为辅助纹理,更改着色器,并将第二个图像渲染到实际的帧缓冲区,将混合作为片段着色器中的最后一步.由于纹理读取的额外开销,这通常较慢,并且肯定会为辅助纹理使用更多GPU内存.

在现代硬件上,两种技术之间的差异往往很小.