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

news2024/12/23 15:36:25

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



#define CAMERA_POS vec3(0,0,10)
#define SPHERE_POS vec3(0,0,-5)
#define SPHERE_RADIUS 1.
#define MAX_DIST 200.
#define MAX_STEPS 200
#define LIGHT_POS vec3(-2,3,0)
#define time iTime*0.8


mat3 lookAt(vec3 cameraPos,vec3 target){
    vec3 up=vec3(0,1,0);
    vec3 z=normalize(cameraPos-target);//+z
    vec3 x=normalize(cross(up,z));
    vec3 y=normalize(cross(z,x));
    return mat3(x,y,z);
}

mat3 rotateMatrix(float rad,vec3 axis){
    axis=normalize(axis);
    float c=cos(rad);
    float s=sin(rad);
    float t=1.-c;
    float x=axis.x;
    float y=axis.y;
    float z=axis.z;
    return mat3(
       vec3(
          x*x*t+c,
          y*x*t-z*s,
          z*x*t+y*s
       ),
       vec3(
          x*y*t+z*s,
          y*y*t+c,
          z*y*t-x*s
       ),
       vec3(
          x*z*t-y*s,
          y*z*t+x*s,
          z*z*t+c
       )
    );
}
vec3 rotate(vec3 pos,vec3 origin,float rad){
    float c=cos(rad);
    float s=sin(rad);
    vec3 delta=pos-origin;
    return vec3(
        pos.x,
        delta.y*c-delta.z*s+origin.y,
        delta.y*s+delta.z*c+origin.z
    );
}

vec3 rotateX(vec3 pos,vec3 origin,float rad){
    float c=cos(rad);
    float s=sin(rad);
    vec3 delta=pos-origin;
    return vec3(
        delta.x+origin.x,
        delta.y*c-delta.z*s+origin.y,
        delta.y*s+delta.z*c+origin.z
    );
}

vec3 rotateY(vec3 pos,vec3 origin,float rad){
    float c=cos(rad);
    float s=sin(rad);
    vec3 delta=pos-origin;
    return vec3(
        c*delta.x+s*delta.z+origin.x,
        pos.y,
        s*delta.x-c*delta.z+origin.z
    );
}
vec3 rotateZ(vec3 pos,vec3 origin,float rad){
    float c=cos(rad);
    float s=sin(rad);
    vec3 delta=pos-origin;
    return vec3(
        delta.x*c-delta.y*s+origin.x,
        delta.x*s+delta.y*c+origin.y,
        pos.z
    );
}
// 投影坐标系
vec2 projectionCoord(in vec2 coord, in float scale) {
  return scale * 2. * (coord - 0.5 * iResolution.xy) / min(iResolution.x, iResolution.y);
}

// 坐标轴
vec4 AxisHelper(in vec2 coord, in float axisWidth, in vec4 xAxisColor, in vec4 yAxisColor) {
          vec4 color = vec4(0, 0, 0, 0);
          float dx = dFdx(coord.x) * axisWidth;
          float dy = dFdy(coord.y) * axisWidth;
          if(abs(coord.x) < dx) {
            color = yAxisColor;
          } else if(abs(coord.y) < dy) {
            color = xAxisColor;
          }
          return color;
}
        

float SDFSphere(vec3 p){
	return length(p-SPHERE_POS)-SPHERE_RADIUS;
}
vec3 rayDir(vec2 coord){
    return normalize(vec3(coord,0)-CAMERA_POS);
}

// 计算球体的法线
vec3 SDFNormal(in vec3 p) {
  const float h = 0.0001;
  const vec2 k = vec2(1, -1);
  return normalize(k.xyy * SDFSphere(p + k.xyy * h) +
    k.yyx * SDFSphere(p + k.yyx * h) +
    k.yxy * SDFSphere(p + k.yxy * h) +
    k.xxx * SDFSphere(p + k.xxx * h));
}

vec3 calcNormal2(in vec3  p) // for function f(p)
{
    const float h = 0.0001;      // replace by an appropriate value
    #define ZERO (min(iFrame,0)) // non-constant zero
    vec3 n = vec3(0.0);
    for( int i=0; i<4; i++ )
    {
        vec3 e = 0.5773*(2.0*vec3((((i+3)>>1)&1),((i>>1)&1),(i&1))-1.0);
      //  n += e*map(pos+e*h).x;
    }
    return normalize(n);
}
vec3 rayMarch(vec2 coord){
	float d0=0.;
	vec3 rd=rayDir(coord);
	vec3 color=vec3(0);
	for(int i=0;i<MAX_STEPS;i++){
		vec3 p=CAMERA_POS+rd*d0;
		float d1=SDFSphere(p);
		d0+=d1;
		if(d1<0.01){
		   vec3 n=SDFNormal(p);
		   vec3 lightDir=normalize(LIGHT_POS-p);
		   float c=clamp(dot(n,lightDir),0.,1.);
			
		   color=vec3(1,0,0)*c;
		   break;
		}
		if(d0>MAX_DIST){
			break;
		}
	
	}
	
	return color;
}

