我不是Shader帝,虽然知道Shader怎么写,但一直没仔细研究过。最近蛋疼至极,研究了下RenderMonkey,于是抽着几个看着比较有趣的效果做了一下。

先前的模型贴花http://www.cppblog.com/Leaf/archive/2011/01/07/138093.html

和CUBE MAP http://www.cppblog.com/Leaf/archive/2011/01/07/138106.html

就是此次蛋疼期的产物之一。

还是先围观,上图再说

本次要蛋疼的是折射和反射。

反射和折射通常用于增加场景真实感。由于其代价昂贵(通常是要将场景多渲染两次为代价)。因此在实际的游戏开发中,都省着用。而此次演示的水的反射和折射并未进行场景渲染,只做了以下几点工作。

1、渲染天空球。

2、渲染一个水面,并用CUBEMAP对其进行映射,映射时纹理坐标采用投影方式,并附带扰动。(扰动用的是一个立方体纹理)

附加说明:此次是对RenderMonkey 1.82里的Reflections Refractions例子里的Ocean进行改造。 原本Ocean里只做了反射,我强加上了折射。

关于折射,有一个哥们的资料解释得挺好的。链接如下

http://www.zwqxin.com/archives/shaderglsl/review-reflect-and-refract.html

下面是Vertex Shader代码。以及其解释

float4x4 view_proj_matrix;//: register(c0);
float4 scale;//: register(c5);
float4 view_position;
struct VS_OUTPUT {
   float4 Pos:    POSITION;
   float3 pos:    TEXCOORD0;
   float3 normal: TEXCOORD1;
   float3 vVec:   TEXCOORD2;
};

VS_OUTPUT main(float4 Pos: POSITION, float3 normal: NORMAL){
   VS_OUTPUT Out;

// Get some size on the water
   Pos.xy *= 1000; //由于RenderMonkey里的OceanSurface.3ds比较小,这里进行了强制缩放,若是其它模型,则可以屏蔽掉这两条语句
   Pos.z = Pos.z -30;

Out.Pos = mul(Pos,view_proj_matrix);
   Out.pos = Pos.xyz * scale;
   Out.vVec = Pos - view_position;//视线方向 注意:是世界空间。
   Out.normal = normal;

return Out;
}

float waveSpeed: register(c2); //水波速度  0.3
float noiseSpeed: register(c3);//躁声速度 0.26
float fadeBias: register(c4);//退化矫正 0.3
float fadeExp: register(c5); //退化幕 6.08
float time_0_X: register(c0);//时间
float4 waterColor: register(c1);//水面颜色
float4 scale: register(c6);//缩放, 其w分量存放着折射系数
sampler Noise: register(s0);//3D躁声图
sampler skyBox: register(s1);//CUBE MAP  天空盒
float4 main(float3 pos: TEXCOORD0, float3 normal: TEXCOORD1, float3 vVec: TEXCOORD2) : COLOR {

//这两条语句是对其进行偏移,使访问纹理坐标的时候,产生流动和扰动效果
   pos.x += waveSpeed  * time_0_X;
   pos.z += noiseSpeed * time_0_X;

float4 noisy = tex3D(Noise, pos); //对躁声纹理进行采样

// Signed noise
   float3 bump = 2 * noisy - 1; //由于采样同来的躁声纹理每个分量的值是 [0,1] 对此将其规范化到[-1.0,1.0]
   bump.xy *= 0.15;//缩放一定值。
   // Make sure the normal always points upwards

///法向量矫正,使其永远向上。注:在这里,XY与Ocean平面平行,Z为向上
   bump.z = 0.8 * abs(bump.z) + 0.2;
   // Offset the surface normal with the bump

//偏移法向量
   bump = normalize(normal + bump);

// Find the reflection vector

//计算反射和折射
   float3 reflVec = reflect(vVec, bump);
   float3 refrac = refract(normalize(vVec),normalize(bump),scale.w);

//根据反射和折射方向访问CUBE MAP

float4 refl = texCUBE(skyBox, reflVec.yzx);
   float4 wa = texCUBE(skyBox, refrac.yzx);
   wa = wa*0.5+waterColor*0.5;

//下面是fresnel效果计算,就是用于计算折射和反射图之间的插值因子的。详情请仔细GOOGLE

//这就是上面那个老兄的Ratio = f + (1 - f) (1 - InVec • norm)fresnelPower 公式

//图1中,n1 = 1.0    n2 = 1.3
   float f = 0.0170132325;
   float lrp =f+(1-f)*(1 - dot(-normalize(vVec), bump));
   // Interpolate between the water color and reflection
   return lerp(wa, refl, saturate(fadeBias + pow(lrp, fadeExp)));
}

图1

本文并未解释任何事情,仅是将上面那个链接指向的文章内容翻版为水面实现。此实现仅作为探索目的,无任何实用价值(除非你只想演示水)。

若要用此方案作实时的水面渲染,则需要将场景渲染到一个CUBEMAP上(就算你降到CUBEMAP每秒更新2次,代价也是比较大的,并且不能保证实时感)。

