砖块着色器详解(GLSL版本)

最近看红宝书,看到程序式纹理,对书上砖块着色器代码进行了实现,书上省略了一部分函数讲解。在此,我贴出代码即我的理解,希望能帮助到有需要的人。
首先是顶点着色器代码:

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 };
程序执行效果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值