// 2D Random
float random (vec2 st) {
    return fract(sin(dot(st, vec2(12.9898,78.233)))
                 * 43758.5453123);
}

// 2D Noise based on Morgan McGuire @morgan3d
// https://www.shadertoy.com/view/4dS3Wd
float noise (vec2 st) {
    vec2 i = floor(st);
    vec2 f = fract(st);

    // Four corners in 2D of a tile
    float a = random(i);
    float b = random(i + vec2(1.0, 0.0));
    float c = random(i + vec2(0.0, 1.0));
    float d = random(i + vec2(1.0, 1.0));

    // Smooth Interpolation

    // Cubic Hermine Curve.  Same as SmoothStep()
    vec2 u = f*f*(3.0-2.0*f);
    // u = smoothstep(0.,1.,f);

    // Mix 4 coorners percentages
    return mix(a, b, u.x) +
            (c - a)* u.y * (1.0 - u.x) +
            (d - b) * u.x * u.y;
}
vec2 hash( vec2 p )
{
	p = vec2( dot(p,vec2(127.1,311.7)),
			 dot(p,vec2(269.5,183.3)) );
	return -1.0 + 2.0*fract(sin(p)*43758.5453123);
}
float noise12( in vec2 p )
{
	const float K1 = 0.366025404; // (sqrt(3)-1)/2;
	const float K2 = .211324865; // (3-sqrt(3))/6;
	
	vec2 i = floor( p + (p.x+p.y)*K1 );
	
	vec2 a = p - i + (i.x+i.y)*K2;
	vec2 o = (a.x>a.y) ? vec2(1.0,0.0) : vec2(0.0,1.0);
	vec2 b = a - o + K2;
	vec2 c = a - 1.0 + 2.0*K2;
	
	vec3 h = max( 0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 );
	
	vec3 n = h*h*h*h*vec3( dot(a,hash(i+0.0)), dot(b,hash(i+o)), dot(c,hash(i+1.0)));
	
	return dot( n, vec3(70.0) );
}
float fbm(vec2 uv)
{	
	float f;
	mat2 m = mat2( 1.6,  1.2, -1.2,  1.6 );
	f  = 0.5000*noise12( uv ); uv = m*uv;
	f += 0.2500*noise12( uv ); uv = m*uv;
	f += 0.1250*noise12( uv ); uv = m*uv;
	f += 0.0625*noise12( uv ); uv = m*uv;
	f = 0.5 + 0.5*f;
	return f;
}
float segment(vec2 uv,vec2 s,vec2 e,float lineWidth,float b){
  float halfLineWidth=lineWidth*.5;
  vec2 delta=e-s;
  vec2 p=uv-s;
  float t=clamp(dot(p,delta)/dot(delta,delta),0.,1.);
  float dist=length(p-t*delta);

  return 1.-smoothstep(halfLineWidth,halfLineWidth+b,dist);
}
float rect(vec2 uv,vec2 center,vec2 size){
   vec2 d=abs(uv-center)-size;
   return step(length(max(d,0.))+min(max(d.x,d.y),0.),0.);
}
float sdRect(vec2 uv,vec2 p,vec2 size){
    vec2 d=abs(uv-p)-size;
    return length(max(d,0.))+min(max(d.x,d.y),0.);
}
float circle(vec2 uv,vec2 c,float r,float b){
   float len=length(uv-c);
   float bb=b>0.?b*0.5:0.;
   return 1.-smoothstep(r-bb,r+bb,len);
}     
float strokeCircle(vec2 uv,vec2 c,float r,float lineWidth,float b){
   float halfLineWidth=lineWidth*.5;
   float len=length(uv-c);
   float bb=b>0.?b*0.5:0.;
   return smoothstep(r-halfLineWidth-b,r-halfLineWidth,len)-smoothstep(r+halfLineWidth,r+halfLineWidth+bb,len);
}   
float random(float x){
   return abs(fract(143.45454*sin(x)));
}

