返回

ShaderJoy——用GLSL打造漫画笔触效果

前端

在本文中,您将学习到:

  • 使用ShaderJoy创建自定义着色器
  • 如何使用阈值分割和边缘检测来创建漫画笔触效果
  • 如何使用Photoshop中的图层来微调效果

无论您是平面设计师、插画师还是游戏开发者,本教程都将帮助您掌握使用ShaderJoy创建漫画笔触效果的技巧。

漫画笔触效果背后的算法原理

该效果的核心思路一共分为以下几步【参考 Photoshop 中的图层操作】:

  1. 根据图像的亮度,人为设定阈值,将图像分割成两部分:亮部和暗部。
  2. 使用边缘检测算法,检测图像中的边缘。
  3. 将亮部和暗部分别赋予不同的颜色,并使用边缘作为分界线。
  4. 将两部分融合在一起,即可得到漫画笔触效果。

在ShaderJoy中实现漫画笔触效果

现在,让我们开始在ShaderJoy中实现漫画笔触效果。

  1. 首先,我们需要创建一个新的着色器项目。
  2. 然后,在着色器编辑器中添加以下代码:
// 阈值
uniform float threshold = 0.5;

// 边缘检测核
const vec2 edgeDetectionKernel[9] = {
  vec2(-1, -1), vec2(0, -1), vec2(1, -1),
  vec2(-1, 0), vec2(0, 0), vec2(1, 0),
  vec2(-1, 1), vec2(0, 1), vec2(1, 1)
};

void main() {
  // 获取片段颜色
  vec4 color = texture2D(u_texture, v_texCoord);

  // 亮度
  float brightness = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));

  // 阈值分割
  float mask = step(threshold, brightness);

  // 边缘检测
  vec2 gradient = vec2(0, 0);
  for (int i = 0; i < 9; i++) {
    vec4 sample = texture2D(u_texture, v_texCoord + edgeDetectionKernel[i] * 0.01);
    gradient += sample.rgb - color.rgb;
  }

  // 计算法线
  vec2 normal = normalize(gradient);

  // 计算光照
  vec3 lightDirection = vec3(0.5, 0.5, 1.0);
  float diffuse = dot(normal, lightDirection);
  diffuse = max(diffuse, 0.0);

  // 合并颜色
  color.rgb = mix(vec3(0.0, 0.0, 0.0), color.rgb, mask);
  color.rgb = mix(vec3(1.0, 1.0, 1.0), color.rgb, diffuse);

  // 输出颜色
  gl_FragColor = color;
}
  1. 接下来,我们需要将这张图片拖放到ShaderJoy的编辑器窗口中。
  2. 最后,点击“生成着色器”按钮,即可生成漫画笔触效果的着色器代码。

在Photoshop中微调效果

您还可以使用Photoshop中的图层来微调漫画笔触效果。

  1. 首先,将生成的漫画笔触效果图层与原始图像图层叠加在一起。
  2. 然后,调整漫画笔触效果图层的混合模式和不透明度,以获得满意的效果。

结语

现在,您已经学会了使用ShaderJoy创建漫画笔触效果。通过改变阈值和边缘检测核,您可以创建出各种不同的漫画笔触效果。