《OGL dev》Etay Meiri Tutorial 09 - Interpolation 笔记
光栅器会对三角形的三个顶点之间进行插值。
fragment shader访问三角形内的每一个像素(插值的结果),预期返回一个像素。
光栅器将fragment shader输出的像素,经过额外的测试(如深度测试)之后,放到color buffer中用于显示。
如果vertex shader输出一个变量,
- 这个变量在fragment shader中被显式请求了,那么这个变量也会被插值。
- 如果fragment shader没有请求,shader链接时会丢弃vertex shader中只影响这个变量的操作。
三角形法线和纹理坐标经常依赖这个插值。
- 顶点法线通常是以包含这个顶点的所有三角形的三角形法线的平均值计算的。如果一个对象不平滑,则很可能三角形三个顶点的顶点法线都不相同。这种情况下依赖插值计算每个像素的法线。
- 每个顶点对应一个纹理坐标,为了使纹理覆盖三角形,需要为每一个像素进行采样,指定正确的纹理坐标。这些纹理坐标就是插值的结果。
通常不会从vertex buffer提供颜色,而是提供纹理坐标,采样颜色来自纹理。光照计算再处理这个颜色。
out vec4 Color;
,在vertex shader中声明一个全局变量。vec4表示4 float。颜色的四个分量依次是RGBA,区间[0.0, 1.0]。任何包含负值的颜色,都会被渲染为黑色。
Color = vec4(clamp(Position, 0.0, 1.0), 1.0);
,clamp()是内置,保证值在[0.0, 1.0]区间内。
in vec4 Color;
,在fragment shader中接收一个vertex shader输出的变量的插值。