是否有可能使用OpenGL着色器获得这种“色度偏移”效果

时间:2011-11-23 04:05:15

标签: opengl bitmap shader

我希望能够产生这种效果,特别是颜色爬行/颜色变换。

color shift

OpenGL着色器是否可行,或者我是否需要使用其他技术?

我是OpenGL的新手,我想尝试将其作为入门练习,但如果有更好的方法,最终我想产生这种效果。

仅供参考我使用Cinder作为我的OpenGL框架。

我知道这不是太多的信息,但是我甚至无法找到真正调用的效果,所以我不能谷歌。

3 个答案:

答案 0 :(得分:4)

我无法帮助你了解效果的名称,但我有一个想法来产生这种效果。我的理解是每个颜色分量都会移动一些量。对各个颜色分量左侧的简单转换产生了黑白原始图像:

black and white image

获取所需图像的步骤

  1. 在纹理中获取源黑白图像。如果是其他渲染的结果,请将其复制到纹理。
  2. 使用从(0,0)到(1,1)的纹理坐标并附加纹理,渲染全屏四边形(或所需尺寸)。
  3. 应用片段着色器,该片段着色器对输入纹理进行3次采样,并在纹理坐标中进行不同的移位。例如-2个纹素,0个纹素和+2个纹素偏移。如果您愿意,可以使用不同的偏移量,并且可以尝试更多样本。
  4. 通过仅保留每种样品的1种颜色成分来组合这3种样品。
  5. 如果性能无关紧要或着色器不可用,则交替显示

    不要使用像素着色器,而是使用与ADD功能混合的OpenGL。渲染3次相同的全屏四边形并附加纹理,并使用纹理矩阵每次偏移查找。为每次传递掩盖输出颜色掩码的方式不同,得到相同的结果:传递1 =>红色,通过2 =>绿色,通过3 =>蓝色。

答案 1 :(得分:4)

您正在寻找的效果称为色彩偏差,您可以查看维基百科。你已经得到了一个解决方案,但我认为我的职责是作为一名物理学家,让你更深入地了解正在发生的事情,以及如何将这种效果推广。

请记住,每个相机都有一些光圈,光线通常被描述为波浪。波与孔径的相互作用称为衍射,但当它以数学方式下降时,它只是波函数的卷积,具有孔径函数的傅里叶变换。衍射取决于波长,因此根据颜色产生空间偏移。产生的另一个影响是色散,即对波长折射的依赖性。再次衍射可以通过卷积来描述。

现在可以将卷积链接起来,产生一个完整的卷积内核。在高斯模糊滤波器的情况下,卷积核是在所有通道中相同的高斯分布。但是,您可以为每个目标通道使用不同的卷积内核。 @bernie暗示的实际上是盒式卷积内核,在每个通道中移动了几个像素。

这是一个很好的关于使用GLSL进行卷积滤波的教程。您也可以使用 for loops 而不是展开循环。 http://www.ozone3d.net/tutorials/image_filtering_p2.php

我建议你使用一些高斯形状的内核,红色和蓝色的模糊比绿色强,当然稍微偏移中心点。

答案 2 :(得分:2)

GeexLab有一个色差的演示,其着色库here中有源。

相关问题