转载链接:  http://blog.csdn.net/jinghouxiang/article/details/50751125

原创  2016年02月26日 17:06:01
  • 标签:
  • OpenGL /
  • GLSL /
  • Shader
[plain]  view plain  

运行环境: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:
[plain]  view plain  copy
  1. precision mediump float ;
  2. uniform mat4 uMVPMatrix;
  3. attribute vec4 aPosition;
  4. void main(){
  5. position = vec3 (uMVPMatrix*aPosition);
  6. gl_Position = uMVPMatrix*aPosition;
  7. }
 
  fragment shader:
[plain]  view plain  copy
  1. precision mediump float ;
  2. uniform vec2 screenSize;  // step  1
  3. void main()
  4. {
  5. vec2 uv = vec2(gl_FragCoord.xy/screenSize.xy);  // step 2
  6. //Calculate polar coordinates
  7. float r = length(uv);
  8. float c = 0.0;
  9. if(uv.x>0.98 &&uv.x<1.0 )                       // step 3
  10. {
  11. c = 1.0;
  12. }
  13. if(uv.y>0.98 &&uv.y<1.0 )                     // step 4
  14. {
  15. c = 1.0;
  16. }
  17. //Calculate the final color mixing lines and backgrounds.
  18. vec3 bg = mix(vec3(0.93 , 0.71 ,  0.62 ),  vec3(0.9 , 0.44 , 0.44),   r);  // step 5
  19. bg = mix(bg, vec3 (0.9 , 0.91 , 0.62 ), c);                                //  step 6
  20. gl_FragColor = vec4(bg, 1.0);
  21. }
运行后,效果图如下:
  
这里主要说下 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的正确表示方式。

glsl gl_FragCoord 与 屏幕关系相关推荐

  1. (转)跨越Opengl和D3D的鸿沟

    原帖地址: http://www.cnblogs.com/gongminmin/archive/2011/07/15/2107290.html 多年来,在论坛和各个网站上不断能看到拿OpenGL和D3 ...

  2. 新媒体视频导演 - 导演学前班

    为什么80%的码农都做不了架构师?>>>    导演学前班 1.你能学到什么 系统理论知识和导演思维 影视行业最好的时代 门槛空前降低 举例1:年轻作家-郭敬明<小时代> ...

  3. IOS和Android开发的一些个人感受

    傲娇的苹果,卖萌的安卓. 从个人心理来说,Android的小机器人萌的入人心, 咬了一口的苹果更注重了设计感,简约精致. 如果有出两系系统的周边,我觉得还是android买点比较多点~ 机器人比较好坳 ...

  4. vue中设置html的fontsize,vue中rem布局使用js动态改变fontsize

    rem布局原理:使用js动态改变html的字体大小+rem的特性,来保证最初的设计图中每个元素的尺寸比例不变,以适用于不同尺寸的设备能够正常显示. (function (doc, win) { var ...

  5. 关于DirectX中的三角形拾取的的另一种方法

    以前由于任务要求,曾对编写仿真环境中有简单的了解. 而三维转二维通过一定的转化时可以实现的,其中大多游戏引擎都是经过以下四步: 1.世界转换.世界转换是从物体的相对坐标转为世界坐标,包含物体以哪条轴转 ...

  6. 用python3编写彩虹的代码_在python的pygame设置彩虹弦:使用汉字变量及代码分析...

    #---第1步---导出模块--- importpygame,sysfrom pygame.locals import * importmathimportcolorsys#---第2步--初始化游戏 ...

  7. python绘制彩虹花_在python的pygame设置彩虹弦:使用汉字变量及代码分析

    #---第1步---导出模块--- importpygame,sysfrom pygame.locals import * importmathimportcolorsys#---第2步--初始化游戏 ...

  8. 网易雷火游戏测试实习一二三四面面经

    面后复盘, 呦吼~ 四面 自我介绍 为什么选择游戏测试(情绪/兴趣+使命/责任感+性格 :自认为不必提自己的知识掌握程度好,因为面试的过程就是在考核你的知识.如果自夸掌握程度好,后面发挥不大理想的话, ...

  9. Android 多屏幕适配 dp和px的关系

    一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的https://developer.android ...

最新文章

  1. 使用睡袋_在户外一个关乎睡眠的重要因素——睡袋
  2. Python继承外另一种重用方式——组合
  3. 湘南学院校企计算机班,2020湘南学院重点学科名单特色专业有哪些?
  4. c、c++、Java和gcc写Hello World
  5. Linux下进程间通信概述
  6. 深入业务成为更好的软件架构师——信息化建设图鉴一二例
  7. php smarty入门,smarty 快速入门
  8. 防止Visual C++应用程序缓冲区溢出
  9. 为什么程序员如此“嫌弃”主干开发模式?
  10. php栏目页内容排序问题,Dedecms频道列表页栏目排序问题详解
  11. jq实现剪裁图片设置为头像
  12. Android 解决表情面板和软键盘切换时跳闪的问题
  13. 极大值极小值搜索设计五子棋
  14. MIL自动化单元测试
  15. 计算机考研 外部排序,2021考研408数据结构基础知识点:外部排序
  16. python计算标准差为什么分母要-1_标准差越大说明什么(样本标准差分母为何是n-1)...
  17. 矩特征、几何矩的定义
  18. vue项目接入e2e自动化测试
  19. 东芝复印机2303出现f070_东芝复印机维修模式及维修错误代码
  20. 微信开挂怎么防止封号_说我微信开挂怎么解决(做好这几点不封号)

热门文章

  1. vue中nbsp不显示空格问题
  2. 基于JAVA如家酒店管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  3. Android Makefile中inherit-product函数和include的区别
  4. Android自定义控件传送,使用 Leanback 传输控件
  5. 酷酷的滚动彩虹色文字
  6. 输出一个由*组成的三角形图案_我问遍整个设计院,居然没有一个人会画古建?...
  7. dubbo的group分组
  8. ♥♥C站最全NCRE四级数据库总结(时刻更新,建议收藏!)
  9. tomcat与java web开发技术详解第三版 光盘
  10. 基于 wemos d1 智能感应开盖垃圾桶