【发布时间】:2017-11-06 10:28:12
【问题描述】:
我正在学习 WebGL,是在 WebGLFundamentals 页面的帮助下完成的,它帮助我理解了缓冲区、着色器和所有这些东西的工作原理。 但现在我想达到我在这里看到的某种效果:https://tympanus.net/Tutorials/HeatDistortionEffect/index3.html 我知道如何制作热变形效果,我想要达到的效果是图像上的 DEPTH。这个演示有一个教程,但它并没有真正解释如何去做,它说我必须有一个灰度图,其中白色部分是最接近的,黑色部分是最远的。但我真的无法理解它是如何工作的,这是我的着色器代码:
var vertexShaderText = [
"attribute vec2 a_position;",
"attribute vec2 a_texCoord;",
"uniform vec2 u_resolution;",
"varying vec2 v_texCoord;",
"void main() {",
" vec2 zeroToOne = a_position / u_resolution;",
" vec2 zeroToTwo = zeroToOne * 2.0;",
" vec2 clipSpace = zeroToTwo - 1.0;",
" gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);",
" v_texCoord = a_texCoord;",
"}"
].join("\n")
var fragShaderText = [
"precision mediump float;",
"uniform sampler2D u_image;",
"uniform sampler2D u_depthMap;",
"uniform vec2 mouse;",
"varying vec2 v_texCoord;",
"void main() {",
" float frequency=100.0;",
" float amplitude=0.010;",
" float distortion=sin(v_texCoord.y*frequency)*amplitude;",
" float map=texture2D(u_depthMap,v_texCoord).r;",
" vec4 color=texture2D(u_image,vec2(v_texCoord.x+distortion*map, v_texCoord.y));",
" gl_FragColor = color;",
"}"
].join("\n")
我想要的是当我移动鼠标时,图像会响应着色器扭曲,就像我在上面显示的链接中一样。但我真的不知道如何在 javascript 部分做到这一点。 谢谢
【问题讨论】:
-
这种效果看起来不像图像的深度,它看起来更像是模糊。基本上采用blur similar to this,但或多或少地应用于某些部分。或者你想达到不同的效果?
-
感谢您的回复,不,我正在尝试实现类似于我发布的链接中的深度效果,我发布的片段着色器会产生热变形,但我需要通过鼠标坐标到着色器并加载深度图以获得效果。但我真的不知道该怎么做......
-
您指向的链接没有做任何与深度相关的事情。您可以使用 WebGL Inspector 或许多其他实用程序来查看着色器。它所做的只是在unblurred image 和pre-blurred image 之间混合。它使用一些波纹计算和 distortion map 来决定如何混合模糊图像与非模糊图像以及如何偏移像素。
标签: javascript image webgl effect depth