3D河豚鱼—OpenGL着色器(Shader)和GLSL程序
3D河豚鱼—OpenGL着色器(Shader)和GLSL程序
效果图
程序代码
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endifuniform vec3 pointers[1];
uniform vec2 resolution;
uniform float time;
// GLOBALS// position & direction
vec3 pos_finn, pos_eyes;
vec3 dir_eye;
mat3 dir_mouth;
vec3 dir_light;// coloring and animation
float heye, weye, beye;
float hmouth, cmouth;
float hfinns, htail;
float ttime;
float puff;
float tim_tail;
float ani_tail, ani_mouth;// colors
vec3 col_water = vec3(.3, .7, 1.);
vec3 col_fish_1 = vec3(1., 0.4, 0.2);
vec3 col_fish_2 = vec3(1., 0.8, 0.5);
vec3 col_eyes = vec3(0.7, 0.75, 1.);
float t = 20.;// marching
float maxdist = 5.;
float det = .001;// USEFUL LITTLE FUNCTIONS// 2D rotation
mat2 rot2D(float a) {a = radians(a);float s = sin(a);float c = cos(a);return mat2(c, s, -s, c);
}// Align vector
mat3 lookat(vec3 fw, vec3 up) {fw = normalize(fw);vec3 rt = normalize(cross(fw, normalize(up)));return mat3(rt, cross(rt, fw), fw);
}// Tile fold
float fmod(float p, float c) { return abs(c - mod(p, c * 2.)) / c; }// Smooth min
float smin(float a, float b, float k) {float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0);return mix(b, a, h) - k * h * (1.0 - h);
}// Smooth max
float smax(float a, float b, float k) {float h = clamp(0.5 + 0.5 * (a - b) / k, 0.0, 1.0);return mix(b, a, h) - k * h * (1.0 - h);
}// Torus
float sdTorus(vec3 p, vec2 t, vec3 s) {p = p.yxz * s;vec2 q = vec2(length(p.xz) - t.x, p.y);return length(q) - t.y;
}// PUFFY'S SURFACE DISPLACEMENT FUNCTIONSfloat thorns(vec3 p) {p.xz*=rot2D(-25.);float s1 = smoothstep(.0, .7, -p.x + p.z + .6);float s2 = smoothstep(.15, .3, length(p.xy)) * smoothstep(.0, .3, length(p.yz));float s3 = smoothstep(.0, .25, abs(p.y));p.x = fmod(atan(p.x, p.y), .31459 / 2.);p.y = fmod(atan(p.y, p.z), .31459 / 2.);p.xz*=rot2D(25.);return min(1., exp((-3. - puff*3.) * length(p.xy))) * s1 * s2 * s3;
}float spiral(vec3 p, vec3 c) {p.y = abs(p.y);vec3 pos = p;p = lookat(c, vec3(0., 1., 0.)) * p;float a = length(p.xy) * 35.;p.yx *= mat2(sin(a), cos(a), -cos(a), sin(a));float s=pow(abs(p.x), 2.) * smoothstep(0.7, 1., max(0., 1. - length(p.xy)));return s*smoothstep(0.,.05,pos.z+.1);
}float skin(vec3 pos) {pos *= 2.;vec3 p = pos;float m = 1000.;for (int i = 0; i < 7; i++) {p = abs(p) / dot(p, p) - .5;m = min(m, length(p));}return max(0., 1. - m) * (.1 + smoothstep(-pos.x + 1., 0., .4)) * .003;
}// PUFFY'S DE FUNCTIONS// Body partsfloat finn(vec3 p) {p.z += .27;p.x += .1;p.x *= 1.-pow(smoothstep(0., .2, -p.z),1.5)*.3;mat2 ro = rot2D(cos(tim_tail*4.+(p.x+p.z)*5.) *(3.-p.x*20.));p.xy *= ro;p.zy *= ro;float e = atan(p.x, p.z);float o = sin(e * 20.) * .003;float a = .19 - p.z * .15;float d = max(abs(p.y + o) - .005, length(p.xz) - a + cos(o * 500.) * .02);d = max(p.x - p.z*.6, d);d = max(p.z-p.x*.3, d);return d * .75;
}float tail(vec3 p) {p.z += .18;p.x += puff * .1;p.x += .45 + pow(smoothstep(0., .4, abs(p.z)), 5.) * .1;p.xy *= rot2D(cos(tim_tail + p.x * 5. + p.z * 3.) * 25.);float e = atan(p.x, p.z);float o = sin(e * 20.) * .003;float a = .27 - p.z * .15;float d = max(abs(p.y + o) - .003, length(p.xz) - a + cos(o * 500.) * .02);float d1 = smax(p.x - p.z * .2, d, .02);d1 = smax(-p.x * .4 + p.z, d1, .02);float d2 = smax(p.x + p.z * .3, d, .02);d2 = smax(-p.x * .3 - p.z, d2, .02);d = smin(d1, d2, .03);return d * .7;
}float finns(vec3 p) {float amp = (1. - puff * .3) * .15;float t = ttime*5. + sign(p.y) * .2;float l = length(p) * 2.;p.y = abs(p.y);p += normalize(pos_finn) * (.28 + puff * .05);p*=1.3;p = lookat(normalize(vec3(-1., -.0, -5.)), vec3(0., 1., 0.)) * p;amp *= (1. + length(p) * 5.);float a = .2 + cos(t + atan(p.y, p.z) * 2.) * amp * .5;float b = 1.2 + puff *1.5 + sin(t - amp) * amp;p.zx *= mat2(sin(a), cos(a), -cos(a), sin(a));p.yx *= mat2(sin(b), cos(b), -cos(b), sin(b));float e = atan(p.y, p.z);float o = sin(e * 20.) * .003;float r = .45 - smoothstep(1., 3., abs(e)) * .25;float d =max(abs(p.x + o) - .005, length(p.yz) - r + cos(p.z * 100.) * .01) * .9;d = max(-p.y - p.z * .5, d);d = max(p.z + p.y * .2, d);d = smin(d, length(p) - .04, .04);return d * .8;
}float mouth(vec3 p) {p *= dir_mouth;float mo = length(p.yz * vec2(.35 + ani_mouth * .1-p.z*2., 1.)) - .02 * (1. + ani_mouth * .4);return max(-p.x, mo);
}float body(vec3 p) {float m = smoothstep(0., 1.5, -p.x + 1.3) * .2;float s = smoothstep(0., 1.7, -p.x);p.z -= puff * .1;p.z -= smoothstep(0., p.z*.3 + p.x - .6 + ani_mouth * .1,-.1)*.05;p.y *= 1. + pow(abs(p.z - .2), 2.) * 1.5;p.z *= 1. - (p.x + .1) * .1;p.zy *= 1.+smoothstep(0.,.5,-p.x)*.3;float d = length(p*vec3(1.+smoothstep(0.,.5,-p.x+p.z)*.5,1.,1.4)) - .47 - s-puff*.12;p += vec3(.14 + puff * .0, .0, .2);p.x -= p.z*.5;p.z += puff * .1;d = smin(d, length(p * vec3(0.6, 1.2, 1.7)) - .55 + m, .2) + .1;d+=smoothstep(0.,.7,-p.x)*.05;return (d+.05) * .7;
}float eye(vec3 p) {float d = length(p) - .13;return d;
}// Main DE function
float de(vec3 p) {beye = 0.;heye = 0.;weye = step(0., p.y);hmouth = 0.;hfinns = 0.;htail = 0.;p.y *= 1.15;vec3 rp = p;p.y = abs(p.y);mat2 rotbod=rot2D(smoothstep(0., 1.3, -p.x + .2) * ani_tail * 25.);rp.xy *= rotbod;rp.zy *= rotbod;float t = ttime * 10.;p += sin(p * 20. + t) * .002;float fi = finn(rp);float fis = finns(rp);float ta = tail(rp);float mo = mouth(p);float sk = skin(rp);float res = (body(rp) - thorns(rp) * (.01 + puff * .1)) * .8 - sk;res += spiral(rp, -pos_eyes + vec3(0.1, 1., -0.3))*.4;rp.y = abs(rp.y);float eyeh = eye(rp + pos_eyes * .9);float eyes = eye(rp + pos_eyes);res = smax(res, -mo, .013);res = smin(res, eyes, .02);res = smin(res, eyeh, .035);res = smin(res, fis, .02);res = smin(res, fi, .02);res = smin(res, ta, .03);beye = abs(res - eyes);heye = 1.-step(.005, beye);hfinns = 1.-step(.005,abs(res-fi));hfinns = max(hfinns,1.-step(.005,abs(res-fis)));htail = 1.-step(.02, abs(res-ta));hmouth = 1.-step(.01, abs(res-mo));return res;
}// PUFFY'S COLORING FUNCTIONSvec3 color_eyes(vec3 p, vec3 n) {vec3 p1 = p + pos_eyes;vec3 p2 = p + vec3(pos_eyes.x, -pos_eyes.y, pos_eyes.z);vec3 l = p1;vec3 c = vec3(1.);p1 = lookat(dir_eye, vec3(0., 1., .5)) * p1;p2 = lookat(dir_eye, vec3(0., 1., -.5)) * p2;p1.y -= .01;p2.y += .01;c -= smoothstep(.07, .085, length(p1.xy) + 1. - weye) * (.4 + col_eyes * 1.5);c -= smoothstep(.07, .085, length(p2.xy) + weye) * (.4 + col_eyes * 1.5);c *= smoothstep(.03 + sin(atan(p1.x, p1.y) * 25.) * .02, .07, length(p1.xy) + 1. - weye);c *= smoothstep(.03 + sin(atan(p2.x, p2.y) * 25.) * .02, .07, length(p2.xy) + weye);return mix(c, -col_fish_1 - .2, smoothstep(.0, .0055, beye));
}vec3 color(vec3 p, vec3 n) {float c=.1+max(0.,p.x*3.);float th=pow(max(0.,.2-abs(thorns(p)))/.2,3.);vec3 col = mix(col_fish_1, col_fish_2, c);col=mix(col_fish_1, col, .3+th*.7);if (heye > 0.)col = color_eyes(p, n);if (hmouth > 0.)col = col_fish_2 - .03;if (hfinns > 0.)col = mix(col_fish_1, col_fish_2 + .15,smoothstep(.37, .5, length(p+vec3(0.,0.,.05)) - puff * .05));if (htail > 0.)col = mix(col_fish_1, col_fish_2 + .2,smoothstep(.6, .75, length(p) - puff * .1));return abs(col);
}// BACKGROUND AND FOREGROUND FRACTALfloat fractal(vec3 p) {p += cos(p.z * 3. + ttime * 4.) * .02;float depth = smoothstep(0., 6., -p.z + 5.);p *= .3;p = abs(2. - mod(p + vec3(0.4, 0.7, ttime * .07), 4.));float ls = 0.;float c = 0.;for (int i = 0; i < 6; i++) {p = abs(p) / min(dot(p, p), 1.) - .9;float l = length(p);c += abs(l - ls);ls = l;}return .15 + smoothstep(0., 50., c) * depth * 4.;
}// NORMALS AND LIGHTINGvec3 normal(vec3 p) {vec3 e = vec3(0.0, det * 2., 0.0);return normalize(vec3(de(p + e.yxx) - de(p - e.yxx),de(p + e.xyx) - de(p - e.xyx),de(p + e.xxy) - de(p - e.xxy)));
}float shadow(vec3 pos) {float sh = 1.0;float totdist = det * 30.;float d = 10.;for (int i = 0; i < 8; i++) {if (d > det) {vec3 p = pos - totdist * dir_light;d = de(p);sh = min(sh, 20. * d / totdist);totdist += d;}}return clamp(sh, 0.0, 1.0);
}float light(vec3 p, vec3 dir, vec3 n, float shw) {float dif = pow(max(0., dot(dir_light, -n)), 3.);float amb = pow(max(0., dot(dir, -n)), 3.);return dif * .7 * shw + amb * .2 + .15;
}// RAY MARCHING AND SHADINGvec3 march(vec3 from, vec3 dir) {vec3 odir = dir;vec3 p = from + dir * 2.;float fg = fractal(p + dir) * .55;vec3 col = vec3(0.);float totdist = 0.;float d;float v = 0.;cmouth = 1.;for (int i = 0; i < 80; i++) {p = from + totdist * dir;d = de(p);if (d < det || totdist > maxdist)break;totdist += d;v += max(0., .1 - d) / .1;}float fade = smoothstep(maxdist * .2, maxdist * .9, maxdist - totdist);float ref = 1.;float eyes_ref = heye;float shw = 1.;if (d < det * 2.) {p -= (det - d) * dir;vec3 n = normal(p);col = color(p, n) * (.1 + .9 * cmouth);shw = shadow(p);col *= light(p, dir, n, shw);from = p - det * dir * 3.;dir = reflect(dir, n);ref = fade * (.3 * cmouth + eyes_ref * .2);col = mix(col_water * .15, col, fade);}col *= normalize(col_water + 1.5) * 1.7;p = maxdist * dir;vec3 bk = fractal(p) * ref * col_water;float glow = pow(max(0., dot(dir, -dir_light)), 1.5+eyes_ref*1.5);vec3 glow_water = normalize(col_water+1.);bk += glow_water*(glow*(1.-eyes_ref*.7) + pow(glow, 8.) * 1.5) * shw * cmouth * ref;col += v * .06 * glow * ref * glow_water;col += bk + fg * col_water;return col;
}// MAINvoid main(void) {// Set globalsttime = mod(time, 600.);ani_mouth = sin(ttime * 6.);puff = -.03+.5*smoothstep(.945, .95, abs(sin(ttime * .1)))+ani_mouth*.04;pos_finn = normalize(vec3(0.35, -1, 0.));pos_eyes = vec3(-1., -1.1, 1.) * .12;//pos_eyes*=1.+vec3(-1.,1.,0.)*puff*.05;dir_light = normalize(vec3(-.3, 0.2, 1.));dir_mouth = lookat(normalize(vec3(-.4-puff*.1+ani_mouth*.03, 0., -1.)), vec3(0., 1., 0.));tim_tail = ttime * 2.;ani_tail = cos(tim_tail);// Pixel coordinatesvec2 uv = gl_FragCoord.xy / resolution.xy - .5;vec2 uv2 = uv;float ar = resolution.x / resolution.y;uv.x *= ar;// Cameravec2 mouse = (pointers[0].xy / resolution.xy - .5) * 4.;float tcam = (ttime+67.)*.05;float zcam = smoothstep(.7, 1., cos(tcam)) * 1.8 - .3;zcam -= smoothstep(.7, 1., -cos(tcam)) * 1.6;if (pointers[0].z < .1) mouse = vec2(sin(ttime * .15)*ar, zcam);vec3 dir = normalize(vec3(uv, .9));vec3 from = vec3(1., 0., -0.5 + mouse.y) * 1.25;from.xy *= rot2D(-mouse.x * 40.);dir = lookat(normalize(-from+vec3(sin(ttime*.5)*.3,cos(ttime*.25)*.1,0.)), vec3(0., 0., -1.)) * dir;// Eyes directiondir_eye = normalize(from);//dir_eye.x = max(dir_eye.x, pos_eyes.x - .5);dir_eye.y = min(abs(dir_eye.y), pos_eyes.y*sign(dir_eye.y)+.5*sign(dir_eye.y));dir_eye.z = min(dir_eye.z, pos_eyes.z - .5);// March and colorvec3 col = march(from, dir);col *= vec3(1.1, .9, .8);col += dot(uv2, uv2) * vec3(0., 0.6, 1.) * .8;// Output to screengl_FragColor = vec4(col, 1.);
}
3D河豚鱼—OpenGL着色器(Shader)和GLSL程序相关推荐
- opengl着色器shader介绍
1. Shader Shader其实就是一段执行在GPU上的程序,此程序使用OpenGL ES SL语言来编写.它是一个描述顶点或像素特性的简单程序.在opengles中常用的shader有两种:v ...
- OpenGL播放yuv数据流(着色器SHADER)-IOS(一)
OpenGL播放yuv数据流(着色器SHADER)-IOS(一) 和windows平台的类似,只是用object-c编写的,着色器语言shader,rgb转yuv有些不同,具体看代码注释. //.h ...
- OpenGL播放yuv数据流(着色器SHADER)-windows(一)
OpenGL播放yuv数据流(着色器SHADER)-windows(一) 在写这篇文章之前首先要感谢老雷,http://blog.csdn.net/leixiaohua1020/article/det ...
- OpenGL 2D贴图texture与着色器Shader
OpenGL 2D贴图texture与着色器Shader 运行效果 利用GLSL操作shader着色器实现平移.纹理与顶点颜色的叠加处理: 利用GLSL操作shader着色器实现平移.旋转等操作: 定 ...
- OpenGL入门(三)之着色器Shader
本系列文章为Learn OpenGL个人学习总结! OpenGL入门(一)之认识OpenGL和创建Window OpenGL入门(二)之渲染管线pipeline,VAO.VBO和EBO OpenGL入 ...
- OpenGL 着色器基础
Instagram,Snapchat,Photoshop. 所有这些应用都是用来做图像处理的.图像处理可以简单到把一张照片转换为灰度图,也可以复杂到是分析一个视频,并在人群中找到某个特定的人.尽管这些 ...
- OpenGL着色器GLSL
OpenGL着色器 OpenGL着色器简介 GLSL 数据类型 向量 输入与输出 顶点着色器 片段着色器 Uniform 更多属性 我们自己的着色器类 从文件读取 OpenGL着色器简介 着色器(Sh ...
- opengl 着色器
Opengl 着色器 文章目录 Opengl 着色器 前言 一.GLSL 二.使用步骤 效果 前言 着色器(Shader)是运行在GPU上的小程序.这些小程序为图形渲染管线的某个特定部分而运行.从基本 ...
- OpenGL着色器透视变换实例-通过旋转平移调试着色器
OpenGL 着色器新手样例 带透视变换和旋转平移缩放 OpenGL着色器样例 - 最简单的顶点着色器 + 片元着色器 头文件和宏定义 全局变量部分 读取着色器 从文本中读取着色器代码 初始化着色器 ...
最新文章
- Python设计模式-建造者模式
- 基于神经网络的混合计算(DNC)-Hybrid computing using a NN with dynamic external memory
- 当电路与艺术相结合,美的让人窒息!
- oracle rman 用户,对Oracle数据库进行RMAN备份的Oracle数据库用户权限
- 《『若水新闻』客户端开发教程》——10.代码编写(2)
- Springboot之GetMapping参数
- 人脸对齐(五)--ESR算法
- TCP连接、Http连接与Socket连接
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
- mysql的关系表_MySQL表关系总结
- 低功耗电波钟的制作 - 电子设计竞赛
- 小葵花妈妈课堂开课了:《Runnable、Callable、Future、RunnableFuture、FutureTask 源码分析》
- 前端页面嵌入二维码,微信扫出现请点击右上角,选择在浏览器中打开的解决方法
- C_sharp-gives-OJ-background-test-data
- 数据可视化——图表类型选择
- Tiled2Unity报错处理办法
- Linux 学习路线图 #CSDN博文精选# #IT技术# #学习路线# #系统化学习#
- centos 磁盘重新分区操作实践
- 《算法竞赛入门经典》(第二版)代码及详细解释(持续更新!)
- Linux自动重启服务
热门文章
- esxi虚拟服务器网络搭建,小姜学网络(使用VMware ESXi 5.5搭建VMware虚拟化平台一)...
- win10驱动开发4——加载/卸载驱动
- ISE中FIFO IP核的Standard FIFO和First-word-Fall-Through模式的仿真比较
- 蓝桥杯试题 算法训练 Have You Ever Heard About the Word?
- 安霸Ambarella三款CV系列芯片对比--CV2S、CV22S、CV25S
- 【中科院信工所】-2021考研经验-记录一段每天都在思考如何学习的日子
- 对比深度学习十大框架
- iOS 中设置下划线失效不显示
- Linux 父进程子进程的进程分析
- 【FXCG】什么是风险?