游戏引擎笔记(三)天空盒和水面

天空穹庐:

天空穹庐是一个半球形物体,结合天空纹理的贴图来实现的。

 

天空云层:

天空云层的实现是在场景中放置一个到多个平面,然后在上面贴上天空纹理。

(使用BillBoard)

 

容积云:

如果应用程序需要更真实的样子,则可以实现容积云模型,使玩家能够进入风景中,沉浸在容积云中。

 

天空盒的实现:

大部分场景处于天空和内部,因此在确定天空盒顶点的时候,天空盒的顶点顺序和普通六面体盒子的顶点顺序是相反的。

1.定义顶点

2.加载纹理

3.天空盒变换(缩放、平移)

4.绘制天空盒

 

顶点结构:

Struct VERT_SKYBOX

{

Float x, y, z;

Float tu, tv;

}

 

水面动画:

用波形表示水面。

 

水面颜色:

假设水的颜色置于水面高度和观察者角度有关,那么可以这样计算颜色。

Half facing = saturate(dot(eyeVect.normal));

Half3 waterColor = lerp(shallowWaterColor.deepWaterColor, facing);

 

水面纹理:

波纹和凹凸纹理。

 

反射和折射:

反射和折射的思想都一样,以水面为裁剪平面,分别把场景渲染为折射和反射贴图,然后投影到水面上。

 

菲涅尔效果:

对水面来说,当观察者和水面的角度越小时,反射效果越明显,反之,折射效果越明显。

 

水面设置:

1.顶点结构

Struct WaterUpVertex{

Float x,y,z;

Float tu,tv;

//Float3 normal;

 

};

 

Struct WaterDownVertex{

Float x, y, z;

float3 normal;

}

 

2.纹理加载

通常情况下,这些纹理图片是一系列包含微小变化的图片,可以用一个配置文件来表示纹理数组的顺序。

  1. 使用多张纹理
  2. 改变纹理坐标

 

水面渲染:

水面的渲染同样分为两个部分,水面的正面与背面,正面需要添加纹理,而背面只需要添加水面颜色。

 

 

场景管理模块:

 

 

posted @ 2022-07-23 16:39  香菇0_0  阅读(115)  评论(0)    收藏  举报