博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
irrlicht引擎:镜子效果
阅读量:7189 次
发布时间:2019-06-29

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

 

最近在用irrlicht做一个3D试衣间的小项目,为了给项目增添点花样,于是想实现一面镜子。

我记得D3D龙书上有一个使用模板缓冲区实现的例子。网上也有OPENGL实现的例子。 但这一次,我想用irrlicht的RTT实现一面镜子效果。

其实原理和水面反射原理是一样的, 只是没有加扰动而已

 

第一步:渲染反射贴图

反射贴图的渲染,其实就是将摄相机通过镜面镜像即可,irrlicht中我找了半天,没有发现镜像矩阵的算法,倒是在网上搜到了一个。 很是不错。

同时,也翻阅了一下先前公司引擎项目的代码,发现其实就是那个公式。 有兴趣的朋友可以参看这里

 

 

通过这个镜面反射矩阵,我们可以将摄相机镜像, 相当于是从镜子里向外看,渲染出一个世界。 在渲染的时候,要记得设置裁剪面。 在我的测试中我没有设置。

第二步:重新渲染世界

重新渲染世界的时候,镜子需要一个特殊的纹理来进行反射贴图。(镜像摄相机空间的投影纹理映射)。 这个贴图方式,就是指忽略镜子的纹理坐标,而通过

镜像摄相机来计算出投影坐标,然后贴在镜子上。在我的测试中,是用SHADER来实现的。 为镜子做了一个特殊的纹理。

 

下面,我贴一下SHADER,很简单,如果实在不清楚的,可以参考一些投影纹理相关的资料。

 

顶点着色器代码 HLSL

float4x4    WorldViewProj; float4x4    MirrorWorldViewProj; struct VS_OUTPUT {     float4 position    :POSITION;     float3 uv: TEXCOORD0; }; struct VS_INPUT {     float4 position        : POSITION;     float4 color        : COLOR0;     float2 texCoord0    : TEXCOORD0; }; VS_OUTPUT main(VS_INPUT input) {     VS_OUTPUT output;      float4 pos = mul(input.position, WorldViewProj);     output.position = pos;    //计算反射纹理的坐标     pos = mul(input.position,MirrorWorldViewProj);     output.uv.x = 0.5 * (pos.w + pos.x);     output.uv.y = 0.5 * (pos.w - pos.y);     output.uv.z = pos.w;     return output; }

 

 

像素着色器代码 HLSL

sampler2D colorMap; struct PS_OUTPUT {     float4 color : COLOR0;   }; struct PS_INPUT {     float4 position    : POSITION;     float3 uv: TEXCOORD0; }; PS_OUTPUT main( PS_INPUT input ) {     PS_OUTPUT output;     float2 uv = saturate(input.uv.xy / input.uv.z);     output.color = tex2D(colorMap,uv);     return output; }

 

RTT相关的操作,irrlicht的RenderToTexture已经很明白了,再此不在敷述。

 

上图,收工

转载于:https://www.cnblogs.com/qilinzi/archive/2013/04/05/3000393.html

你可能感兴趣的文章
maven全局配置文件settings.xml详解
查看>>
模型图纸数据库设计
查看>>
Two classes have the same XML type name 排错【转】
查看>>
linux笔记:linux常用命令-关机重启命令
查看>>
想要提高网页转换率?试试这16个UI秘诀
查看>>
转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法
查看>>
Configuring and troubleshooting a Schema Provider
查看>>
Windows环境安装MySQL数据库
查看>>
javascript函数以及作用域简介
查看>>
Windows Phone 编程中页面间传值方法 - [WP开发]
查看>>
apollo实现c#与android消息推送(四)
查看>>
Spring 上下文操作工具类 ContextUtils
查看>>
程序员的智囊库系列之3--分布式文件系统(Distributed file systems)
查看>>
工具推荐|程序员必须知道的11款新型编程工具
查看>>
Python入门之基础语法
查看>>
poj 2714 Random Walk
查看>>
SQL Server中数据的存储
查看>>
jQuery 属性操作方法
查看>>
LeetCode——Longest Consecutive Sequence
查看>>
Activity转换为View和把图片转换为View
查看>>