Shader toy (A new world)

1.一个多月了,突然忘记CSDN的password了。由于每次输password的时候都要计算一遍,于是没有计算出来…

2.回头发现都过了半年了,都快捏了一把汗,这百度何时不那么踉踉跄跄,搜索服务一直那么差,百度网速又不给力了。

3.创新的思维非常重要,那为了那死去活来还要被唾弃的文聘我值得吗?


留一戳shadertoy地址:https://www.shadertoy.com/user/834144373 就 恬纳微晰

C博客做得还是能够。毕竟是技术论坛,有的是原创文章,而有的文章千金难求。所以C博客没有大量的广告。以后C博客的口碑还是能够……


快来看看吧!你的第一眼感觉!

  • My Transparent Gyro!

    1.这看着眼熟嘛

    它的住址在这儿https://www.shadertoy.com/view/MlfXz7



    2.来个不动的

    还是只是瘾。去拜訪拜訪https://www.shadertoy.com/view/MlfXz7



    同志们,一定要小心,不要拿其他方面都不专业的浏览器訪问,不然浏览器吃不消。

  • My Smooth Gyro!

    1.这个是谁呀

    我怎么也看着眼熟。gif为什么这么卡?那快去看看这儿吧。 https://www.shadertoy.com/view/llfXz7



    2.怎么看着奇怪

    这又是哪样的节奏啊!

    细致看图片的日期

    一定要细致看图片上的日期

    是那个画在834144373旁边的那个日期 \\//博客公布日期2015年7月23日

初步技术细节

  • Gyro 旋转之谜

    或许你不相信。这gif有2.96MB大小,CSDN要求2MB。这个C究竟怎么了?

math可都家喻户晓了,当然这个旋转math也就要摆出来了。平时调用数学库,这回可就全然靠自己了。。

。。

(A say:我靠,靠谁呀!

老师没有教?Super B say:–马丹,不知道抄啊!要养成从小抄袭的良好习惯。)

  1. //标准数学中的旋转矩阵
  2. vec3 rotate_y(vec3 v, float angle)//y轴旋转
  3. {
  4. float ca = cos(angle); float sa = sin(angle);
  5. return v*mat3(
  6. ca, .0, -sa,
  7. .0,1.0, .0,
  8. sa, .0, ca);
  9. }
  10. vec3 rotate_x(vec3 v, float angle)//x轴旋转
  11. {
  12. float ca = cos(angle); float sa = sin(angle);
  13. return v*mat3(
  14. 1.0, .0, .0,
  15. .0, ca, -sa,
  16. .0, sa, ca);
  17. }
  18. vec3 rotate_z(vec3 v,float angle){//z轴旋转 这儿是我有益写上的,就用不上节奏了
  19. float ca = cos(angle),sa = sin(angle);
  20. return v*mat3(
  21. ca,-sa,0.,
  22. sa, ca,0.,
  23. 0., 0.,0.
  24. );
  25. }
  26. //当然对于程序来说。还有更简的旋转写法。假设你经历过。。。
  27. 。。

所以你用的时候一定要注意了。让物体旋转的条件是鼠标mouse为变量,以哪个轴旋转



p假设看不懂就当做一条射线向量,我们这是在旋转它。就如gif上鼠标晃来晃去那样。

(哎。怪我罗!

赶快在这儿补补http://blog.csdn.net/baidu_26153715/article/details/46510703 3D基础实现篇。马丹,我都还没找到这样解析shadertoy上 三D,还是中文易懂不要钱的文章)

  • Gyro 背景之谜



    能够细致从图中看出。一个背景是黑的,一个背景有点蹊跷,那么有点蹊跷是怎么实现的?

    1. col = textureCube(iChannel0,pp).rgb;
    2. //就是这么实现的。pp为镜头向外射出的单位向量,这个就不须要想吧。

晋级技术

  • Gyro 初步假光照,试探光照反应

  1. col = vec3(max(0.,dot(nDir,-normalize(vec3(0.,1.,1.)))));

能够看到初步的光照反应是成立的。

最后用到经常使用的这个方案,这是最后加入上去的。

  1. //fork diffuse
  2. diff = 0.5*max(0.,dot(nDir,normalize(vec3(0.,1.,0.))))+0.5;
  • Gyro 折射、透明、其他效果

  1. factor = (1.- iMouse.y/iResolution.y)*0.1;
  2. factor = pow(factor,1.1);
  3. ref = normalize(reflect(pp,nDir));
  4. fra0 = normalize(refract(pp,nDir,iMouse.y/iResolution.y));
  5. fra1 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+factor);
  6. fra2 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+2.*factor);
  7. //col = nDir;
  8. //fork diffuse
  9. diff = 0.5*max(0.,dot(nDir,normalize(vec3(0.,1.,0.))))+0.5;
  10. //custom fresnel
  11. fresnel = pow(1.-max(0.,dot(pp,nDir)),2.);
  12. refcol = textureCube(iChannel0,ref).rgb;
  13. //tone-mapping
  14. refcol /= vec3(1.)+refcol;
  15. //fracol = textureCube(iChannel0,fra).rgb/1.5;
  16. vec3 fracol = vec3(
  17. textureCube(iChannel0,fra0).r,
  18. textureCube(iChannel0,fra1).g,
  19. textureCube(iChannel0,fra2).b
  20. );
  21. //Luminance
  22. luminance = dot( fracol, vec3(0.22, 0.707, 0.071));
  23. fracol *= diff*luminance;
  24. //gamma
  25. fracol = pow(fracol,vec3(1.3));
  26. col = mix(fracol,refcol,fresnel);
  27. //tone
  28. col *= 2.3*vec3(1.1,1.1,1.);
  29. //col = vec3(diff);

从代码片段能够看出。我用到了fresnel来混合折射与反射效果,当中Luminance来计算折射亮度,其他效果你懂得。

  • Gyro 折射率这种调节

  1. factor = (1.- iMouse.y/iResolution.y)*0.1;
  2. factor = pow(factor,1.1);
  3. ref = normalize(reflect(pp,nDir));
  4. fra0 = normalize(refract(pp,nDir,iMouse.y/iResolution.y));
  5. fra1 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+factor);
  6. fra2 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+2.*factor);

这儿的iMouse.y/iResolution.y作用 能够鼠标上下滑动来调节折射率因子。

  1. vec3 fracol = vec3(
  2. textureCube(iChannel0,fra0).r,
  3. textureCube(iChannel0,fra1).g,
  4. textureCube(iChannel0,fra2).b
  5. );

这儿就是经典的rgb三通道简单位移实现折射产生的散色想象,当然你能够自己发明……

Shadertoy Gyro 代码终于总结