vec4 color_blend(vec4 source,vec4 dest){
   float ca=source.a+dest.a*(1.-source.a);
  return vec4((source.rgb*source.a+dest.rgb*dest.a*(1.-source.a)),ca);
   //return vec4((source.rgb*source.a+dest.rgb*dest.a*(1.-source.a))/ca,ca);
}

vec4 ripple(vec2 uv,vec2 p,float r,float num,vec3 color){
 vec4 col=vec4(0);
 float lineWidth=r/(num+2.);

 float t=fract(time*0.5);
  for(float i=0.;i<num;i++){
	float ratio=(i+1.)/num;
	float ct=(t+ratio)>1.?(t+ratio)-1.:t+ratio;
	float cr=r*ct;
	float alpha=1.-ct;
	float ret=strokeCircle(uv,p,r+cr,lineWidth,0.);
	 if(ret>0.){
	  col=ret*color_blend(vec4(color,alpha),col);
	}  
	//col+=vec4(color.rgb,alpha)*ret;	
  }
	
  if(circle(uv,p,r*0.5,0.2)>0.){
	col=color_blend(vec4(color,1),col);
  }
  //col+=vec4(color.rgb,1.)*circle(uv,vec2(0),r*0.8,0.);
   return col;
}

vec4 ring(vec2 uv,vec2 p,float r,float num,vec3 color){
  vec4 col=vec4(0);
  float t=fract(time*0.2544);

  for(float i=0.;i<num;i++){
    float ratio=(i+1.)/num;
    float ct=(t+ratio)>1.?(t+ratio)-1.:t+ratio;
    float cr=r*ct;
    float alpha=1.-ct;
    float ret=circle(uv,p,r+cr,0.);
       if(ret>0.){
        col=ret*color_blend(vec4(color,alpha),col);
       // col.rgb=col.rgb*col.a;
      }
  }
  return col;
}
mat3 setCamera(vec3 ro, vec3 target, float cr) {
    vec3 z = normalize(target - ro);
    vec3 up = normalize(vec3(sin(cr), cos(cr), 0));
    vec3 x = cross(z, up);
    vec3 y = cross(x, z);
    return mat3(x, y, z);
}

vec4 scenery(vec2 uv,vec2 p,float r,float num){
  vec4 col=vec4(0);
  float t=fract(time);

  vec2 n = p;
   vec2 pos;
  float rd=sdRect(uv,p,vec2(r));
  if(rd<0.){
    vec2 m=((uv-p)+r)*2.-1.;  
 //   m.x+=time;
 
    float d=length(m);
   
    if(m.y<0.2){
       vec3 origin=vec3(10,1,100);
       mat3 mat=lookAt(origin,vec3(0,-1,0));
       vec3 dir=mat*vec3(m,-1);
       dir.z*=40.;
       vec2 k=origin.xz+dir.xz*(10.-origin.y)/dir.y;
       float a=noise(0.1*k+time);
       col.rgb+=mix(vec3(0.3,0.7,1),vec3(0,0.6,0.9),smoothstep(0.4,0.8,a));
       col.rgb+=0.3*vec3(1)*smoothstep(1.,0.,length(dir.xy));
    } 
    else if(abs(m.y-0.3*noise(m*2.))<0.2){
      col.rgb=vec3(.2);
    }else{
       vec3 origin=vec3(0,1.,2);
       mat3 mat=lookAt(origin,vec3(0,.6,0));
       vec3 dir=mat*vec3(m,-1);
       vec2 k=origin.xz+dir.xz*(100.-origin.y)/dir.y;
    

       float a=fbm(0.01*k+time*0.02);
       vec3 c1=mix(vec3(0.2,0.7,1),vec3(1),smoothstep(0.3,1.,a*step(0.,m.y-0.2)));
 
       col.rgb=c1+vec3(1)*smoothstep(1.,0.,length(m));
   

      if(dir.z<0.){
          //col.rgb=vec3(1,0,0);
      }
    }

  }
	
   return col;
}

