OpenGL Shader-开篇

1,039 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

前言

学习OpenGL离不开Shader开发,比如图片滤镜和特效等花里胡哨的效果都需要具备Shader开发能力。开设OpenGL ES Shader专栏期望对学习OpenGL Shader开发做总结和记录,其中也会涉及到大量数学公式和算法,同时也是对自己数学算法知识的回顾和提升吧。专栏计划大纲目录:

  • 绘画:颜色、形状、图形
  • 效果:随机生成、噪点
  • 图像:纹理、滤镜、内容处理
  • 动画
  • 3D

辅助工具

Shader Toy插件使用

开发Shader之前先学习如何使用Shader Toy插件可以帮助开发者提效。对于Android开发者而言最痛苦莫过于每次调试需要重新编译打包查看效果。有了Shader Toy插件可以实时查看修改后的Shader脚本效果大大提高了开发效率。

简单介绍

  1. 先在VSCode插件库中搜索并安装Shader Toy,顺带可以再下载Shader lanuage语法支持插件可以高亮提醒和代码补齐。 image.png
  2. 新建shader脚本文件编写示例代码,Command + Shift + P调出命令面板选择"Shader Toy: Show GLSL Preview"后可显示GLSL Preview窗口查看脚本最终效果。

image.png

  1. shader脚本也是以void main()开始。同时支持的常用变量只读标识UniformsiResolution,iTimeiTimeDeltaiFrameiMouseiMouseButtoniDateiSampleRateiChannelN等。

简单示例展示

  • 颜色画布 Shader输出结果是gl_FragColor这里定义一个红色的向量值,透明度设置为1.0。

simple.fsh代码如下:

void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

image.png

  • 图片纹理 支持纹理显示定义一个本地图片地址,然后声明一个iChannel1对于本地地址即可。纹理创建使用texturegl_FragCoordiResolution分别代表顶点坐标和纹理像素。

texture.fsh代码如下:

#iChannel1 "/Users/julyyu1/Desktop/opengles_shader/res/i600x800.jpeg"
void main() {
    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    gl_FragColor = texture(iChannel1,uv);
}

image.png