而其中的扰动纹理,以及所给的相关因子均需要手动调整到一个合适的值。

转载于:https://www.cnblogs.com/qilinzi/archive/2011/01/08/1930960.html

Reflect Refract (以水渲染为例)相关推荐

  1. [图形学] 实时体积水和泡沫的渲染

    reference :<GPU Pro3> Volumetric Real-Time Water and Foam Rendering Daniel Scherzer, Florian B ...

  2. [笔记]unity渲染类零碎代码记录(100多条)

    1.获得renderTexture上的4个角的近裁面位置 cam = GetComponent<Camera>(); Matrix4x4 inverseViewProjectionMatr ...

  3. Anbox源码分析(三)——Anbox渲染原理(源码分析)

    Anbox源码分析(三) 上一篇,我们介绍了Anbox视频渲染的原理,这一篇,我们从源码入手,更深入的理解Anbox与渲染的机制和原理 session manager入口 session manage ...

  4. OSG 高效渲染 之 多线程模型与渲染

    这里以OSG多线程渲染为例,谈谈OSG渲染引擎多线程渲染模式,再说说哪里有点"过时"了需要改进. 先谈点题外话,曾经看到知乎上一篇关于游戏引擎的设计讨论的文章,有位"大大 ...

  5. 性能测试:一种计算 TP90、TP95 和 TP99 等水位线的方法

    文章目录 前言 计算方法 代码 前言 在性能测试中,我们经常会选择 TP90.TP95 或者 TP99 等水位线作为性能指标.在本文中,我们就给出一种计算 TP90.TP95 和 TP99 等水位线的 ...

  6. 条件渲染之react高阶组件——HOC

    定义:它接受任何输入(多数时候是一个组件)并返回一个组件作为输出.返回的组件是输入组件的增强版本,并且可以在 JSX 中使用.不是react api而是一种设计模式. 作用:强化组件,复用逻辑,提升渲 ...

  7. InVEST模型,掌握产水(包括水源涵养)、碳存储(包括固碳)、土壤保持、水质(氮磷)、生境质量和热岛缓解等生态系统服务评估方法,开展人类活动影响、重大工程实施的生态成效评估

    不论您是小白亦或是已经能够成功运行InVEST模型生成结果,您可以自由选择内容,如果您是小白老师手把手教您,如果您已经是InVEST模型熟悉者,已经为您准备了结合实际项目内容以及通过模型进行高质量的论 ...

  8. 从四个方面来教您选购分集水器

    一.从产品的材料和工艺结构上看 为了保证分集水器的质量,各生产厂商纷纷从产品的材料和工艺结构上动脑筋.从材料上看,目前市场上有不锈钢.铜.高分子合成材料等;从结构上看,有组装式.焊接式.锻造拼接式等. ...

  9. 3d网上渲染平台是怎么渲图的_云渲染流程详解!

    题主说的看到许多网友对''3d网上渲染平台是怎么渲图的''进行提问,瑞云渲染小编也提供自己的小小见解.针对3D网上渲染平台是指什么,实际应该是指云渲染农场.几十年来,随着计算机软硬件不断更迭,图形图像 ...

最新文章

  1. 多线程编程(3) - 多线程同步之 CriticalSection(临界区)
  2. 恩智浦智能车大赛2020_2020年中国人工智能机器人大赛在宝鸡市会展中心举办
  3. Android_(消息提示)多种使用Toast的消息提示
  4. CSS3 Animation动画的十二原则
  5. 以太网与802.3,wifi与802.11的关系
  6. 通过Java执行python文件
  7. html加载less,javascript – 动态加载less.js规则
  8. 无限重启_三星蓝光播放器出现无限自动重启BUG,涉及不少用户及不同型号
  9. C++实例讲解Binder通信
  10. sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断
  11. 页面跨域与iframe通信(Blocked a frame with origin)
  12. centos mysql 同步时间_centos:mysql主从同步配置(2018)
  13. 自动驾驶公司 | 纵目科技完成D轮1.9亿美元融资
  14. Ubuntu中配置虚拟专用网络***
  15. 【算法学习】Fast burst images denoising
  16. c#调用java的webservice方法,C# 调用 Java WebService | 思考的极致
  17. 交流异步电机矢量控制(一)——电机模型及其坐标变换
  18. C# 插入文本框到PPT幻灯片
  19. 使用excel2007做聚光灯
  20. 1039: 绝对值最大(C语言)

热门文章

  1. jQuery的几种简单实用效果
  2. SQL Server与Oracle对比学习:权限管理(一)
  3. [转载]如何破解Excel VBA密码
  4. thinkphp起步
  5. 树磁盘[HBase] LSM树 VS B+树
  6. 六天学会BASIC语言的方法——计算机达人成长之路(10)连载
  7. 简单的学生库管理系统
  8. 怎样利用商业智能软件实现业务目标
  9. 如何使用大数据算法改善有效链接
  10. 线性系统的Matlab分析函数