Ogre中Fresnel例子分析
来源:互联网 发布:vb.net数据库放到内存 编辑:程序博客网 时间:2024/05/21 10:18
最近需要在研究水实现,在客户端中加入了水来测试,简单的实现水的折射、反射。 备注:在OGRE1.7的例子Demo_Fresnel中已有展示。 关键词:RTT Fresnel 实现方法: 首先必须手动创建两个Texture,一个用于渲染反射、一个用于渲染折射。 最后通过Fresnel作为权重,在refraction和reflection两张纹理颜色插值。 需要注意的: 两次渲染到纹理,需要实现RenderTarget的监听器:RenderTargetListener。 void preRenderTargetUpdate(const RenderTargetEvent& evt) { // 设置水实体不可见 // 如果是反射需要设置摄像机为镜像 // 设置订制的近切面平面 //! Attention 这里注意,在这里的时候犯了个错误,将反射和折射用同一个平面(反射的平面为法线为Y轴向上,折射平面法线和反射相反)。 } void postRenderTargetUpdate(const RenderTargetEvent& evt) { // 相关恢复工作 } Shader分析: 这里主要是像素着色器实现部分,在材质脚本中可以看见有三张Texture 1. texture waves2.dds 2. texture reflection 3. texture refraction 2和3不必多说是我们手动创建的纹理。1为Perlin noise volume。 在shader代码中,可以看到,通过对waves2.dds采样,并求出干扰normal,对后面的反射和折射纹理进行干扰。 float2 final = projectionCoord.xy / projectionCoord.w; // Noise float3 noiseNormal = (tex2D(noiseMap, (noiseCoord.xy / 5)).rgb - 0.5).rbg * noiseScale; final += noiseNormal.xz; 计算Fresnel term,使用Fresnel简易计算公式,实际的Fresnel要复杂的多,fresnelBias为偏移系数,fresnelScale为缩放系数,fresnelPower为Fresnel指数,eyeDir为视角方向向量,N为法向量。 float fresnel = fresnelBias + fresnelScale * pow(1 + dot(eyeDir, normal), fresnelPower); 最后对reflection和refraction按照Fresnel系数进行插值。
- Ogre中Fresnel例子分析
- chap8_2 Fresnel in OGRE
- OGRE 1.7 例子程序分析
- OGRE 1.7 例子程序分析
- OGRE Demo_Ocean 例子的分析
- OGRE Demo_Instancing 例子的分析
- Ogre例子Facial Animation分析
- OGRE 1.7 例子程序分析
- OGRE DEMO Fresnel 的关键代码
- Ogre中SceneManager分析
- ogre中MaterialSystem分析
- Ogre中SceneManager分析
- Ogre中SceneManager分析
- OGRE关于 Demo_DeferedShading 例子的分析
- OGRE关于 Demo_Ocean 例子的分析
- OGRE关于 Demo_Instancing 例子的分析
- OGRE关于 Demo_FacialAnimation 例子的分析
- OGRE关于 Demo_Crowd 例子的分析
- EasyUI 动态改变数据窗口列 Dynamic Change DataGrid Coiumns
- N列等高
- android Handler 介绍(一)
- 博客搬家
- oracle函数大全 oracle所有函数举例说明
- Ogre中Fresnel例子分析
- const_cast的应用
- USB接口IC读写器oem软件_AB密码完整解决方案/读写卡测试程序及源代码/c++builder源代码(2)
- 自定义Alert样式
- android 动态布局
- url伪静态 重写
- Unity 四元数
- TCP连接探测中的Keepalive 和心跳包
- 输入的字符串格式不正确