天天看點

磚塊着色器詳解(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,);
    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*)>)
    {   //當y在[1-2],[3-4],[5-6]...時函數成功,即我們将這一行的磚塊向縱向移動半個磚塊的寬度
        position.x+=;
    }
    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,);
}
           

相關用戶端傳遞資料代碼如下:

//磚塊着色器

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 };

磚塊着色器詳解(GLSL版本)

繼續閱讀