3D游戏引擎系列八

原创 2017年02月03日 20:37:36

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN课程视频网址:http://edu.csdn.net/lecturer/144

环境映射在材质的渲染上同样应用广泛,现实生活中我们也经常遇到环境映射,比如一个光滑的铁球上可以映射出周围环境。它的实现方式就是把周围的环境通过反射,折射映射到3D物体表面的材质上,给人非常炫酷的感觉。实现方式有两种:一种是通过美工做一张环境映射贴图实现环境映射;第二种方式是美工做六张贴图实现环境映射。Unity实现方式采用的是后者,本节实现的是第一种方式,第二种方式可以借鉴Unity的立方体纹理,Unity实现效果如下图:


通过六张贴图就可以把环境映射的效果展现出来,这种方式同样适用于天空盒的实现。本节是通过一张贴图实现环境映射效果,接下来还是新建一个文本文件,将其扩展名改成.fx。完整代码如下所示:

float4x4 matWorldViewPrj;
float4x4 matWorld;
float4x4 matView;
float3 eyePos;

texture cubeMapTexture;
texture sphereMapTexture;

//--
struct VS_INPUT
{
	float3 pos		: POSITION;
	float3 normal : NORMAL;
};

struct VS_OUTPUT
{
	float4 pos : POSITION;
	float3 cubeTex	: TEXCOORD0;
};

VS_OUTPUT my_vs(VS_INPUT vert)
{
	VS_OUTPUT vsout;
	vsout.pos = mul(float4(vert.pos,1),matWorldViewPrj);
	
	float3 worldPos = mul(float4(vert.pos,1),matWorld);
	float3 worldNormal = normalize(mul(vert.normal,matWorld));
		
	float3 viewDir = normalize(worldPos - eyePos);
	
	vsout.cubeTex = reflect(viewDir, worldNormal);
	
	return vsout;
}

//--
samplerCUBE cubeMap = sampler_state
{
	Texture = <cubeMapTexture>;
	MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
};

float4 my_ps(float3 cubeTex	: TEXCOORD0) : COLOR
{
	return texCUBE(cubeMap,cubeTex);
}

//--
technique myCubeEnvMap
{
	pass p0
	{
		VertexShader = compile vs_1_1 my_vs();
		PixelShader = compile ps_2_0 my_ps();
	}
}

//--
struct VS_OUTPUT_Sphere
{
	float4 pos : POSITION;
	float2 sphereTex	: TEXCOORD0;
};

VS_OUTPUT_Sphere my_sphere_vs(VS_INPUT vert)
{
	VS_OUTPUT_Sphere vsout;
	
	vsout.pos = mul(float4(vert.pos,1),matWorldViewPrj);
	
	float3 viewNormal = mul(vert.normal,matWorld);
	viewNormal = mul(viewNormal,matView);
	viewNormal = normalize(viewNormal);
		
	vsout.sphereTex = float2(viewNormal.x/2+0.5,viewNormal.y/2+0.5);
	
	return vsout;
}

sampler sphereMap = sampler_state
{
	Texture = <sphereMapTexture>;
	MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
};

float4 my_sphere_ps(float2 sphereTex	: TEXCOORD0
			) : COLOR
{
	return tex2D(sphereMap,sphereTex);
}

technique mySphereEnvMap
{
	pass p0
	{
		VertexShader = compile vs_1_1 my_sphere_vs();
		PixelShader = compile ps_2_0 my_sphere_ps();
	}
}

相比上一个CelShading卡通渲染Shader,在函数:

VS_OUTPUT my_vs(VS_INPUT vert)

增加了反射函数reflect语句如下:

float3 viewDir = normalize(worldPos - eyePos);vsout.cubeTex = reflect(viewDir, worldNormal)

