我正在学习WebGL,并在WebGLFundamentals页面上得到了很大的帮助,这有助于我更好地理解缓冲区、着色器和所有相关内容。但现在我想实现一个特定的效果,就像我在这里看到的https://tympanus.net/Tutorials/HeatDistortionEffect/index3.html。
我知道如何制作热扭曲效果,我想要实现的效果是图像的深度。这个演示有一个教程,但它并没有真正解释如何做到这一点,它说我必须有一个灰度地图,其中白色部分离镜头最近,黑色部分离镜头最远。但我真的无法理解它是如何工作的。这是我的着色器代码:
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部分实现它。
谢谢。