最近看红宝书,看到程序式纹理,对书上砖块着色器代码进行了实现,书上省略了一部分函数讲解。在此,我贴出代码即我的理解,希望能帮助到有需要的人。
首先是顶点着色器代码:
attribute vec3 pos;
uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
varying vec2 MCPosition;//砖块的坐标
void main()
{
gl_Position=P*V*M*vec4(pos,1.0);
MCPosition=pos.xy;
}
然后是片元着色器代码
uniform vec3 BrickColor,MortalColor;//砖块的颜色,砖块的灰的颜色
uniform vec2 BrickSize;//砖块中灰的长宽
uniform vec2 BrickPct;//砖块中的除开灰的长宽
varying vec2 MCPosition;//砖块的坐标
void main()
{
vec2 position=MCPosition/BrickSize;
if(fract(position.y*0.5)>0.5)
{ //当y在[1-2],[3-4],[5-6]...时函数成功,即我们将这一行的砖块向纵向移动半个砖块的宽度
position.x+=0.5;
}
position=fract(position);//将当前的砖块的坐标转变成[0-1]之间
vec2 userbrick=step(position,BrickPct);//在BrickPct范围内,返回值是1表明该处应该绘制砖块
vec3 color=mix(MortalColor,BrickColor,userbrick.x*userbrick.y);//当userBirck.x*userbrick.y=1时,表明该处要绘制砖块的颜色,而不是灰的颜色,否则为灰的颜色
gl_FragColor=vec4(color,1.0);
}
相关客户端传递数据代码如下:
//砖块着色器
float brickColor[] = {1.0,0.3,0.2};
float mortalColor[] = { 0.85,0.86,0.84 };
float brickSize[] = { 0.30,0.15 };
float brickPct[] = { 0.90,0.85 };