您的位置:首页 > 其它

用shader写伪3D

2015-04-06 11:23 99 查看

用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 );

}


哈哈,有盖帘了吧

这很简单吧,这示列代码非常的少,它能显示的效果也可以哟,怎一个伪字了得。

不过伪的原理可以通过一些常见的视觉来模拟。当然要必备各种函数的运用,函数的构造。

发挥得当。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: