好了,vertex shader已经在上面大致讲完了,接下来就是fragment shader~
varying vec2 v_vTexcoor;
varying vec4 v_vColour;
一开始就是熟悉的v_vColour、v_vTexcoord变量声明,代表它们已经从顶点插值传过来了~!fragment shader很简单,main函数就这么一句:
void main()
{
gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoor );
}
texture2D是纹理映射函数,就是根据纹理坐标作为参照点,绘制纹理中的哪一部分。函数的两个参数分别是 需要绘制的纹理 和 纹理坐标,返回vec4就是对应的颜色值。一张Texture的纹理坐标,y轴是向下的,左上角是(0, 0),右下角是(1.0, 1.0)。具体用这图感受一下:

但要注意,这里的texture是gm_BaseTexture,gms会把所有的sprite和background都打包进一张或多张大的texture里做成图集(atlas)来提高绘制效率。当你导入官方的shader范例并编译,gm_BaseTexture实际会是这样的:

也就是一个object的sprite之间的顶点可能是(0.976, 0.012) (0.979, 0.015)这样差值小且很奇怪的数,不过vertex shader的in_TextureCoord已经帮你处理好了,插值后的v_vTexcoor能正确显示。texture2D返回的颜色值乘以插值后的顶点颜色v_vColour,是texture颜色值偏向该顶点颜色绘制,最后赋值给gl_FragColor决定该像素最后的颜色。
至此,gms的整个默认shader已经大致讲完了,主要偏向原理的= =
如果有更新或许会讲官方的范例