使用兩相機,乙個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 簡介下這個樣式。能...