GLSL實現水面倒影

2021-06-27 19:56:07 字數 4492 閱讀 5592

使用兩相機,乙個master相機, 主要負責場景的渲染, 另乙個rtt相機, 和master相機建立為鏡面投影相機,用於在和master相機的縱向映象投影,從而獲取master投影場景的逆場景, 渲染到紋理,進行鏡面貼圖,實現水面的倒影效果。

效果如圖:

實現**(需要一張天空背景圖, 一張water法線圖):

vertex shader:

varying vec3 lightdir;

varying vec3 eyedir;

varying vec3 normal;

varying vec3 halfvec;

varying vec4 ambient, diffuse, specular;

attribute vec3 tangent;

uniform float _time;

uniform vec3 lightdir;

//傳入rtt相機模型投影矩陣,使用主要為不讓紋理跟隨主相機的變動而異常變動,

//可以使用gl_projectionmatrix * vvertex試試相應的效果,實驗時需要把fragshader中的coord.y=1.0-coord.y開啟;

uniform mat4 urttviewmatrix;

varying vec4 vrttvertex;

void main()

//切線空間;

vec3 _tangent = normalize(gl_normalmatrix * tangent);

vec3 _bnormal = normalize(cross(normal, _tangent));

lightdir.x = dot(lightdir, _tangent);

lightdir.y = dot(lightdir, _bnormal);

lightdir.z = dot(lightdir, normal);

lightdir = normalize(lightdir);

eyedir.x = dot(eyedir, _tangent);

eyedir.y = dot(eyedir, _bnormal);

eyedir.z = dot(eyedir, normal);

eyedir = normalize(eyedir);

halfvec = normalize(lightdir + eyedir);

gl_texcoord[0] = gl_multitexcoord0;

gl_texcoord[1].s = gl_texcoord[0].x + _time * 0.05;

gl_texcoord[1].t = gl_texcoord[0].y + _time * 0.05;

gl_position = ftransform();

}

fragment shader:

uniform sampler2d _basetex;

uniform sampler2d _normtex;

varying vec3 lightdir;

varying vec3 eyedir;

varying vec3 normal;

varying vec3 halfvec;

varying vec4 ambient, diffuse, specular;

varying vec4 vrttvertex;

void main()

gl_fragcolor = vec4(ambient.xyz * _color.xyz + diffuse.xyz * ldotn * _color.xyz

+ specular.xyz * hdotn, _color.a);

}

main程式:

//建立quad;osg::ref_ptrcreatequad(int _w, int _h)  

osg::ref_ptrcreaterttcamera(int x, int y, int w, int h)

osg::ref_ptrcreatecamera(int x, int y, int w, int h)

int main(int argc, char *argv)

osg::ref_ptrfragshader = new osg::shader(osg::shader::fragment);

if(!fragshader->loadshadersourcefromfile("water.frag"))

program->addshader(vertshader);

program->addshader(fragshader);

_m0->getorcreatestateset()->setattribute(program,1);

_m0->getorcreatestateset()->adduniform(new osg::uniform("_basetex", 0));

_m0->getorcreatestateset()->adduniform(new osg::uniform("_normtex", 1));

_m0->getorcreatestateset()->adduniform(new osg::uniform("_time", float(0.0)));//lightdir

_m0->getorcreatestateset()->adduniform(new osg::uniform("lightdir", osg::vec3f(100.0, 100.0, 100.0)));

_m0->getorcreatestateset()->adduniform(new osg::uniform("urttviewmatrix", osg::matrix::identity()));

viewer->setscenedata(_root);

viewer->setcameramanipulator(new osgga::trackballmanipulator);

viewer->getcamera()->setclearcolor(osg::vec4(0.8,0.8,0.7,1.0));

while(!viewer->done())

return 0;

}//建立天空盒, 半球型;osg::ref_ptrhalfsphere::createhalfsphere(osg::image *img, float radius)

vevertext.push_back(vetmp);

texvertex.push_back(_textmp);

}//重新組織點;

//法線陣列;

osg::ref_ptrnorarr = new osg::vec3array;

std::vector>::iterator it = vevertext.begin();

for(; it != vevertext.end(); )

}geom->setvertexarray(vearr);

std::vector>::iterator itt = texvertex.begin();

for(; itt != texvertex.end(); )

}geom->settexcoordarray(0,texarr);

//法線;

geom->setnormalarray(norarr);

geom->setnormalbinding(osg::geometry::attributebinding::bind_per_vertex);

geom->addprimitiveset(new osg::drawarrays(osg::primitiveset::********_strip,0,vearr->size()));

geode->adddrawable(geom);

//紋理;

osg::ref_ptrtex = new osg::texture2d;

if(img->valid())

tex->setwrap(osg::texture::wrap_t, osg::texture::repeat);//列向;

tex->setwrap(osg::texture::wrap_s, osg::texture::repeat);//行向;

geom->getorcreatestateset()->settextureattributeandmodes(0,tex,osg::stateattribute::on);

//geode->getorcreatestateset()->setattributeandmodes(new osg::cullface,osg::stateattribute::on);

return geode;

}

GLSL實現Glow效果

glow即輝光效果現在已成為3d圖形中乙個引人注目的特效.本文主要介紹如何使用glsl實現乙個典型的glow效果.實現步驟 1.渲染整個場景到乙個禎緩衝區中 2.將場景中需要進行glow處理的物體繪製第二個fbo紋理a中 3.在fbo紋理a和b之間進行橫和縱 高斯 過濾 4.將進行過glow處理後的...

QT如何實現控制項倒影特效

想要為某些控制項不只是加倒影特效,例如 這樣 例如 這樣 於是,在我的潛心研究之下,終於找到了兩種實現方法 一 使用qt的qgraphicseffect類 qgraphicseffect類是乙個強大的特效類,但是官方只有四種用法,做倒影是不夠的,因此,需要我們自己重新定義乙個類來繼承它,重寫它的dr...

CSS實現倒影 Day80

發現這個功能的時候非常開心,結果不想居然是個殘次品,讓我不禁想起了 天龍八部 上段譽的六脈神劍,在這個瀏覽器上能夠。在還有乙個上就無論了啊,時靈時不靈的,只是有總比沒有要來的好,一點點積累,總能攢齊的。這個是在 webkit核心瀏覽器上支援的 webkit box reflect 簡介下這個樣式。能...