这个就是实现一款简单3D的秘密,,,当然这是基于fragment shader直接实现的。。。

  1. //thx for shadertoy give me a more interesting world
  2. //The Transparent Gyro made by 834144373zhu
  3. //https://www.shadertoy.com/view/MlfXz7
  4. /////////////////////////////////////////////////
  5. #define time iGlobalTime
  6. vec3 rotate_y(vec3 v, float angle)
  7. {
  8. float ca = cos(angle); float sa = sin(angle);
  9. return v*mat3(
  10. ca, .0, -sa,
  11. .0,1.0, .0,
  12. sa, .0, ca);
  13. }
  14. vec3 rotate_x(vec3 v, float angle)
  15. {
  16. float ca = cos(angle); float sa = sin(angle);
  17. return v*mat3(
  18. 1.0, .0, .0,
  19. .0, ca, -sa,
  20. .0, sa, ca);
  21. }
  22. vec3 rotate_z(vec3 v,float angle){
  23. float ca = cos(angle),sa = sin(angle);
  24. return v*mat3(
  25. ca,-sa,0.,
  26. sa, ca,0.,
  27. 0., 0.,0.
  28. );
  29. }
  30. //distance function
  31. float toSphere(in vec3 p){
  32. p = rotate_y(p,-time*0.5);
  33. p.y += 0.2;
  34. return length(pow(abs(p),vec3(.7,0.68,0.4)))-1.5;
  35. //you can try this another DE vertion
  36. //return length(pow(abs(p),vec3(.7,0.68,0.4))-vec3(.6,0.35,0.4))-1.;
  37. }
  38. float toPlane( vec3 p )
  39. {
  40. return p.y;
  41. }
  42. //map the objects and return the distance
  43. float map(in vec3 p){
  44. return toSphere(p);
  45. }
  46. //the object's noraml
  47. vec3 normal(in vec3 p){
  48. vec2 offset = vec2(0.01,0.);
  49. vec3 nDir = vec3(
  50. map(p+offset.xyy)-map(p-offset.xyy),
  51. map(p+offset.yxy)-map(p-offset.yxy),
  52. map(p+offset.yyx)-map(p-offset.yyx)
  53. );
  54. return normalize(nDir);
  55. }
  56. //ray-marching the object and return the distance
  57. float raymarching(in vec3 pos,in vec3 p){
  58. float d = 0.;
  59. float distance = 1.;
  60. for(int i = 0;i<64;++i){
  61. distance += d;
  62. vec3 raysphere = pos + distance*p;
  63. d = map(raysphere);
  64. if(d<0.02 )break;
  65. };
  66. return distance;
  67. }
  68. /*vec3 thenewp (in vec3 pos,in vec3 p,in float an){
  69. vec3 dian = vec3(0.);
  70. vec3 z = normalize(dian-pos);
  71. vec3 x = normalize(cross(z,vec3(sin(an),cos(an),0.)));
  72. vec3 y = normalize(cross(z,x));
  73. mat3 mat = mat3(x,y,z);
  74. return p*mat;//;p.x*x+p.y*y+p.z*z;
  75. }
  76. */
  77. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  78. {
  79. vec2 mouse = iMouse.xy/iResolution.xy*vec2(5.,0.);
  80. vec2 uv = fragCoord.xy / iResolution.xy;
  81. uv = uv*2.-1.;
  82. uv.x *= iResolution.x/iResolution.y;
  83. vec3 p = normalize(vec3(uv,2.));
  84. //camera
  85. vec3 pos = vec3(0.,0.,-5.);
  86. pos = rotate_x(pos,mouse.y);
  87. pos = rotate_y(pos,mouse.x);
  88. //the new p
  89. //vec3 pp = thenewp(pos,p,0.);
  90. vec3 pp;
  91. //pp = rotate_x(p,mouse.y);
  92. pp = rotate_y(p,mouse.x);
  93. vec3 col = vec3(0.);
  94. float d = raymarching(pos,pp);
  95. float diff,fresnel,luminance,factor;
  96. vec3 nDir,ref, fra0,fra1,fra2;
  97. vec3 refcol,fracol;
  98. if(d<40.){
  99. nDir = -normal(pos+d*pp);
  100. if(dot(pp,nDir) > 0.){
  101. factor = (1.- iMouse.y/iResolution.y)*0.1;
  102. factor = pow(factor,1.1);
  103. ref = normalize(reflect(pp,nDir));
  104. fra0 = normalize(refract(pp,nDir,iMouse.y/iResolution.y));
  105. fra1 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+factor);
  106. fra2 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+2.*factor);
  107. //col = nDir;
  108. //fork diffuse
  109. diff = 0.5*max(0.,dot(nDir,normalize(vec3(0.,1.,0.))))+0.5;
  110. //custom fresnel
  111. fresnel = pow(1.-max(0.,dot(pp,nDir)),2.);
  112. refcol = textureCube(iChannel0,ref).rgb;
  113. //tone-mapping
  114. refcol /= vec3(1.)+refcol;
  115. //fracol = textureCube(iChannel0,fra).rgb/1.5;
  116. vec3 fracol = vec3(
  117. textureCube(iChannel0,fra0).r,
  118. textureCube(iChannel0,fra1).g,
  119. textureCube(iChannel0,fra2).b
  120. );
  121. //Luminance
  122. luminance = dot( fracol, vec3(0.22, 0.707, 0.071));
  123. fracol *= diff*luminance;
  124. //gamma
  125. fracol = pow(fracol,vec3(1.3));
  126. col = mix(fracol,refcol,fresnel);
  127. //tone
  128. col *= 2.3*vec3(1.1,1.1,1.);
  129. //col = vec3(diff);
  130. }
  131. else{
  132. discard;
  133. }
  134. }else{col = vec3(0.06);}
  135. fragColor = vec4(col,1.0);
  136. }

