GLSL学习笔记 - 6.3 Fragment Shader

程序判断片断是处于砖块位置还是水泥位置,然后分别进行着色。

程序流程
None.gif 使用内置函数说明:
  vec2 floor (vec2 x):               Returns a value equal to the nearest integer that
                                     is less than or equal to x.

  vec2 fract (vec2 x):               Returns x – floor (x).

  vec2 step (vec2 edge, vec2 x):     Returns 0 if x <= edge; otherwise, it returns 1.0.

  vec3 mix (vec3 x, vec3 y, vec3 a): Returns x * (1.0 – a) + y * a, i.e., the linear
                                     blend of x and y using the floating-point value a.
                                     The value for a is not restricted to the range [0,1].None.gif

None.gif得到当前片断在整个砖块图案中的位置。(单位长度1 
=  一个砖块的尺寸)
None.gifposition 
=  MCposition  /  BrickSize;
None.gif
None.gif每隔一行,偏移半个砖块宽度。产生交错感。
None.gif
if  (fract(position.y  *   0.5 >   0.5 )
None.gif    position.x 
+=   0.5 ;
None.gif
None.gif得到当前片断在砖块图的一个图元中的相对位置。
None.gifposition 
=  fract(position);
None.gif
None.gif判断当前片断处于砖块位置还是灰泥位置,处于砖块位置时为1,处于灰泥位置时为0。
None.gifuseBrick 
=  step(position, BrickPct);
None.gif
None.gif根据当前片断的位置,得到当前片断的颜色值。
None.gifcolor  
=  mix(MortarColor, BrickColor, useBrick.x  *  useBrick.y);
None.gif
None.gif在颜色中加入光照效果。
None.gifcolor 
*=  LightIntensity;
None.gif
None.gif将计算好的颜色赋给当前片断。
None.gifgl_FragColor 
=  vec4 (color,  1.0 );

程序清单
None.gif uniform vec3  BrickColor, MortarColor;
None.gifuniform vec2  BrickSize;
None.gifuniform vec2  BrickPct;
None.gif
None.gifvarying vec2  MCposition;
None.gifvarying 
float  LightIntensity;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
void  main( void ) dot.gif {
InBlock.gif    vec3  color;
InBlock.gif    vec2  position, useBrick;
InBlock.gif    
InBlock.gif    position 
= MCposition / BrickSize;
InBlock.gif
InBlock.gif    
if (fract(position.y * 0.5> 0.5)
InBlock.gif        position.x 
+= 0.5;
InBlock.gif    position 
= fract(position);
InBlock.gif
InBlock.gif    useBrick 
= step(position, BrickPct);
InBlock.gif
InBlock.gif    color  
= mix(MortarColor, BrickColor, useBrick.x * useBrick.y);
InBlock.gif    color 
*= LightIntensity;
InBlock.gif    
InBlock.gif    gl_FragColor 
= vec4 (color, 1.0);
ExpandedBlockEnd.gif}


转载于:https://www.cnblogs.com/Pointer/archive/2004/08/04/30060.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值