#define PI2 3.1415926*2.
vec4 radar(vec2 uv,vec2 p,float r,float num,vec3 color){
  vec4 col=vec4(0);
  vec2 p2=uv-p;
  float t=fract(time*0.2);
  float dx=dFdx(uv.x);
  float lw=dx*3.; 
  float theta=t*PI2;
  vec2 scan=p+vec2(cos(theta),sin(theta))*(r-lw);
  col+=vec4(1)*strokeCircle(uv,p,r,lw,0.);
  col+=vec4(1)*strokeCircle(uv,p,r*0.66,lw,0.);
  col+=vec4(1)*strokeCircle(uv,p,r*0.33,lw,0.);
  col+=vec4(1)*segment(uv,vec2(p.x-r,p.y),vec2(p.x+r,p.y),lw,0.);
  col+=vec4(1)*segment(uv,vec2(p.x,p.y-r),vec2(p.x,p.y+r),lw,0.);

  float t2=segment(uv,p,scan,lw,0.);
  float gradient=0.;
  if (length(p2)<r){
    float angle = mod( theta - atan(p2.y, p2.x),PI2);
    gradient =sqrt(clamp(1. - angle, 0., 1.)*0.5);
  }
  t2=gradient + t2;
  if(t2>0.){
      col=vec4(color*t2,1.);
  }	
  return col;
}

void mainImage(out vec4 fragColor,vec2 fragCoord){
   vec2 uv=projectionCoord(fragCoord,1.);
  uv*=2.; 
  vec4 color = vec4(0);
 // color.rgb+=vec3(1,0,0)*segment(uv,vec2(0,1.5),vec2(2.,1.5),0.4,0.2);
  color+=ripple(uv,vec2(-1.2,0),0.3,3.,mix(vec3(1.,0,0),vec3(1,0,1),abs(sin(time))));	
  color+=scenery(uv,vec2(0),0.6,4.);
  color+=ring(uv,vec2(1.2,0),0.3,4.,mix(vec3(1.,1,0),vec3(0,1,1),abs(sin(time))));
  color+=radar(uv,vec2(2.5,0),0.45,4.,vec3(1,0,1));
  
  fragColor = color;
  
}
  
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式任务调度框架XXL-JOB

1、概述 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 官方文档&#xff1a;https://www.xuxueli.com/xxl-job/#%E4%BA%8C%E3%80%81%E5%BF%AB%E9%80%9F%E…

安卓主板MT8390(Genio 700)_MTK联发科Linux开发板方案

MediaTek Genio 700 &#xff08;MT8390&#xff09;是一款高性能的边缘 AI 物联网平台&#xff0c;专为智能家居、互动零售、工业与商业应用而设计。提供快速响应的边缘计算能力、先进的多媒体功能、广泛的传感器和连接方式&#xff0c;且支持多任务操作系统。 MT8390安卓核心…

Java代码示例:演示多态特性及子类方法重写(day17)

java代码里面体现多态的特点&#xff1a; 第一步创建一个父类father&#xff0c; 然后创建子类subclasses&#xff0c; 最后创建一个DemoMulti, 上面的父类特有的方法不是私有的&#xff0c;因此子类能够继承。 新建一个父类方法Father 创建子类subclasses 在下面的代码中…

Aurora8b10b(2)上板验证

文章目录 前言一、AXI_Stream数据产生模块二、上板效果总结 前言 上一篇内容我们已经详细介绍了基于aurora8b10b IP核的设计&#xff0c;本文将基于此进一步完善并且进行上板验证。 设计思路及代码思路参考FPGA奇哥系列网课 一、AXI_Stream数据产生模块 AXIS协议是非常简单的…

单片机中的RAM vs ROM

其实&#xff0c;单片机就是个小计算机。大计算机少不了的数据存储系统&#xff0c;单片机一样有&#xff0c;而且往往和CPU集成在一起&#xff0c;显得更加小巧灵活。 直到90年代初&#xff0c;国内容易得到的单片机是8031&#xff1a;不带存储器的芯片&#xff0c;要想工作&a…

Linux网络编程一(协议、TCP协议、UDP、socket编程、TCP服务器端及客户端)

文章目录 协议1、分层模型结构2、网络应用程序设计模式3、ARP协议4、IP协议5、UDP协议6、TCP协议 Socket编程1、网络套接字(socket)2、网络字节序3、IP地址转换4、一系列函数5、TCP通信流程分析 第二次更新&#xff0c;自己再重新梳理一遍… 协议 协议&#xff1a;指一组规则&…

【tensorflow框架神经网络实现鸢尾花分类—优化器】

文章目录 1、前言2、神经网络参数优化器2.1、SGD2.2、SGDM2.3、Adagrad2.4、RMSProp2.5、Adam 3、实验对比不同优化器4、结果对比 1、前言 此前&#xff0c;在【tensorflow框架神经网络实现鸢尾花分类】一文中使用梯度下降算法SGD&#xff0c;对权重 w w w和偏置 b b b进行更新…

STM32学习和实践笔记(4):分析和理解GPIO_InitTypeDef GPIO_InitStructure (c)