我非常不放心:你绝对没有看过这篇博客 http://blog.csdn.net/baidu_26153715/article/details/46510703,本片博客就是基于这篇基本3D实现技术,来实现其他深层次技术。

还有不放心的地方:你能够看这篇博客http://blog.csdn.net/baidu_26153715/article/details/45420029,来实现一些基本效果。

  • 还有不放心的是:

下面就留给可爱的

Shader toy (顺手写两个Gyro)(纯代码写3D)的更多相关文章

  1. PureLayout,使用纯代码写AutoLayout

    为iOS和OS X的自动布局最终的API -- 令人印象深刻的简单,非常强大. PureLayout延伸的UIView /NSView , NSArray,和NSLayoutConstraint与之后 ...

  2. 纯代码写UI的时候,如何指定style?

    有的时候,需要使用纯代码实现Android UI,那么这个时候如何指定某个UI组件的样式呢? 一般来说,UI组件都有一些set方法可供使用,以调整一些UI属性,从而达到调整样式的目的. 但是,情况并非 ...

  3. 利用纯代码写出一个秒表表盘的方法 —— #DF

    @interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...

  4. iOS高仿app源码:纯代码打造高仿优质《内涵段子》

    iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...

  5. 可视化PK纯代码

    简述 其实今天说的内容不仅仅局限于Qt,在很多其它语言或者框架中也适用,那就是 - 用可视化工具or文本编辑器?拖or不拖? 如果有人问我喜欢脱or不脱?我会毫不犹豫地说不脱,因为我比较矜持O(∩_∩ ...

  6. AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI

    AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...

  7. swift 之 纯代码创建 cell

    初学swift 但是网上只有很多swift用xib创建的cell,就算是有也不是我想要的.今天自己弄了一个不用xib纯代码写的,来上代码 博客地址: https://github.com/liguol ...

  8. ios - 纯代码创建collectionView

    开始考虑好一点点时间,因为一般的都是用xib,或者storyboard来写的.这次用纯代码...废话较多请看 首先把storyboard干掉,工程里面的main干掉 由于干掉了storyboard则启 ...

  9. 纯代码 自己主动屏幕适配iPhone button

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2h1bmdlc2hpaHVhdGlhbg==/font/5a6L5L2T/fontsize/400/fil ...

随机推荐

  1. Python之面向对象:闭包和装饰器

    一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print na ...

  2. oracle修改数据遇到的坑

    select t.*,mt.*,mr.rowid,mr.* from manu_routecardlist mr left join manu_routecard t on t.routecard_i ...

  3. mysql case when使用记录

    两种实现方式 第一种,CASE后面跟字段,当等于WHEN后面的值时,输出指定的数据 SELECT CASE gc.cat_id THEN '台球' THEN '羽毛球' ELSE '其它' END A ...

  4. box-pack

    box-pack表示父容器里面子容器的水平对齐方式,可选参数如下所示: start | end | center | justify <article class="wrap" ...

  5. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra

    Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...

  6. openGL深度缓冲区问题

    http://zhidao.baidu.com/question/368299839.html&__bd_tkn__=6aa9196c746cd3357f1eec74aeb127b395029 ...

  7. Android控件介绍

    1. 介绍 Android控件大多位于android.widget, android.view.View为他们的父类对于Dialog系列, android.app.Dialog为父类 Android的 ...

  8. MTK_GPIO口的定制

    http://blog.csdn.net/zuoyioo7/article/details/77863291如果需要定制GPIO口呢,需要使用mediatek/dct/DrvGen.exe工具,点击O ...

  9. chanme的博客搬家了!

    一直以来都想自己租一台服务器,买个域名做一个自己的博客,但是由于时间和知识的关系,以前还不太知道怎么搭一个博客.终于我在上个礼拜成功的迈出了建站的第一步,然后陆陆续续的也将一些后续的步骤做好了.所以今 ...

  10. mysql-MHA 故障收集

    在manager 主机上开启监控服务,启动不了 [root@manager ~]# managerStart [] [root@manager ~]# managerStatus app1 is st ...