学习ShaderToy第一天: glsl语言内置函数gl_FragCoord

来源:互联网 发布:lol重连进不去 无网络 编辑:程序博客网 时间:2024/05/22 14:20
运行环境:Android
opengl es版本: 2.0
3D引擎库 : Rajawali3D


ShaderToy上用的shader语言 为glsl , 效果是用webgl跑的,而webgl封装了opengl es,  所以ShaderToy上的例子同样使用于Android端。

ShaderToy基本上 都是用fragment shader 对栅格化后的像素进行处理。  大部分会用到纹理来丰富最终渲染结果的形状和质地,有些也会用到声音,键盘等外部输入信息。    但是,最终都是归结为对栅格化区域内的每个像素进行处理,因此,我们首先来认识gl_FragCoord这个内置变量以及其与屏幕坐标的关系。

 gl_FragCoord根据glsl language spec的解释为:
   它是fragment shaders的输入变量,并持有该framgent的屏幕相对坐标(x, y, z, 1/w)

  什么是屏幕相对坐标,它的坐标范围是多少,这些都没有告诉我们。需要我们实验
     

  假设我们采用2d ortho projection的方式来渲染,输入的顶点信息为屏幕的4个顶点坐标,这样我们最终渲染出来的是一个 铺满屏幕的图。
 由于是2D渲染,最终每个fragment的 gl_FragCoord的z接近0.0, 而w 为1.0, 而它的x, y分量,是相对于屏幕左下角为原点的屏幕坐标。什么意思?
   假如,我们设定的viewport的渲染区域为(0, 0, 1280, 574) 这么大,那么,gl_Fragment的x分量 范围就在0~1280之间, y分量就在0~574之间。

  我们可以用一下测试用例来进行测试:
   vertex shader:
  
precision mediump float ;  uniform mat4 uMVPMatrix;  attribute vec4 aPosition;  void main(){      position = vec3 (uMVPMatrix*aPosition);      gl_Position = uMVPMatrix*aPosition;  }


 
  fragment shader:

   
precision mediump float ;    uniform vec2 screenSize;  // step  1  void main()  {     vec2 uv = vec2(gl_FragCoord.xy/screenSize.xy);  // step 2    //Calculate polar coordinates     float r = length(uv);     float c = 0.0;    if(uv.x>0.98 &&uv.x<1.0 )                       // step 3    {       c = 1.0;    }     if(uv.y>0.98 &&uv.y<1.0 )                     // step 4     {       c = 1.0;     }     //Calculate the final color mixing lines and backgrounds.     vec3 bg = mix(vec3(0.93 , 0.71 ,  0.62 ),  vec3(0.9 , 0.44 , 0.44),   r);  // step 5     bg = mix(bg, vec3 (0.9 , 0.91 , 0.62 ), c);                                //  step 6     gl_FragColor = vec4(bg, 1.0);}

运行后,效果图如下:
  

这里主要说下 fragment shader:
   step 1: 之前说到, gl_FragCoord的坐标范围, 这里screenSize 表示屏幕的宽高。
   step 2 :   将每个fragment的 每个gl_FragCoord归一化,这是一个惯例,利于后面计算
   step3: 和 step4:  这两个分别表示,当fragment的坐标(x, y) 的x和y分量分别落在这个范围时(即中间)c 的值会发生变化
   step5:  step5 和 step6都用到了glsl 的 mix内置函数,  考虑到 bg = mix(color1, color2, r)它的意思,就是将color1和color2 两种颜色,按照bg = color1*(1-r)+r*color2的方式混合,其中bg, color1, color2都是表示颜色,有三个分量。 那么,当r=0.0时,表示的是color1颜色,当r = 1.0表示的是color2颜色。 我们利用mix可以在一种背景上标记出另一种颜色。

 step3 和 step4 表示,当x, y 分别落在值范围的中间时,c的值从0.0变为1.0, 即在这个范围内,背景色变为我们设置的颜色。


当我们把step3 和 step4 改为:
    if (uv.x>0.09 &&uv.x<0.11 )                       // step 3
    {
       c = 1.0;
    }

     
if (uv.y>0.09 &&uv.y<0.11 )                     // step 4
     {
       c = 1.0;
     }

效果图如下:


通过,以上的例子我们得出gl_FragCoord的正确表示方式。

   




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 签证用的旧护照丢失了英签怎么办 买的动迁房房东不肯过户怎么办 身份信息在qq邮箱泄露了怎么办 别人用我的身份证贷款不还怎么办 做兼职被骗了身份证泄露了怎么办 qq绑定的手机号被别人换了怎么办 银行卡丢失不知道卡号和密码怎么办 美团景点门票过了退款期怎么办 我的手机汽车之家无法看视频怎么办 来事泡温泉细菌感染外阴瘙痒怎么办 西澳大学语言班没通过怎么办 银行入职培训理论考试不合格怎么办 去泰国旅游不会泰语和英语的怎么办 老板不发工资怎么办没签合同的 3d模型导进去材质丢失怎么办 七日杀显示载入中之后进不去怎么办 进京证过期了车在北京怎么办 微信打字时剪切的东西丢了怎么办 错过了医师定期考核报名时间怎么办 大学档案在自己手里放多年怎么办 档案在自己手里10年了怎么办 快递地址区域划分写错了怎么办 怀孕八个月肛门长个肉疙瘩怎么办呢 客户签了合同不要货了怎么办 不喂母乳宝宝只认识保姆了怎么办? 开创者比赛后没有买的鸽子怎么办 买回来小鸽子开家我敢了怎么办 小鸽子出壳后母鸽就不孵了怎么办 狗狗在笼子里一直叫怎么办 养了一年母鸽子不配对怎么办 血管翳云翳斑翳长满眼睛怎么办 鸽子训放50公里突然下雨了怎么办 安卓手机反应慢又卡怎么办 tcl安卓系统电视反应慢怎么办 狼人杀警长竞选一直平票怎么办 去驾校投诉教练被教练报复怎么办 哈尔滨机场大巴六点的飞机怎么办 山东德州恩城镇的农民怎么办养老险 我的世界联机平台房间进不去怎么办 验车时间过了3天怎么办 在携程订的机票和酒店不能退怎么办