shadertoy 原型,https://www.shadertoy.com/view/XslGRr

先说几个概念

  Shader language目前有3种主流语言:基于OpenGL的GLSL(OpenGL Shading Language,也称为GLslang),基于Direct3D的HLSL(High Level Shading Language),还有NVIDIA公司的Cg (C for Graphic)语言。
其中unity使用的是GLSL,unity使用的是Cg,并且进一步封装,称为shaderLab。

转unity代码如下:

  1. Shader "Shadertoy/Cloud" {
  2. Properties{
  3. iMouse ("Mouse Pos", Vector) = (, , , )
  4. // iChannel0("iChannel0", 2D) = "white" {}
  5. // iChannelResolution0 ("iChannelResolution0", Vector) = (10, 10, 0, 0)
  6. }
  7.  
  8. CGINCLUDE
  9. #include "UnityCG.cginc"
  10. #pragma target 3.0
  11.  
  12. #define vec2 float2
  13. #define vec3 float3
  14. #define vec4 float4
  15. #define mat2 float2x2
  16. #define mat3 float3x3
  17. #define mat4 float4x4
  18. #define iTime _Time.y
  19. // fmod用于求余数,比如fmod(1.5, 1.0) 返回0.5;
  20. #define mod fmod
  21. // 插值运算,lerp(a,b,w) return a + w*(a-b);
  22. #define mix lerp
  23. // fract(x): 取小数部分
  24. #define fract frac
  25. #define texture2D tex2D
  26. // 屏幕的尺寸
  27. #define iResolution _ScreenParams
  28. // 屏幕中的坐标,以pixel为单位.(_iParam.scrPos.xy/_iParam.scrPos.w)在屏幕中归一化后的屏幕位置,即返回分量范围在(0, 1)的屏幕横纵坐标值。屏幕的左下角值为(0, 0),右上角值为(1, 1)。
  29. #define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy)
  30.  
  31. #define PI2 6.28318530718
  32. #define pi 3.14159265358979
  33. #define halfpi (pi * 0.5)
  34. #define oneoverpi (1.0 / pi)
  35.  
  36. fixed4 iMouse;
  37. // sampler2D iChannel0;
  38. // fixed4 iChannelResolution0;
  39.  
  40. struct v2f {
  41. float4 pos : SV_POSITION;
  42. float4 scrPos : TEXCOORD0;
  43. };
  44.  
  45. //ComputeScreenPos是在UnityCG.cginc中定义的函数,它就作用如名字一样,计算该顶点转换到屏幕上的位置
  46. v2f vert(appdata_base v) {
  47. v2f o;
  48. o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  49. o.scrPos = ComputeScreenPos(o.pos);
  50. return o;
  51. }
  52.  
  53. vec4 main(vec2 fragCoord);
  54.  
  55. fixed4 frag(v2f _iParam) : COLOR0 {
  56. vec2 fragCoord = gl_FragCoord;
  57. // vec2 pos =fragCoord.xy / iResolution.xy * 2. - 1.;
  58. return main(fragCoord);
  59. }
  60.  
  61. ////////////////////////////////////////////////////////////////////
  62. // https://www.shadertoy.com/view/4sfGzS
  63. mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
  64. {
  65. vec3 cw = normalize(ta-ro);
  66. vec3 cp = vec3(sin(cr), cos(cr),0.0);
  67. vec3 cu = normalize( cross(cw,cp) );
  68. vec3 cv = normalize( cross(cu,cw) );
  69. return mat3( cu, cv, cw );
  70. }
  71.  
  72. vec3 sundir = normalize( vec3(-1.0,0.0,-1.0) );
  73.  
  74. #define MARCH(STEPS,MAPLOD) for(int i=0; i<STEPS; i++) { vec3 pos = ro + t*rd; if( pos.y<-3.0 || pos.y>2.0 || sum.a > 0.99 ) break; float den = MAPLOD( pos ); if( den>0.01 ) { float dif = clamp((den - MAPLOD(pos+0.3*sundir))/0.6, 0.0, 1.0 ); sum = integrate( sum, dif, den, bgcol, t ); } t += max(0.05,0.02*t); }
  75.  
  76. float iqhash( float n )
  77. {
  78. return fract(sin(n)*43758.5453);
  79. }
  80.  
  81. float noise( vec3 x )
  82. {
  83. // The noise function returns a value in the range -1.0f -> 1.0f
  84. vec3 p = floor(x);
  85. vec3 f = fract(x);
  86.  
  87. f = f*f*(3.0-2.0*f);
  88. float n = p.x + p.y*57.0 + 113.0*p.z;
  89. return mix(mix(mix( iqhash(n+0.0 ), iqhash(n+1.0 ),f.x),
  90. mix( iqhash(n+57.0 ), iqhash(n+58.0 ),f.x),f.y),
  91. mix(mix( iqhash(n+113.0), iqhash(n+114.0),f.x),
  92. mix( iqhash(n+170.0), iqhash(n+171.0),f.x),f.y),f.z);
  93. }
  94.  
  95. float map5( in vec3 p )
  96. {
  97. vec3 q = p - vec3(0.0,0.1,1.0)*iTime;
  98.  
  99. float f;
  100.  
  101. f = 0.50000*noise( q ); q = q*2.02;
  102. f += 0.25000*noise( q ); q = q*2.03;
  103. f += 0.12500*noise( q ); q = q*2.01;
  104. f += 0.06250*noise( q ); q = q*2.02;
  105. f += 0.03125*noise( q );
  106. return clamp( 1.5 - p.y - 2.0 + 1.75*f, 0.0, 1.0 );
  107. }
  108. float map4( in vec3 p )
  109. {
  110. vec3 q = p - vec3(0.0,0.1,1.0)*iTime;
  111. float f;
  112. f = 0.50000*noise( q ); q = q*2.02;
  113. f += 0.25000*noise( q ); q = q*2.03;
  114. f += 0.12500*noise( q ); q = q*2.01;
  115. f += 0.06250*noise( q );
  116. return clamp( 1.5 - p.y - 2.0 + 1.75*f, 0.0, 1.0 );
  117. }
  118. float map3( in vec3 p )
  119. {
  120. vec3 q = p - vec3(0.0,0.1,1.0)*iTime;
  121. float f;
  122. f = 0.50000*noise( q ); q = q*2.02;
  123. f += 0.25000*noise( q ); q = q*2.03;
  124. f += 0.12500*noise( q );
  125. return clamp( 1.5 - p.y - 2.0 + 1.75*f, 0.0, 1.0 );
  126. }
  127. float map2( in vec3 p )
  128. {
  129. vec3 q = p - vec3(0.0,0.1,1.0)*iTime;
  130. float f;
  131. f = 0.50000*noise( q ); q = q*2.02;
  132. f += 0.25000*noise( q );;
  133. return clamp( 1.5 - p.y - 2.0 + 1.75*f, 0.0, 1.0 );
  134. }
  135.  
  136. vec4 integrate( in vec4 sum, in float dif, in float den, in vec3 bgcol, in float t )
  137. {
  138. // lighting
  139. vec3 lin = vec3(0.65,0.7,0.75)*1.4 + vec3(1.0, 0.6, 0.3)*dif;
  140. vec4 col = vec4( mix( vec3(1.0,0.95,0.8), vec3(0.25,0.3,0.35), den ), den );
  141. col.xyz *= lin;
  142. col.xyz = mix( col.xyz, bgcol, 1.0-exp(-0.003*t*t) );
  143. // front to back blending
  144. col.a *= 0.4;
  145. col.rgb *= col.a;
  146. return sum + col*(1.0-sum.a);
  147. }
  148.  
  149. vec4 raymarch( in vec3 ro, in vec3 rd, in vec3 bgcol, in int2 px )
  150. {
  151. vec4 sum = vec4(0.0,0.0,0.0,0.0);
  152.  
  153. float t = 0.0;//0.05*texelFetch( iChannel0, px&255, 0 ).x;
  154.  
  155. MARCH(,map5);
  156. MARCH(,map4);
  157. MARCH(,map3);
  158. MARCH(,map2);
  159. //clamp(x,min,max),min(max(x, min), max),
  160. //if min < x < max , return x;
  161. //if x < min , return min;
  162. //if x > max , return max;
  163. return clamp( sum, 0.0, 1.0 );
  164. }
  165.  
  166. //得到像素点的颜色值
  167. vec4 render( in vec3 ro, in vec3 rd, in int2 px )
  168. {
  169. // background sky
  170. // dot 点积,各分量分别相乘 后 相加
  171. float sun = clamp( dot(sundir,rd), 0.0, 1.0 );
  172. vec3 col = vec3(0.6,0.71,0.75) - rd.y*0.2*vec3(1.0,0.5,1.0) + 0.15*0.5;
  173. col += 0.2*vec3(1.0,.,0.1)*pow( sun, 8.0 );
  174.  
  175. // clouds
  176. vec4 res = raymarch( ro, rd, col, px );
  177. col = col*(1.0-res.w) + res.xyz;
  178.  
  179. // sun glare
  180. // pow(x, y): x的y次方;
  181. col += 0.2*vec3(1.0,0.4,0.2)*pow( sun, 3.0 );
  182.  
  183. return vec4( col, 1.0 );
  184. }
  185.  
  186. vec4 main(vec2 fragCoord) {
  187. //iResolution:screen size
  188. //fragCoord:在屏幕上的位置,单位pixel
  189. vec2 p = (-iResolution.xy + 2.0*fragCoord.xy)/ iResolution.y;
  190.  
  191. vec2 m = iMouse.xy/iResolution.xy;
  192.  
  193. //camera
  194. vec3 ro = 4.0*normalize(vec3(sin(3.0*m.x), 0.4*m.y, cos(3.0*m.x)));
  195. vec3 ta = vec3(0.0, -1.0, 0.0);
  196. mat3 ca = setCamera( ro, ta, 0.0 );
  197. //ray
  198. vec3 rd = mul(ca , normalize( vec3(p.xy,1.5)));
  199. //fragCoord屏幕像素位置.
  200. vec2 pos = fragCoord.xy / iResolution.xy;
  201. return render( ro, rd, int2(fragCoord-0.5) );
  202. }
  203. ////////////////////////////////////////////////////////////////////
  204.  
  205. ENDCG
  206.  
  207. SubShader {
  208. Pass {
  209. CGPROGRAM
  210.  
  211. #pragma vertex vert
  212. #pragma fragment frag
  213. #pragma fragmentoption ARB_precision_hint_fastest
  214.  
  215. ENDCG
  216. }
  217. }
  218. FallBack Off
  219. }

