如何在GLSL顶点着色器中实现Thin Plate Spline算法?

问题描述 投票:-1回答:1

我想制作一个GLSL着色器,以使用TPS算法使图像/纹理变形。我该如何为此编写GLSL顶点着色器?

algorithm glsl vertex-shader
1个回答
0
投票

答案是,我需要制作一个顶点着色器,而不是片段着色器。

我需要的是使用GLSL实际变形图像,看来本文描述了如何做到这一点:https://testdrive-archive.azurewebsites.net/Graphics/Warp/Default.html

attribute vec2 aPosition;
varying vec2 vTexCoord;
#define MAXPOINTS 9
uniform vec2 p1[MAXPOINTS]; // where the reference points
uniform vec2 p2[MAXPOINTS]; // where the warp points
void main() {
  vTexCoord = aPosition;
  vec2 position = aPosition * 2.0 - 1.0; // convert 0 - 1 range to -1 to +1 range
  for (int i = 0; i < MAXPOINTS; i++)
  {
      float dragdistance = distance(p1[i], p2[i]);
      float mydistance = distance(p1[i], position);

      if (mydistance < dragdistance)
      {
          vec2 maxdistort = (p2[i] - p1[i]) / 4.0;

          float normalizeddistance = mydistance / dragdistance;

          float normalizedimpact = (cos(normalizeddistance*3.14159265359)+1.0)/2.0;

          position += (maxdistort * normalizedimpact);
      }
  }      
  //gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);
  gl_Position = vec4(position, 0.0, 1.0);
}
© www.soinside.com 2019 - 2024. All rights reserved.