用shader写伪3D之一
用shader写伪3D,其实是件非常棒的事情,如果用用纯3D数学只在fragment shader中实现,那么要经过顶点
数据模拟、切线空间的计算、投影、遮挡处理、阴影等一系列有点繁琐的问题,但最关键的问题是这是在
fragment中啊,每个像素都要~~~~亲!你耗得起吗?~~~~~~
- 说说伪3D
当无法满足于性能时,于是伪3D特效就有了,它的用处在游戏中非常的广;当然伪3D包括伪3D光照、伪3D场景、伪逻辑、伪物理特性等等…………………..
- 它的优点是:
(1)代码量可以非常的简洁。
(2)性能可以无限的提升。
(3)视觉抽象强。
(4)用途广,尤其是在游戏和广告中等。 - 它的缺点:
(1)没真3D那么数学性强,可以逻辑上的补充。
(2)后期代码的难以维护。
(3)可能要大量的用到修改和经验值。
(4)当然要知道每行运行代码的效果,每个像素的运算的效果。
呵呵,可以哟
其实说白了,优缺点是人为的,自己写出思想来,写出个性来,写出自己的style来,神马都是浮云。
写shader这个东西,如果不多变的换角度去写的话,想实现很炫很复杂的算法,都很难下手。
当然依国情考虑,当下都接受过应试教育的思想,也是很难有什么角度的,所以市面上一切抄袭就来了。
- 我们先看一下图
这是一张没任何模型灯光的图,
这也是哦,不过你会看到阴影。 看到看头,很不想看到结尾
注:这是带有伪动态光照的效果那我们还是看看代码吧:
这是它的代码地址http://www.glslsandbox.com/e#24261.0
// by 834144373 这是qq和twitter
//specular light 取得一个高光名字
#ifdef GL_ES
precision mediump float;
#endif
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
void main( void ) {
vec2 pos = ( gl_FragCoord.xy / resolution.xy );// + mouse / 4.0;
pos = pos*2. -vec2(1.); //把远点移到屏幕中间
pos.y = fract(pos.y*5.); //y轴上下5个格子
pos.y +=(-0.4+0.4*sin(time)); //伪动态光照y
pos.x +=(0.2+ 0.3*cos(time)); //伪动态光照x
float d =1.1 - length(pos); //伪光照效果
vec3 color = vec3(0.12,0.55,0.4); //基础颜色
color *= d; //实行伪光照混合效果
gl_FragColor = vec4(color , 1.0 );
}
哈哈,有盖帘了吧
这很简单吧,这示列代码非常的少,它能显示的效果也可以哟,怎一个伪字了得。
不过伪的原理可以通过一些常见的视觉来模拟。当然要必备各种函数的运用,函数的构造。
发挥得当。