第二个成员变量是GPIOSpeed_TypeDef GPIO_Speed&#xff1b;也与int a一样同理。 GPIOSpeed_TypeDef是一个枚举类型&#xff0c;其定义如下&#xff1a; typedef enum { GPIO_Speed_10MHz 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; #define IS_GPI…

网络协议学习——HTTPS

目录 ​编辑 一&#xff0c;认识HTTPS 二&#xff0c;加密方式 1&#xff0c;对称式加密 2&#xff0c;非对称式的加密 3&#xff0c;数据指纹&#xff08;数据摘要&#xff09; 4&#xff0c;数据签名 三&#xff0c;HTTPS的工作原理 实现方式 数字证书 一&#xff0c…

FFmpeg获取视频详情

话不多说&#xff0c;直接上代码&#xff1a; pom依赖&#xff1a; <!--视频多媒体工具包 包含 FFmpeg、OpenCV--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.3</versi…

day4|gin的中间件和路由分组

中间件其实是一个方法&#xff0c; 在.use就可以调用中间件函数 r : gin.Default()v1 : r.Group("v1")//v1 : r.Group("v1").Use()v1.GET("test", func(c *gin.Context) {fmt.Println("get into the test")c.JSON(200, gin.H{"…

vue项目入门——index.html和App.vue

vue项目中的index.html文件 在Vue项目中&#xff0c;index.html文件通常作为项目的入口文件&#xff0c;它包含了Vue应用程序的基础结构和配置。 该文件的主要作用是引入Vue框架和其他必要的库&#xff0c;以及定义Vue应用程序的启动配置。 import Vue from vue import App …

论文浅尝 | cTBLS:使用对话表格增强大型语言模型

笔记整理&#xff1a;金日辉&#xff0c;东南大学硕士&#xff0c;研究方向为表格模态数据相关的处理任务 链接&#xff1a;https://arxiv.org/pdf/2303.12024.pdf 1、动机 让人工智能对话具备多模态能力&#xff0c;可以拓宽人类与此类系统的对话范围。多模态会话人工智能面临…

【Linux】查看某个进程的tcp全连接队列长度

TCP三次握手成功后,会把连接放到全连接队列里,等待服务器端accept后移除。 如下图所示,图片转自:https://zhuanlan.zhihu.com/p/547279481 下图转自博客:https://zhuanlan.zhihu.com/p/340016138 TCP三次握手过程中,第一次握手server收到client的syn后,内核会把该连接存…

面向C++程序员的Rust教程(二)

先序文章请看&#xff1a; 面向C程序员的Rust教程&#xff08;一&#xff09; 所有权与移动语义 要说Rust语言跟其他语言最大的区别&#xff0c;那笔者觉得非数这个所有权和移动语义莫属。 深浅复制 对于绝大多数语言来说&#xff0c;变量/对象之间的赋值通常都是复制语义。…

Spring中BeanFactoryPostProcessor详解

目录 功能与作用 使用案例 spring提供的常见BeanFactoryPostProcessor 1.EventListenerMethodProcessor 2.BeanDefinitionRegistryPostProcessor 功能与作用 使用案例 spring提供的唯一BeanDefinitionRegistryPostProcessor 总结 功能与作用 参考BeanFactoryPostProce…

Kaggle:收入分类

先看一下数据的统计信息 import pandas as pd # 加载数据&#xff08;保留原路径&#xff0c;但在实际应用中建议使用相对路径或环境变量&#xff09; data pd.read_csv(r"C:\Users\11794\Desktop\收入分类\training.csv", encodingutf-8, encoding_errorsrepl…

蓝桥杯练习笔记(十六)

蓝桥杯练习笔记&#xff08;十六&#xff09; 一、 输入示例&#xff1a; 3 1 2 1 11 3 4 74 5 3这是用到了m叉树的结论&#xff1a;对于某个m叉树的一个节点n&#xff0c;假如其有完整子树&#xff0c;则其左子节点l为l(n-1)m2&#xff0c;右子节点r为rmn1。基于此我们可以快…

SpringBoot+thymeleaf完成视频记忆播放功能

一、背景 1)客户要做一个视频播放功能,要求是系统能够记录观看人员在看视频时能够记录看到了哪个位置,在下次观看视频的时候能够从该位置进行播放。 2)同时,也要能够记录是谁看了视频,看了百分之多少。 说明:由于时间关系和篇幅原因,我们这里只先讨论第一个要求,第…

如何使用极狐GitLab 启用自动备份功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何极狐GitLab 自…