irrlicht引擎:镜子效果

简介:

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

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

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

 

第一步:渲染反射贴图

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

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

 

http://www.cnblogs.com/glshader/archive/2010/11/02/1866971.html

 

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

第二步:重新渲染世界

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

镜像摄相机来计算出投影坐标,然后贴在镜子上。在我的测试中,是用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已经很明白了,再此不在敷述。

 

上图,收工

2000

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2013/04/05/3000393.html

目录
相关文章
|
5天前
|
Android开发
Android游戏引擎AndEngine入门资料
Android游戏引擎AndEngine入门资料
12 3
|
3月前
|
机器学习/深度学习 人工智能 算法
阿里巴巴推出EMO,探索音频驱动的肖像视频生成的新领域
【2月更文挑战第9天】阿里巴巴推出EMO,探索音频驱动的肖像视频生成的新领域
2220 4
阿里巴巴推出EMO,探索音频驱动的肖像视频生成的新领域
|
6月前
|
API vr&ar Android开发
一文搞懂ARKit,ARCore,RealityKit和Vuforia
AR框架的一个核心是含能够理解特征的场景和各种类型的锚点。锚点有很多种,可根据特定场景来摆放3D模型 ,甚至可以真人来做距离测量(ARBodyAnchor)。并且这些框架不容忽视的优势是具有进行场景重建和人形遮挡(occlusion)的32位尝试数据。
185 4
|
9月前
|
机器学习/深度学习 人工智能 物联网
妙鸭相机开源平替——连九块九都不要的个人形象定制
FaceChain——妙鸭相机的开源平替,可以用来打造个人数字形象的深度学习模型工具,仅需三张照片即可生成属于你自己独有的个人数字形象替身,赶紧来计算巢体验吧!
|
安全 前端开发 JavaScript
[工具使用]黑暗引擎FOFA(上)
[工具使用]黑暗引擎FOFA
1016 0
[工具使用]黑暗引擎FOFA(上)
|
开发框架 监控 安全
[工具使用]黑暗引擎FOFA(下)
[工具使用]黑暗引擎FOFA
707 0
|
机器人 atlas 定位技术
飞奔跳跃!波士顿动力人形机器人Atlas学会跑酷
今年 5 月份,大家熟知的机器人公司波士顿动力在 YouTube 上放出两段视频,展示了 Atlas 和 SpotMini 机器人的最新进展。这两段视频没有展示多少新鲜的东西,但让我们看到了这些机器人的活动是多么自然。今日,波士顿动力机器人再次吸引了大家的注意:会跑酷的 Atlas。
183 0
飞奔跳跃!波士顿动力人形机器人Atlas学会跑酷
|
数据可视化 C# 图形学
虚幻4和Unity3D应该学哪个?
虚幻4 (UE4) 和Unity是目前市场上最热门的游戏引擎,也各自拥有为数众多的开发者,虽然一些大型的游戏公司仍然运用自家开发的引擎来制作游戏,但是在巨大的市场需求下,独立开发者与游戏工作室依然需要一款优秀的引擎来支持项目的开发。
6193 0
|
图形学 Android开发
基于Unity3d 引擎的Android游戏优化(续)
VSync Count 垂直同步 中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间。一直不太明白是怎么回事,现在基本上明白了。我在这里解释一下原因,如有错误,欢迎指正。在Unity3D中当运行场景打开Profiler的时候,我们会看到VSync 这一项占了很大的比重。
1423 0
|
Java C# Android开发
基于Unity3d 引擎的Android游戏优化
更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 对于透明贴图,我们只能选择RGBA 16bit 或者RGBA 32bit。
1897 0