【问题标题】:Distort image to make raindrop on screen effect扭曲图像以在屏幕上产生雨滴效果
【发布时间】:2011-12-21 00:47:41
【问题描述】:

我想让图像看起来像雨滴在屏幕上一样失真。 Image of water droplet effect over check pattern http://db.tt/fQkx9bzh

知道如何使用 OpenGL 或 CoreImage 来做到这一点吗?

如果有帮助的话,我可以得到一张雨滴形状深度的图像。否则,我真的不知道该怎么做,特别是因为它们不是完美的圆形,而且我几乎没有使用 OpenGL 或 Core Image 的经验(尽管我可以设置缓冲区和其他东西并做一些简单的绘图)。

【问题讨论】:

  • 我可以尝试通过掩盖更大版本的背景来伪造它,但我认为这看起来不太好。
  • 不,简单地放大背景是完全错误的。对于光线追踪包来说,这可能是一个简单的练习。我可能会拼凑一些可以大致模拟它的东西,但它不会在你的技术选择范围内。
  • “它不会出现在您选择的技术中”是什么意思?你能用另一种语言来做吗?
  • 我的意思是我无法在 OpenGL 或 Core Image 中提供答案。它将在 Python 中,所以我不确定它对您有多大用处,或者是否可以使用这些包的功能提供更简单的解决方案。
  • This is the link to the flash demo 以防您仍然感兴趣。

标签: ios opengl-es core-image


【解决方案1】:

我将使用水滴的高程(即与表面的距离)作为Bulge effect 的控制纹理。使用水滴的重心作为效果的中心点。

【讨论】:

  • 关于重心的定位:en.wikipedia.org/wiki/Locating_the_center_of_mass 一个控制纹理就像一个参数一样使用。也就是说,您对控制纹理进行采样以获得每个像素的参数值。在这种情况下,您可以使用它来传达凸出效果的强度映射。
  • 谢谢,我想我现在得到了控制纹理。关于中心的问题是,我知道重心是什么,但就是不知道如何移动中心以获得凸起效果。我能看到的唯一方法是在应用效果之前移动纹理,然后将其移回。当然,这是错误的做法。这是我目前拥有的简单代码:
  • ` vec2 texCoord = gl_TexCoord[0].xy; vec2 normCoord = 2.0 * texCoord - 1.0;浮动 r = 长度(标准坐标); r = r * 平滑步长(-0.1, 0.5, r);浮动 phi = atan(normCoord.y, normCoord.x); normCoord.x = r * cos(phi); normCoord.y = r * sin(phi); texCoord = normCoord / 2.0 + 0.5; gl_FragColor = texture2D(tex, texCoord); `
  • 这里有一个使用控制纹理的置换示例:vvvv.org/contribution/displacement-map 基本上,您对控制纹理的采样方式与“图像”纹理非常相似。但是,您使用不同的值。简单地说,您应该提供一个深度图作为控制纹理。 PS:如果他们有帮助,您可以投票给 cmets。
  • 天啊,我用顶点着色器完美地工作了!!我以前从未看过opengl(而且对编程完全陌生),所以我非常高兴! :) 非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2018-03-03
相关资源
最近更新 更多