参考了乐乐(candycat)的博客,想深入学习shader的可以多看看她的博客和书,很多干货,然后就是https://msdn.microsoft.com/en-us/library/windows/apps/dn166865.aspx,GLSL转HLSL参考文档。

还有一个人一定要说,shaderToy网站上的iq,创造了好多shader,效果非常非常赞。

最后有两个东西没解决,textureLod,和texelFetch这两个函数怎么映射到unity?

shader 2 : use shaderToy in unity的更多相关文章

  1. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&amp;混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

  2. Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照

    前言 光学中,我们是用辐射度来量化光. 光照按照不同的散射方向分为:漫反射(diffuse)和高光反射(specular).高光反射描述物体是如何反射光线的,漫反射则表示有多少光线会被折射.吸收和散射 ...

  3. Unity shader学习之标准的Unity shader

    包含光照,可处理多个光源,有光照衰减和阴影的shader,代码如下: 转载请注明出处:http://www.cnblogs.com/jietian331/p/7199311.html Shader & ...

  4. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

  5. 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)

    写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...

  6. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  7. 【Unity Shaders】Diffuse Shading——向Surface Shader添加properties

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  8. 关于Unity中的模型描边与Shader切换(专题二)

    模型描边 1: LOL里面的模型描边效果,点击防御塔会有描边的效果,被攻击的时候模型也要描边凸显一下2: 网上可以找到模型描边的Shader,可以直接下载使用,一组第三方的Shader, 帮我们解决了 ...

  9. 关于Unity中Shader的使用

    在游戏的开发过程中,程序员不太会自己去写shader,因为写起来很麻烦,而且只有Unity会报错,编译器也没有什么提示. 通常是拿别人的shader改一改,当然,程序员还是要能看懂和会一点shader ...

