博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈水体的实现
阅读量:6544 次
发布时间:2019-06-24

本文共 1252 字,大约阅读时间需要 4 分钟。

    温故知新,水面很早就实现了,但没有在这里写过,今天总结一下。

    水的模拟要达到以下效果:水面的折射与反射,水的波动。
    要达到这种效果,需要以下四张纹理:折射纹理(RenderTarget),反射纹理(RenderTarget),Bumpmap,水自己的纹理。
    折射与反射的原理就不具体说了,下面只说实现步骤。

    一、渲染到纹理

    RenderTarget的创建我不多述了,网上查查,我创建的是256X256的纹理,格式为X8R8G8B8。折射纹理比较简单,直接把当前的地形或在水面以下的物体渲染多次,注意,为提高性能,在这次pass中,可以选择带clip的shader(假如用到shader)或者直接使用水面的平面作为一个clipplane(不使用Shader)。
    然后是反射的实现,首先生成一个以水面为反射面的反射矩阵,摄像机的坐标乘与反射矩阵求得新的坐标。然后按渲染流程再走一次,(即计算裁剪空间,加入渲染对列,到最后渲染)。渲染到纹理后,注意,此时的纹理U坐标应该做一个反转操作。如果在shader中修改,必须比较简单就是u = 1.0 - uvCoord.x。 

    二、水的波动

    需要利用一个Bumpmap做作纹理UV值的偏移,下面是HLSL的代码:

    float2 BumpUVCoords = input.uvCoords;

    BumpUVCoords.x += time;
    BumpUVCoords.y -= time;
    float4 dudv_offset = tex2D(BumpMap, BumpUVCoords);//primary_motion + secondary_motion); //, 0.0001, 0.9999));  // + secondary_motion);
    float2 offsets = (2 * dudv_offset.xy - 1) * 0.1;

    //这里的clamp是多余的,明天试试去掉

    float2 lastCoords = input.uvCoords + offsets;  //clamp(input.uvCoords + offsets, 0.00, 4.00);//offsets; //, 0.00, 1.00);
   
    float2 waterUV = input.uvCoords;
    waterUV.x += time;
    waterUV.y -= time;
    float4 colorWater = tex2D(Samp0, waterUV);
 
    output.Color = colorWater;

    clamp(input.outTexProj, 0.0, 1.0);

    float2 texProj = input.outTexProj.xy / input.outTexProj.w;
    texProj.x = 1.0 - texProj.x;
    lastCoords = clamp(texProj + offsets, 0.0, 1.0);

截图:

转载地址:http://heodo.baihongyu.com/

你可能感兴趣的文章
[直播一揽子]x264参数的解释
查看>>
static的意义和功能
查看>>
iOS学习之Objective-C 2.0 运行时系统编程
查看>>
Exchange2007-Exchange2010升级-06 数据库高可用组的创建
查看>>
phpHiveAdmin是如何通过Hive/Hadoop工作的
查看>>
双向链表内结点的删除(4)
查看>>
项目总结
查看>>
JSON字符串转成对象
查看>>
SaltStack 中ZMQ升级
查看>>
grep,egrep使用以及正则表达式的使用
查看>>
implode 和 explode
查看>>
gzip the js and css
查看>>
exchange 2013 提示“HTTP 500内部服务器错误”
查看>>
Linux运维学习笔记之一:运维的原则和学习方法
查看>>
怎样使用原型设计中的组件样式功能
查看>>
python threading
查看>>
谷安天下2013年6月CISA考前辅导 第一季
查看>>
ARM程序规范
查看>>
我的友情链接
查看>>
Qt下的OpenGL 编程(8)文字、FPS、动画
查看>>