• vscode shadertoy插件,非常方便的glsl着色器编写工具


    很著名的shadertoy网站,集合了非常多大神利用数学写出美妙的shader效果。像shadertoy创始人之一的IQ大神它在这方面有很多的建树。他的利用光线步进和躁声可以创建很多不可思议的3D场景。
     vscode有一件shadertoy的插件,安装后可以新建一个*.glsl文件,写好代码就可以直接运行看效果了。我试了一下非常方便.如果想要学习shader和一些数学在图形方面的应用我觉得这是一个非常好的插件.
    下面写了四个简单示例,水波纹、风景(利用2维值躁声和fmb躁声模拟山和水的流动和天空和云朵) 波纹 雷达 。源码在下面

    1. #define CAMERA_POS vec3(0,0,10)
    2. #define SPHERE_POS vec3(0,0,-5)
    3. #define SPHERE_RADIUS 1.
    4. #define MAX_DIST 200.
    5. #define MAX_STEPS 200
    6. #define LIGHT_POS vec3(-2,3,0)
    7. #define time iTime*0.8
    8. mat3 lookAt(vec3 cameraPos,vec3 target){
    9. vec3 up=vec3(0,1,0);
    10. vec3 z=normalize(cameraPos-target);//+z
    11. vec3 x=normalize(cross(up,z));
    12. vec3 y=normalize(cross(z,x));
    13. return mat3(x,y,z);
    14. }
    15. mat3 rotateMatrix(float rad,vec3 axis){
    16. axis=normalize(axis);
    17. float c=cos(rad);
    18. float s=sin(rad);
    19. float t=1.-c;
    20. float x=axis.x;
    21. float y=axis.y;
    22. float z=axis.z;
    23. return mat3(
    24. vec3(
    25. x*x*t+c,
    26. y*x*t-z*s,
    27. z*x*t+y*s
    28. ),
    29. vec3(
    30. x*y*t+z*s,
    31. y*y*t+c,
    32. z*y*t-x*s
    33. ),
    34. vec3(
    35. x*z*t-y*s,
    36. y*z*t+x*s,
    37. z*z*t+c
    38. )
    39. );
    40. }
    41. vec3 rotate(vec3 pos,vec3 origin,float rad){
    42. float c=cos(rad);
    43. float s=sin(rad);
    44. vec3 delta=pos-origin;
    45. return vec3(
    46. pos.x,
    47. delta.y*c-delta.z*s+origin.y,
    48. delta.y*s+delta.z*c+origin.z
    49. );
    50. }
    51. vec3 rotateX(vec3 pos,vec3 origin,float rad){
    52. float c=cos(rad);
    53. float s=sin(rad);
    54. vec3 delta=pos-origin;
    55. return vec3(
    56. delta.x+origin.x,
    57. delta.y*c-delta.z*s+origin.y,
    58. delta.y*s+delta.z*c+origin.z
    59. );
    60. }
    61. vec3 rotateY(vec3 pos,vec3 origin,float rad){
    62. float c=cos(rad);
    63. float s=sin(rad);
    64. vec3 delta=pos-origin;
    65. return vec3(
    66. c*delta.x+s*delta.z+origin.x,
    67. pos.y,
    68. s*delta.x-c*delta.z+origin.z
    69. );
    70. }
    71. vec3 rotateZ(vec3 pos,vec3 origin,float rad){
    72. float c=cos(rad);
    73. float s=sin(rad);
    74. vec3 delta=pos-origin;
    75. return vec3(
    76. delta.x*c-delta.y*s+origin.x,
    77. delta.x*s+delta.y*c+origin.y,
    78. pos.z
    79. );
    80. }
    81. // 投影坐标系
    82. vec2 projectionCoord(in vec2 coord, in float scale) {
    83. return scale * 2. * (coord - 0.5 * iResolution.xy) / min(iResolution.x, iResolution.y);
    84. }
    85. // 坐标轴
    86. vec4 AxisHelper(in vec2 coord, in float axisWidth, in vec4 xAxisColor, in vec4 yAxisColor) {
    87. vec4 color = vec4(0, 0, 0, 0);
    88. float dx = dFdx(coord.x) * axisWidth;
    89. float dy = dFdy(coord.y) * axisWidth;
    90. if(abs(coord.x) < dx) {
    91. color = yAxisColor;
    92. } else if(abs(coord.y) < dy) {
    93. color = xAxisColor;
    94. }
    95. return color;
    96. }
    97. float SDFSphere(vec3 p){
    98. return length(p-SPHERE_POS)-SPHERE_RADIUS;
    99. }
    100. vec3 rayDir(vec2 coord){
    101. return normalize(vec3(coord,0)-CAMERA_POS);
    102. }
    103. // 计算球体的法线
    104. vec3 SDFNormal(in vec3 p) {
    105. const float h = 0.0001;
    106. const vec2 k = vec2(1, -1);
    107. return normalize(k.xyy * SDFSphere(p + k.xyy * h) +
    108. k.yyx * SDFSphere(p + k.yyx * h) +
    109. k.yxy * SDFSphere(p + k.yxy * h) +
    110. k.xxx * SDFSphere(p + k.xxx * h));
    111. }
    112. vec3 calcNormal2(in vec3 p) // for function f(p)
    113. {
    114. const float h = 0.0001; // replace by an appropriate value
    115. #define ZERO (min(iFrame,0)) // non-constant zero
    116. vec3 n = vec3(0.0);
    117. for( int i=0; i<4; i++ )
    118. {
    119. vec3 e = 0.5773*(2.0*vec3((((i+3)>>1)&1),((i>>1)&1),(i&1))-1.0);
    120. // n += e*map(pos+e*h).x;
    121. }
    122. return normalize(n);
    123. }
    124. vec3 rayMarch(vec2 coord){
    125. float d0=0.;
    126. vec3 rd=rayDir(coord);
    127. vec3 color=vec3(0);
    128. for(int i=0;i<MAX_STEPS;i++){
    129. vec3 p=CAMERA_POS+rd*d0;
    130. float d1=SDFSphere(p);
    131. d0+=d1;
    132. if(d1<0.01){
    133. vec3 n=SDFNormal(p);
    134. vec3 lightDir=normalize(LIGHT_POS-p);
    135. float c=clamp(dot(n,lightDir),0.,1.);
    136. color=vec3(1,0,0)*c;
    137. break;
    138. }
    139. if(d0>MAX_DIST){
    140. break;
    141. }
    142. }
    143. return color;
    144. }
    145. // 2D Random
    146. float random (vec2 st) {
    147. return fract(sin(dot(st, vec2(12.9898,78.233)))
    148. * 43758.5453123);
    149. }
    150. // 2D Noise based on Morgan McGuire @morgan3d
    151. // https://www.shadertoy.com/view/4dS3Wd
    152. float noise (vec2 st) {
    153. vec2 i = floor(st);
    154. vec2 f = fract(st);
    155. // Four corners in 2D of a tile
    156. float a = random(i);
    157. float b = random(i + vec2(1.0, 0.0));
    158. float c = random(i + vec2(0.0, 1.0));
    159. float d = random(i + vec2(1.0, 1.0));
    160. // Smooth Interpolation
    161. // Cubic Hermine Curve. Same as SmoothStep()
    162. vec2 u = f*f*(3.0-2.0*f);
    163. // u = smoothstep(0.,1.,f);
    164. // Mix 4 coorners percentages
    165. return mix(a, b, u.x) +
    166. (c - a)* u.y * (1.0 - u.x) +
    167. (d - b) * u.x * u.y;
    168. }
    169. vec2 hash( vec2 p )
    170. {
    171. p = vec2( dot(p,vec2(127.1,311.7)),
    172. dot(p,vec2(269.5,183.3)) );
    173. return -1.0 + 2.0*fract(sin(p)*43758.5453123);
    174. }
    175. float noise12( in vec2 p )
    176. {
    177. const float K1 = 0.366025404; // (sqrt(3)-1)/2;
    178. const float K2 = .211324865; // (3-sqrt(3))/6;
    179. vec2 i = floor( p + (p.x+p.y)*K1 );
    180. vec2 a = p - i + (i.x+i.y)*K2;
    181. vec2 o = (a.x>a.y) ? vec2(1.0,0.0) : vec2(0.0,1.0);
    182. vec2 b = a - o + K2;
    183. vec2 c = a - 1.0 + 2.0*K2;
    184. vec3 h = max( 0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 );
    185. vec3 n = h*h*h*h*vec3( dot(a,hash(i+0.0)), dot(b,hash(i+o)), dot(c,hash(i+1.0)));
    186. return dot( n, vec3(70.0) );
    187. }
    188. float fbm(vec2 uv)
    189. {
    190. float f;
    191. mat2 m = mat2( 1.6, 1.2, -1.2, 1.6 );
    192. f = 0.5000*noise12( uv ); uv = m*uv;
    193. f += 0.2500*noise12( uv ); uv = m*uv;
    194. f += 0.1250*noise12( uv ); uv = m*uv;
    195. f += 0.0625*noise12( uv ); uv = m*uv;
    196. f = 0.5 + 0.5*f;
    197. return f;
    198. }
    199. float segment(vec2 uv,vec2 s,vec2 e,float lineWidth,float b){
    200. float halfLineWidth=lineWidth*.5;
    201. vec2 delta=e-s;
    202. vec2 p=uv-s;
    203. float t=clamp(dot(p,delta)/dot(delta,delta),0.,1.);
    204. float dist=length(p-t*delta);
    205. return 1.-smoothstep(halfLineWidth,halfLineWidth+b,dist);
    206. }
    207. float rect(vec2 uv,vec2 center,vec2 size){
    208. vec2 d=abs(uv-center)-size;
    209. return step(length(max(d,0.))+min(max(d.x,d.y),0.),0.);
    210. }
    211. float sdRect(vec2 uv,vec2 p,vec2 size){
    212. vec2 d=abs(uv-p)-size;
    213. return length(max(d,0.))+min(max(d.x,d.y),0.);
    214. }
    215. float circle(vec2 uv,vec2 c,float r,float b){
    216. float len=length(uv-c);
    217. float bb=b>0.?b*0.5:0.;
    218. return 1.-smoothstep(r-bb,r+bb,len);
    219. }
    220. float strokeCircle(vec2 uv,vec2 c,float r,float lineWidth,float b){
    221. float halfLineWidth=lineWidth*.5;
    222. float len=length(uv-c);
    223. float bb=b>0.?b*0.5:0.;
    224. return smoothstep(r-halfLineWidth-b,r-halfLineWidth,len)-smoothstep(r+halfLineWidth,r+halfLineWidth+bb,len);
    225. }
    226. float random(float x){
    227. return abs(fract(143.45454*sin(x)));
    228. }
    229. vec4 color_blend(vec4 source,vec4 dest){
    230. float ca=source.a+dest.a*(1.-source.a);
    231. return vec4((source.rgb*source.a+dest.rgb*dest.a*(1.-source.a)),ca);
    232. //return vec4((source.rgb*source.a+dest.rgb*dest.a*(1.-source.a))/ca,ca);
    233. }
    234. vec4 ripple(vec2 uv,vec2 p,float r,float num,vec3 color){
    235. vec4 col=vec4(0);
    236. float lineWidth=r/(num+2.);
    237. float t=fract(time*0.5);
    238. for(float i=0.;i<num;i++){
    239. float ratio=(i+1.)/num;
    240. float ct=(t+ratio)>1.?(t+ratio)-1.:t+ratio;
    241. float cr=r*ct;
    242. float alpha=1.-ct;
    243. float ret=strokeCircle(uv,p,r+cr,lineWidth,0.);
    244. if(ret>0.){
    245. col=ret*color_blend(vec4(color,alpha),col);
    246. }
    247. //col+=vec4(color.rgb,alpha)*ret;
    248. }
    249. if(circle(uv,p,r*0.5,0.2)>0.){
    250. col=color_blend(vec4(color,1),col);
    251. }
    252. //col+=vec4(color.rgb,1.)*circle(uv,vec2(0),r*0.8,0.);
    253. return col;
    254. }
    255. vec4 ring(vec2 uv,vec2 p,float r,float num,vec3 color){
    256. vec4 col=vec4(0);
    257. float t=fract(time*0.2544);
    258. for(float i=0.;i<num;i++){
    259. float ratio=(i+1.)/num;
    260. float ct=(t+ratio)>1.?(t+ratio)-1.:t+ratio;
    261. float cr=r*ct;
    262. float alpha=1.-ct;
    263. float ret=circle(uv,p,r+cr,0.);
    264. if(ret>0.){
    265. col=ret*color_blend(vec4(color,alpha),col);
    266. // col.rgb=col.rgb*col.a;
    267. }
    268. }
    269. return col;
    270. }
    271. mat3 setCamera(vec3 ro, vec3 target, float cr) {
    272. vec3 z = normalize(target - ro);
    273. vec3 up = normalize(vec3(sin(cr), cos(cr), 0));
    274. vec3 x = cross(z, up);
    275. vec3 y = cross(x, z);
    276. return mat3(x, y, z);
    277. }
    278. vec4 scenery(vec2 uv,vec2 p,float r,float num){
    279. vec4 col=vec4(0);
    280. float t=fract(time);
    281. vec2 n = p;
    282. vec2 pos;
    283. float rd=sdRect(uv,p,vec2(r));
    284. if(rd<0.){
    285. vec2 m=((uv-p)+r)*2.-1.;
    286. // m.x+=time;
    287. float d=length(m);
    288. if(m.y<0.2){
    289. vec3 origin=vec3(10,1,100);
    290. mat3 mat=lookAt(origin,vec3(0,-1,0));
    291. vec3 dir=mat*vec3(m,-1);
    292. dir.z*=40.;
    293. vec2 k=origin.xz+dir.xz*(10.-origin.y)/dir.y;
    294. float a=noise(0.1*k+time);
    295. col.rgb+=mix(vec3(0.3,0.7,1),vec3(0,0.6,0.9),smoothstep(0.4,0.8,a));
    296. col.rgb+=0.3*vec3(1)*smoothstep(1.,0.,length(dir.xy));
    297. }
    298. else if(abs(m.y-0.3*noise(m*2.))<0.2){
    299. col.rgb=vec3(.2);
    300. }else{
    301. vec3 origin=vec3(0,1.,2);
    302. mat3 mat=lookAt(origin,vec3(0,.6,0));
    303. vec3 dir=mat*vec3(m,-1);
    304. vec2 k=origin.xz+dir.xz*(100.-origin.y)/dir.y;
    305. float a=fbm(0.01*k+time*0.02);
    306. vec3 c1=mix(vec3(0.2,0.7,1),vec3(1),smoothstep(0.3,1.,a*step(0.,m.y-0.2)));
    307. col.rgb=c1+vec3(1)*smoothstep(1.,0.,length(m));
    308. if(dir.z<0.){
    309. //col.rgb=vec3(1,0,0);
    310. }
    311. }
    312. }
    313. return col;
    314. }
    315. #define PI2 3.1415926*2.
    316. vec4 radar(vec2 uv,vec2 p,float r,float num,vec3 color){
    317. vec4 col=vec4(0);
    318. vec2 p2=uv-p;
    319. float t=fract(time*0.2);
    320. float dx=dFdx(uv.x);
    321. float lw=dx*3.;
    322. float theta=t*PI2;
    323. vec2 scan=p+vec2(cos(theta),sin(theta))*(r-lw);
    324. col+=vec4(1)*strokeCircle(uv,p,r,lw,0.);
    325. col+=vec4(1)*strokeCircle(uv,p,r*0.66,lw,0.);
    326. col+=vec4(1)*strokeCircle(uv,p,r*0.33,lw,0.);
    327. col+=vec4(1)*segment(uv,vec2(p.x-r,p.y),vec2(p.x+r,p.y),lw,0.);
    328. col+=vec4(1)*segment(uv,vec2(p.x,p.y-r),vec2(p.x,p.y+r),lw,0.);
    329. float t2=segment(uv,p,scan,lw,0.);
    330. float gradient=0.;
    331. if (length(p2)<r){
    332. float angle = mod( theta - atan(p2.y, p2.x),PI2);
    333. gradient =sqrt(clamp(1. - angle, 0., 1.)*0.5);
    334. }
    335. t2=gradient + t2;
    336. if(t2>0.){
    337. col=vec4(color*t2,1.);
    338. }
    339. return col;
    340. }
    341. void mainImage(out vec4 fragColor,vec2 fragCoord){
    342. vec2 uv=projectionCoord(fragCoord,1.);
    343. uv*=2.;
    344. vec4 color = vec4(0);
    345. // color.rgb+=vec3(1,0,0)*segment(uv,vec2(0,1.5),vec2(2.,1.5),0.4,0.2);
    346. color+=ripple(uv,vec2(-1.2,0),0.3,3.,mix(vec3(1.,0,0),vec3(1,0,1),abs(sin(time))));
    347. color+=scenery(uv,vec2(0),0.6,4.);
    348. color+=ring(uv,vec2(1.2,0),0.3,4.,mix(vec3(1.,1,0),vec3(0,1,1),abs(sin(time))));
    349. color+=radar(uv,vec2(2.5,0),0.45,4.,vec3(1,0,1));
    350. fragColor = color;
    351. }

  • 相关阅读:
    Spring Cloud——Nacos(注册中心快速入门、服务发现详解、集成openFeign和gateway)
    YOLOv7训练自己的数据集
    【老生谈算法】matlab实现传染病模型源码——传染病模型
    java计算机毕业设计酒店员工管理系统源码+mysql数据库+系统+lw文档+部署
    MySQL-存储引擎
    BDD - SpecFlow Page Object Model POM
    Java双非大二找实习记录
    python代码实现论文〖文献引用顺序〗修改校对
    TCP三次握手四次挥手及常见问题解决方案
    Vulhub靶场环境搭建
  • 原文地址:https://blog.csdn.net/long5305350/article/details/137285758