随机推荐

  1. 教我徒弟Android开发入门(一)

    前言: 这个系列的教程是为我徒弟准备的,也适合还不懂java但是想学android开发的小白们~ 本系列是在Android Studio的环境下运行,默认大家的开发环境都是配置好了的 没有配置好的同学 ...

  2. FreeRTOS--堆内存管理

    因为项目需要,最近开始学习FreeRTOS,一开始有些紧张,因为两个星期之前对于FreeRTOS的熟悉度几乎为零,经过对FreeRTOS官网的例子程序的摸索,和项目中问题的解决,遇到了很多熟悉的身影, ...

  3. yii2.0中添加二维数组,多条数据。

    /** * @inheritdoc 批量添加 * @params $add array 添加数据 */public function add_all($add){ $connection = \Yii ...

  4. C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原

    C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原 我们以前讲SEH异常处理的时候已经说过了,C++中的Try catch语法只不过是对SEH做了一个封装. 如果不懂SEH异 ...

  5. 防止UI穿透操作到游戏场景

    #if UNITY_EDITOR || UNITY_STANDALONE_WIN if (EventSystem.current.IsPointerOverGameObject()) { return ...

  6. xxx金融后台管理系统详细版:包括本地开发调试详细步骤

    效果演示地址, github地址: demo演示:         1.About 此项目是 vue2.0 + element-ui + node+mongodb 构建的后台管理系统,所有的数据都是从 ...

  7. Python&amp;MySQL&amp;PyQt

    环境: Python2.7+MySQL5.6+PyQt4 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/40 ...

  8. 指尖上的电商---(4).net开发solr

    这一节我们看下如何把查询数据放到server端存储,这里我们须要使用client工具来操作与服务端数据打交道,网上有好多基于.NET开发的SOLRclient,我们这里选择easynet.solr,非 ...

  9. 对使用多个swiper下标有时显示不出来的问题

    这久写了一个网页,其中有很多的轮播图及tab页面切换,就使用了swiper框架,有时一个网页要用到6-8个,如此就出现了下图这种问题: 有时刷新看不到,有时又能看到,tab切换过去的页面也看不到,其实 ...

  10. 我在Windows下的第一个Shellcode

    纪念我的第一个Shellcode(XP SP3, VC6): 1.获取MessageBoxA(ASCII)的静态地址 2.编写汇编代码调试,获取对应的机器码(注意字符串由栈顶向栈底生长,push由栈底 ...