Shader toy (顺手写两个Gyro)(纯代码写3D)
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:–马丹,不知道抄啊!要养成从小抄袭的良好习惯。)
//标准数学中的旋转矩阵
vec3 rotate_y(vec3 v, float angle)//y轴旋转
{
float ca = cos(angle); float sa = sin(angle);
return v*mat3(
ca, .0, -sa,
.0,1.0, .0,
sa, .0, ca);
}
vec3 rotate_x(vec3 v, float angle)//x轴旋转
{
float ca = cos(angle); float sa = sin(angle);
return v*mat3(
1.0, .0, .0,
.0, ca, -sa,
.0, sa, ca);
}
vec3 rotate_z(vec3 v,float angle){//z轴旋转 这儿是我有益写上的,就用不上节奏了
float ca = cos(angle),sa = sin(angle);
return v*mat3(
ca,-sa,0.,
sa, ca,0.,
0., 0.,0.
);
}
//当然对于程序来说。还有更简的旋转写法。假设你经历过。。。
。。
所以你用的时候一定要注意了。让物体旋转的条件是鼠标mouse为变量,以哪个轴旋转
p假设看不懂就当做一条射线向量,我们这是在旋转它。就如gif上鼠标晃来晃去那样。
(哎。怪我罗!
赶快在这儿补补http://blog.csdn.net/baidu_26153715/article/details/46510703 3D基础实现篇。马丹,我都还没找到这样解析shadertoy上 三D,还是中文易懂不要钱的文章)
Gyro 背景之谜
能够细致从图中看出。一个背景是黑的,一个背景有点蹊跷,那么有点蹊跷是怎么实现的?col = textureCube(iChannel0,pp).rgb;
//就是这么实现的。pp为镜头向外射出的单位向量,这个就不须要想吧。
晋级技术
- Gyro 初步假光照,试探光照反应
col = vec3(max(0.,dot(nDir,-normalize(vec3(0.,1.,1.)))));
能够看到初步的光照反应是成立的。
最后用到经常使用的这个方案,这是最后加入上去的。
//fork diffuse
diff = 0.5*max(0.,dot(nDir,normalize(vec3(0.,1.,0.))))+0.5;
- Gyro 折射、透明、其他效果
factor = (1.- iMouse.y/iResolution.y)*0.1;
factor = pow(factor,1.1);
ref = normalize(reflect(pp,nDir));
fra0 = normalize(refract(pp,nDir,iMouse.y/iResolution.y));
fra1 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+factor);
fra2 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+2.*factor);
//col = nDir;
//fork diffuse
diff = 0.5*max(0.,dot(nDir,normalize(vec3(0.,1.,0.))))+0.5;
//custom fresnel
fresnel = pow(1.-max(0.,dot(pp,nDir)),2.);
refcol = textureCube(iChannel0,ref).rgb;
//tone-mapping
refcol /= vec3(1.)+refcol;
//fracol = textureCube(iChannel0,fra).rgb/1.5;
vec3 fracol = vec3(
textureCube(iChannel0,fra0).r,
textureCube(iChannel0,fra1).g,
textureCube(iChannel0,fra2).b
);
//Luminance
luminance = dot( fracol, vec3(0.22, 0.707, 0.071));
fracol *= diff*luminance;
//gamma
fracol = pow(fracol,vec3(1.3));
col = mix(fracol,refcol,fresnel);
//tone
col *= 2.3*vec3(1.1,1.1,1.);
//col = vec3(diff);
从代码片段能够看出。我用到了fresnel来混合折射与反射效果,当中Luminance来计算折射亮度,其他效果你懂得。
Gyro 折射率这种调节
factor = (1.- iMouse.y/iResolution.y)*0.1;
factor = pow(factor,1.1);
ref = normalize(reflect(pp,nDir));
fra0 = normalize(refract(pp,nDir,iMouse.y/iResolution.y));
fra1 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+factor);
fra2 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+2.*factor);
这儿的iMouse.y/iResolution.y作用 能够鼠标上下滑动来调节折射率因子。
vec3 fracol = vec3(
textureCube(iChannel0,fra0).r,
textureCube(iChannel0,fra1).g,
textureCube(iChannel0,fra2).b
);
这儿就是经典的rgb三通道简单位移实现折射产生的散色想象,当然你能够自己发明……
Shadertoy Gyro 代码终于总结
这个就是实现一款简单3D的秘密,,,当然这是基于fragment shader直接实现的。。。
//thx for shadertoy give me a more interesting world
//The Transparent Gyro made by 834144373zhu
//https://www.shadertoy.com/view/MlfXz7
/////////////////////////////////////////////////
#define time iGlobalTime
vec3 rotate_y(vec3 v, float angle)
{
float ca = cos(angle); float sa = sin(angle);
return v*mat3(
ca, .0, -sa,
.0,1.0, .0,
sa, .0, ca);
}
vec3 rotate_x(vec3 v, float angle)
{
float ca = cos(angle); float sa = sin(angle);
return v*mat3(
1.0, .0, .0,
.0, ca, -sa,
.0, sa, ca);
}
vec3 rotate_z(vec3 v,float angle){
float ca = cos(angle),sa = sin(angle);
return v*mat3(
ca,-sa,0.,
sa, ca,0.,
0., 0.,0.
);
}
//distance function
float toSphere(in vec3 p){
p = rotate_y(p,-time*0.5);
p.y += 0.2;
return length(pow(abs(p),vec3(.7,0.68,0.4)))-1.5;
//you can try this another DE vertion
//return length(pow(abs(p),vec3(.7,0.68,0.4))-vec3(.6,0.35,0.4))-1.;
}
float toPlane( vec3 p )
{
return p.y;
}
//map the objects and return the distance
float map(in vec3 p){
return toSphere(p);
}
//the object's noraml
vec3 normal(in vec3 p){
vec2 offset = vec2(0.01,0.);
vec3 nDir = vec3(
map(p+offset.xyy)-map(p-offset.xyy),
map(p+offset.yxy)-map(p-offset.yxy),
map(p+offset.yyx)-map(p-offset.yyx)
);
return normalize(nDir);
}
//ray-marching the object and return the distance
float raymarching(in vec3 pos,in vec3 p){
float d = 0.;
float distance = 1.;
for(int i = 0;i<64;++i){
distance += d;
vec3 raysphere = pos + distance*p;
d = map(raysphere);
if(d<0.02 )break;
};
return distance;
}
/*vec3 thenewp (in vec3 pos,in vec3 p,in float an){
vec3 dian = vec3(0.);
vec3 z = normalize(dian-pos);
vec3 x = normalize(cross(z,vec3(sin(an),cos(an),0.)));
vec3 y = normalize(cross(z,x));
mat3 mat = mat3(x,y,z);
return p*mat;//;p.x*x+p.y*y+p.z*z;
}
*/
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 mouse = iMouse.xy/iResolution.xy*vec2(5.,0.);
vec2 uv = fragCoord.xy / iResolution.xy;
uv = uv*2.-1.;
uv.x *= iResolution.x/iResolution.y;
vec3 p = normalize(vec3(uv,2.));
//camera
vec3 pos = vec3(0.,0.,-5.);
pos = rotate_x(pos,mouse.y);
pos = rotate_y(pos,mouse.x);
//the new p
//vec3 pp = thenewp(pos,p,0.);
vec3 pp;
//pp = rotate_x(p,mouse.y);
pp = rotate_y(p,mouse.x);
vec3 col = vec3(0.);
float d = raymarching(pos,pp);
float diff,fresnel,luminance,factor;
vec3 nDir,ref, fra0,fra1,fra2;
vec3 refcol,fracol;
if(d<40.){
nDir = -normal(pos+d*pp);
if(dot(pp,nDir) > 0.){
factor = (1.- iMouse.y/iResolution.y)*0.1;
factor = pow(factor,1.1);
ref = normalize(reflect(pp,nDir));
fra0 = normalize(refract(pp,nDir,iMouse.y/iResolution.y));
fra1 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+factor);
fra2 = normalize(refract(pp,nDir,iMouse.y/iResolution.y)+2.*factor);
//col = nDir;
//fork diffuse
diff = 0.5*max(0.,dot(nDir,normalize(vec3(0.,1.,0.))))+0.5;
//custom fresnel
fresnel = pow(1.-max(0.,dot(pp,nDir)),2.);
refcol = textureCube(iChannel0,ref).rgb;
//tone-mapping
refcol /= vec3(1.)+refcol;
//fracol = textureCube(iChannel0,fra).rgb/1.5;
vec3 fracol = vec3(
textureCube(iChannel0,fra0).r,
textureCube(iChannel0,fra1).g,
textureCube(iChannel0,fra2).b
);
//Luminance
luminance = dot( fracol, vec3(0.22, 0.707, 0.071));
fracol *= diff*luminance;
//gamma
fracol = pow(fracol,vec3(1.3));
col = mix(fracol,refcol,fresnel);
//tone
col *= 2.3*vec3(1.1,1.1,1.);
//col = vec3(diff);
}
else{
discard;
}
}else{col = vec3(0.06);}
fragColor = vec4(col,1.0);
}
我非常不放心:你绝对没有看过这篇博客 http://blog.csdn.net/baidu_26153715/article/details/46510703,本片博客就是基于这篇基本3D实现技术,来实现其他深层次技术。
还有不放心的地方:你能够看这篇博客http://blog.csdn.net/baidu_26153715/article/details/45420029,来实现一些基本效果。
- 还有不放心的是:
下面就留给可爱的
Shader toy (顺手写两个Gyro)(纯代码写3D)的更多相关文章
- PureLayout,使用纯代码写AutoLayout
为iOS和OS X的自动布局最终的API -- 令人印象深刻的简单,非常强大. PureLayout延伸的UIView /NSView , NSArray,和NSLayoutConstraint与之后 ...
- 纯代码写UI的时候,如何指定style?
有的时候,需要使用纯代码实现Android UI,那么这个时候如何指定某个UI组件的样式呢? 一般来说,UI组件都有一些set方法可供使用,以调整一些UI属性,从而达到调整样式的目的. 但是,情况并非 ...
- 利用纯代码写出一个秒表表盘的方法 —— #DF
@interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...
- iOS高仿app源码:纯代码打造高仿优质《内涵段子》
iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...
- 可视化PK纯代码
简述 其实今天说的内容不仅仅局限于Qt,在很多其它语言或者框架中也适用,那就是 - 用可视化工具or文本编辑器?拖or不拖? 如果有人问我喜欢脱or不脱?我会毫不犹豫地说不脱,因为我比较矜持O(∩_∩ ...
- AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI
AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...
- swift 之 纯代码创建 cell
初学swift 但是网上只有很多swift用xib创建的cell,就算是有也不是我想要的.今天自己弄了一个不用xib纯代码写的,来上代码 博客地址: https://github.com/liguol ...
- ios - 纯代码创建collectionView
开始考虑好一点点时间,因为一般的都是用xib,或者storyboard来写的.这次用纯代码...废话较多请看 首先把storyboard干掉,工程里面的main干掉 由于干掉了storyboard则启 ...
- 纯代码 自己主动屏幕适配iPhone button
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2h1bmdlc2hpaHVhdGlhbg==/font/5a6L5L2T/fontsize/400/fil ...
随机推荐
- Ajax基础知识 浅析(含php基础语法知识)
1.php基础语法 后缀名为.php的文件 (1) echo 向页面中输入字符串 <?php 所有php相关代码都要写在<?php ?>这个标签之中 echo &q ...
- SD卡给MCU升级
目 录1. 前言2. 初识BootLoader2.1 百度百科的BootLoader2.2 BootLoader的简单理解2.3 BootLoader的作用3. BootLoader预备知识3.1 复 ...
- 接下来打算写一下visual stuido 2013使用git进行远端管理。
虽然我有了vs的账号,也vs2013开始已经可以进行远端的账户管理了,可是vs的版控毕竟有些依赖vs,想想还是用git吧 今天把这个环境的整套都弄地基本熟了.记录一下,算是一个小结.开始搭建系统框架
- NOIP2011提高组
D1T1.铺地毯 for循环 #include<iostream> #include<cstdio> #include<algorithm> using names ...
- 小Z爱序列(NOIP信(sang)心(bin)赛)From FallDream(粗制单调队列&单调栈的算法解析)
原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件 ...
- koa2-cors应答跨域请求实现
var koa = require('koa'); var app = new koa(); var router = require('koa-router')(); // CORS是一个W3C标准 ...
- python--jinja2
from jinja2 import Template # 创建一个Template模板去渲染它 s = "my name is {{mashiro}}" t = Template ...
- (4) python--seaborn
seaborn封装了matplotlib的一些风格,简单的介绍一下
- js-限制参与活动的范围(微信H5活动)
近期接到大连某个项目,一个H5的活动,其中有一个需求就是:这个活动的参与者仅限大连地区的用户 所以参考了微信API 得出的操作结果为: wx.ready(function() { wx.getLoca ...
- (转)Ubuntu安装g++-4.8
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install g++-4.8 ...