从零开始学习GPU编程,掌握实时图形学的核心技能
4种简单的方法来实验本教程中的代码
本教程基于 Introduction to shaders: Learn the basics! (The Coding Train) 制作。
建议配合视频学习,效果更佳!
无需安装任何软件,打开浏览器即可开始编写着色器!
Shadertoy使用uniform变量名略有不同(如iTime代替u_time)
复制以下代码到 The Book of Shaders Editor 中立即查看效果:
本教程展示的GLSL代码是基于 GLSL ES(OpenGL着色语言嵌入式版本),这是WebGL和移动设备使用的标准。
gl_FragCoord:当前像素坐标gl_FragColor:输出颜色(老版本GLSL)u_time:运行时间(秒)u_resolution:画布分辨率u_mouse:鼠标位置理解GPU编程的基础概念
着色器是运行在GPU(图形处理单元)而非CPU上的代码。
着色器最常见的两种类型:
性能优势:
着色器语言的核心概念
GLSL是强类型语言,必须声明变量类型。
向量分量可以用多种方式访问:
提取和重排向量分量:
属性、统一变量和varying变量
理解着色器中的数值范围
着色器中的许多值都是归一化的,即范围在 0 到 1之间。
使用位置信息创建颜色渐变
使用x坐标创建水平渐变:
同时使用x和y坐标:
在两个值之间线性插值:
常用数学函数详解
返回数的小数部分,用于创建重复图案。
创建波浪效果,注意需要重新映射到0-1范围。
类似于if语句,但更适合GPU并行处理。
在着色器中使用纹理
// 声明纹理统一变量
uniform sampler2D background;
void main() {
vec2 pos = vTexCoord; // 获取纹理坐标
// 读取纹理颜色(翻转Y轴)
vec2 newTexCoord = vec2(pos.x, 1.0 - pos.y);
vec4 color = texture2D(background, newTexCoord);
// 输出颜色
gl_FragColor = color;
}
绘制形状的高级技术
SDF(Signed Distance Function)返回点到形状表面的距离:
// 圆的SDF
vec3 circle = vec3(0.5, 0.5, 0.3);
// 计算到中心的距离
float dist = length(pos.xy - circle.xy);
// 减去半径,得到SDF
float sdf = dist - circle.z;
// 使用step函数创建锐利的圆
float circleShape = step(0.0, sdf);
gl_FragColor = vec4(circleShape);