使用投影纹理进行模型贴花(Mesh Decals)

Decals Using Projective Texture Mapping

讲投影纹理的好文章网上是很多的,在此给大家一个参考链接,我就不再呈述了。 此文章的描述很易懂。

投影纹理映射(Projective Texture Mapping)

http://wwwnno00.irrlicht3d.cn:8011/redirect.php?tid=54109&goto=lastpost

 

上面的文章从原理上讲述了投影纹理是什么,本文则利用投影纹理进行一个实际的应用。

在游戏中贴花最常见的地方就是用鼠标选择一个目标后,地上出现的一个圆圈,或者范围魔法在施放时的提示区域。

这个纹理会随着模型和地图的表面进地扭曲,而非一个平面,所以,我们不论怎么做,都会进行一个“投影”的思想,才能让贴上去

的纹理在某一个方向上看的时候,是一个完整的画面。(我们地上的圈,就是从上往下贴的,所以你从上往下看时,会看到一个完整无扭曲的图片)。

 

什么? 地上是一圈?是的,但是呢,我们的纹理是方的。 我们看到是圈,并不表示我们要把纹理贴到一个圈上。

下面是我在RenderMonkey里测试的结果。

 

OK,围观完毕,下面简单说一下如何实现。

 

用投影纹理进行贴花有两种做法。

第一种。

1、正常渲染模型。

无它!

2、根据投影方向,投影半径找到投影时需要渲染的三角形组。

这种贴花的效率损耗就是花在这里了,所以三角形剔除算法要比较高效才行。

3、将此三角形组进行渲染(相当于做为一个模型渲染),纹理映射时采用投影纹理。

渲染时,要打开全局混合开关。

 

采用这一种渲染方式时,不需要占用纹理通道,也就是可以在模型上贴无数个花。

 

第二种。

这是一种占用纹理通道的做法。就是只渲染一次,而在PS中,进行纹理混合。

 

 本文演示的是第一种情况,因为它更贴近于实际应用。并且并未做三角面剔除,而是仅仅将模型渲染了两次。

下面是投影纹理的HLSL代码,以及相关解释。

 

VS:

struct VS_INPUT 

   float4 Position : POSITION0;

};

struct VS_OUTPUT 

   float4 Position : POSITION0; 
   float3 WorldPos : TEXCOORD0; 
};

VS_OUTPUT vs_main( VS_INPUT Input ) 

   VS_OUTPUT Output;

   Output.Position = mul( Input.Position, matViewProjection ); 
   Output.WorldPos = Input.Position; 
   return( Output ); 
}

VS所做的工作并没有什么特别的,仅是需要多向PS传递一个空间位置。

 

 

PS:

sampler2D Texture1; //贴这张纹理时,其UV寻址方式最好为CLAMP 
struct PS_INPUT 

   float3 WorldPos : TEXCOORD0; 
};

float4 ps_main( PS_INPUT Input ) : COLOR0 

   float3 Center = float3(0, 0, 20);//投影中心,Y值被忽略。 
   float Radius = 4;//投影范围 
   float3 UVector = float3(1, 0, 0)/(2 * Radius);//将世界坐标变换到纹理投影空间坐标并规范化到0-1之间(正投影) 
   float3 VVector = float3(0, 0, 1)/(-2 * Radius);//同上 
   float2 coord;  
   coord.x = dot(Input.WorldPos - Center, UVector) + 0.5; 
   coord.y = dot(Input.WorldPos - Center, VVector) + 0.5; 
  // if(coord.x < 1 && coord.y < 1 && coord.x>0 && coord.y>0) 
   return tex2D( Texture1, coord); 
   //else 
   //return 0; 
}

 

 

 

PS所做的工作就是将世界坐标转换到投影空间,再转换为纹理坐标。

需要说明一点的是,为了测试方便,我仅假设此时摄相机观察和投影方向为-Y方向。所以

dot(Input.WorldPos - Center, UVector)+0.5

上面这句话其实相当于是mul(Input.WorldPos,matProjTexture)/2.0+0.5;

 

另外,对于

  // if(coord.x < 1 && coord.y < 1 && coord.x>0 && coord.y>0)

这句话,我写在这里,是作为裁剪使用,若没有这个. 就算你设置为了CLAMP,那么当你的纹理边缘的ALPHA不为0时,你会看到

纹理会左右延伸。

 

而若你未选择CLAMP寻址方式,那你的效果就百般神奇了。 也可以将上面屏蔽的代码解开,用于裁剪。

 

结尾:

一、投影纹理进行模型贴花时,主要是进行三角面剔除,使在渲染贴花时,提交最少的三角面。

二、在贴花PASS中,需要将全局混合开启,并设置相应的SRCBLEND(SRC_ALPHA)和DESTBLEND(DEST_ALPHA)值。括号内为我用的值。

当然,如果你不想让贴花与场景(模型)混合,则可以不开启。

三、请注意纹理的寻址方式以及纹理边缘的ALPHA情况。 若纹理边缘ALPHA不为0,则可以手工进行裁剪。