计算中的反射和折射不需要程序手工计算,直接调用Shader的库函数就可以实现,但是原理还是要搞清楚。在该Shader中实现了两种效果:分别是立方体和球体,Shader实现方面也分了两个Technique,每个Technique有一个pass通道分别是关于立方体映射和球体映射。这里面涉及到两张贴图的渲染,一个是环境平面材质的渲染,另一个是球体的环境材质渲染。C++要实现此效果,需要两张贴图,第一张贴图是环境贴图,第二张是球贴图如下所示:




立方体环境映射渲染效果如图:


其在引擎内部的调用与前面CelShading的编写代码类似,这里就不介绍了。C++主要是调用不同的Technique以达到不同的渲染处理方式,代码语句如下:

m_pEffect->SetTechnique("myCubeEnvMap");

这条语句是默认的通道,可以通过if else条件语句去切换立方体和球体映射,换句话说就是调用不同的Technique技术,因为GPU一次只能执行一个Technique。



版权声明:本文为博主原创文章,未经博主允许不得转载。

3D游戏引擎系列三

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年01月27日 17:30
  • 1930

3D游戏引擎原理简介

作者:Luke Hodorowicz  翻译:乐晨光 (2001/9/28)  本人对3D也不甚了解,译文动机一则是内容所致兴致昂然,二则锻炼英译中技能。由本人水平及经验有限,文中绝对不乏大量误解与误...
  • mirror_hc
  • mirror_hc
  • 2005年11月16日 17:29
  • 3617

排名前10的H5、Js 3D游戏引擎和框架

由于很多人都在用JavaScript、HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题。基于浏览器的游戏最棒的地方是平台独立,它们能在iOS、A...
  • qq_30100043
  • qq_30100043
  • 2017年11月10日 11:46
  • 1026

3D游戏引擎技术架构设计

市面上目前流行最广的游戏引擎,在2D领域是Cocos2d引擎,在3D领域是Unity3D。这二者分别占领2D游戏开发市场和3D游戏开发市场,虽然虚幻4也开始发力,引擎代码开源。但是由于它是C++编写的...
  • jxw167
  • jxw167
  • 2016年12月17日 13:25
  • 2244

开源游戏引擎体验

应该说每个做游戏的人都会有一个自己写游戏引擎的梦。趁着还没有到新公司报道,花点时间研究一下开源引擎,梳理一下自己的思路。        新的游戏引擎是基于cocos2d-x,我希望能够从这些开源引擎中...
  • langresser
  • langresser
  • 2014年09月19日 02:39
  • 2211

手把手教你架构3D游戏引擎

在这里将多年游戏研发经验的积累写成一本书奉献给读者,目前已经开始预售,网址: http://www.broadview.com.cn/article/70 该书主要是将游戏中经常使用的技术给大家做了...
  • jxw167
  • jxw167
  • 2016年12月08日 10:16
  • 5284

3D游戏引擎系列二

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年01月27日 11:28
  • 961

四大开源3d游戏引擎探究

XreaL项目是基于Quake 3 Arena修改版引擎的非商业多人射击游戏,目标是在渲染技术上能与当今的商业游戏一较高下,开发者声称它是当前最先进的开源游戏引擎。根据Phoronix的介绍: Xre...
  • zhanghefu
  • zhanghefu
  • 2009年11月10日 12:59
  • 24764

Android 3D游戏引擎亲测结论

经历了N天痛苦的挣扎,终于找对了3D游戏引擎。话说,在某600多人的群里问别人游戏引擎,仅有一个人回答说很多都可以。再问就没人理你了。甚是觉得郁闷。没办法,只能自己去实验。先后实验了国内那本《Andr...
  • antoineyuan
  • antoineyuan
  • 2014年12月04日 11:22
  • 618

微软的基于webgl的H5 3D游戏引擎

它是个大图片,不是么?   这是个完整的 Babylon.js 场景, 使用 ‘简单的 HTML 文件’ 的方法.  这不是唯一(也不是最好)的设置一个场景的方法, 但是快速而简单.  我已经在”大图...
  • zealifree004
  • zealifree004
  • 2016年04月28日 12:40
  • 668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3D游戏引擎系列八
举报原因:
原因补充:

(最多只允许输入30个字)