四、本文仅是采用了固定的投影方向和SHADER内部定义变量的方式来进行贴花渲染。 并且,并未进行模型三角面剔除。所以若要使用,则需要注意第一个问题。

五、本文灵感来源于此贴:http://forums.create.msdn.com/forums/p/34339/198791.aspx

六、支持邮件交流:BoYueGame#Gmail#com

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

转载:http://www.cnblogs.com/geniusalex/archive/2011/01/07/1929303.html

时间: 2024-08-03 15:52:47

使用投影纹理进行模型贴花(Mesh Decals)的相关文章

ZBrush怎么使用投影大师绘制置换细节

  投影大师是一种工作模式,进入该模式后能在3D模型上以2.5D的方式描绘,最后再从画布拾取,本文将对如何使用投影大师绘制置换细节做详细介绍. 绘制前提示:进入投影大师模式之前务必大细分调至到最高级别. 步骤一.在工具控制面板中,单击"Load Tool"按钮载入工具.您可以使用自己制作完成的模型,也可以使用ZBrush默认提供的模型,在画布中按住鼠标左键并拖动拉出模型,按"T"进入编辑模式.按Shift键让模型的侧面完成处于正角状态,按F键最大化居中显示物体. 由

Reflect &amp; Refract (以水渲染为例)

我不是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 就是此次蛋疼期的产物之一.   还是先围观,上图再说   本次要蛋

OGRE材质

"材质(material)",材质是一个很基本的术语,表示你的物体对光的反射方式.但是对它的实现并不像其解释这样简单,我们会用这一章节进行详细地介绍Ogre中相关的技术. 我们刚才提及过,材质定义了物体对光线反射的处理方法.这里暗示了材质的表现与光源的类型相关:聚光(Spotlights).点光源(point lights)以及有向光(directional lights)对材质的表现有着完全不同的影响.简单来讲,它们都是对物理世界真实光源类型的模拟,所以材质对它们的反射也遵守着其在物

Three.js快速入门教程_javascript技巧

引言 本文主要是讲解Three.js的相关概念,帮助读者对Three.js以及相关知识形成比较完整的理解. 近年来web得到了快速的发展.随着HTML5的普及,网页的表现能力越来越强大.网页上已经可以做出很多复杂的动画,精美的效果. 但是,人总是贪的.那么,在此之上还能做什么呢?其中一种就是通过WebGL在网页中绘制高性能的3D图形. OpenGL,WebGL到Three.js OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于OpenGL设计的面向web的图形标准,

3D Engine 的设计架构

Introduction (简介) 让咱们谈谈你如何撰写一份提供优雅性能的3D引擎.你的引擎需要提供的包括:曲面(curved surfaces).动态光线(dynamic lighting).体雾(volumetric fog).镜面(mirrors).入口(portals).天空体(skyboxes).节点阴影(vertex shaders).粒子系统(particle systems).静态网格模型(static mesh models).网格模型动画(animated mesh mode

魔兽世界客户端数据研究(三)

终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. 其中会有很多让人费解的地方,如果有幸被某位兄弟看见 ,请勿见笑.   今天来说一下M2中的LOD的数据 WOW中,为了降低远处模型的渲染开销,为模型做了LOD,即远处的模型,使用更少的顶点,更粗略的材质. 比如远处的模型在渲染的时 候,面片数量减少,关闭光照,不渲染挂接的特效等等. 因此,不用证明

H5打造3d场景不完全攻略(二): Amazing CSS3D

前言 对的,本文就是着重介绍如何使用CSS3中的3D变换打造出H5中的3D效果.灵感来源于造物节团队的3d引擎,因为使用方法比较复杂,也没有开源的API文档,于是想自己另外造个轮子,便开始了相关内容的学习和实践.众所周知,目前市面上的H5 3D类库(如Three).引擎(Egret).构建工具(kpano.720云)都或存在体积太大.不开源.非免费.学习成本高等问题.对于我们较为熟悉的CSS3,为什么就不对它好好利用一把呢?诚然,CSS3存在我们比较清楚的短板,CSS对平面的渲染能力高,但是对3

[译]使用AssetBundle Manader

AssetBundle and the AssetBundle Manager 介绍 AssetBundle允许从本地或者远程服务器加载Assets资源,利用AssetBundles技术,Assets资源可以放在远程服务器上,这种技术增加了项目灵活性并且减少项目初始包的大小. 本文介绍AssetBundles并且讨论一步一步的介绍怎么样使用它,怎样将资源打包到AssetBundle中,如何使用以及如何处理资源的引用计数,所有这些我们都可以使用AssetBundle Manader来简化Asset

一个游戏引擎所应具有的元素

原文:http://www.flipcode.com/archives/Elements_Of_A_Game_Engine.shtmlIntroduction (简介) 现在我们来说说你将如何写出一个支持华丽特性的3D引擎.你的引擎需要提供的包括:曲面(curved surfaces).动态光(dynamic lighting).体积雾(volumetric fog).镜面(mirrors).入口(portals).天空盒(skyboxes).顶点Shader(vertex shaders).粒