3D游戏引擎系列九

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

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

Phong 着色法是结合了多边形物体表面反射光的亮度,并以特定位置的表面法线作为像素参考值,以插值方式来估计其周围位置像素的色值。与Gouraud着色法比较,Phong着色法的效果比前者更逼真。实现方式跟上面的一样,新建一个文本文件,将后缀名改成.fx。Shader完整代码如下所示:

float4x4 matWorldViewPrj;
float4x4 matWorld;
float3 lightPos = float3(0, 60, -60);
float lightAttenuation = 0.01;

float3 eyePos = float3(0, 200, 400);

float4 mtlDiffuseColor = float4(1, 0, 0, 1);

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

struct VS_OUTPUT
{
	float4 pos  : POSITION;
	float3 worldPos : TEXCOORD0;
	float3 normal : TEXCOORD1;
};

VS_OUTPUT my_vs(VS_INPUT vert)
{
	VS_OUTPUT vsout;
	vsout.pos = mul(float4(vert.pos, 1), matWorldViewPrj);
	vsout.worldPos = mul(float4(vert.pos, 1), matWorld);
	vsout.normal = normalize(mul(vert.normal, matWorld));

	return vsout;
}

float4 my_ps(float3 worldPos : TEXCOORD0, float3 normal : TEXCOORD1) : COLOR
{
	float4 color;
	//ambient
	color = mtlDiffuseColor * 0.2f;

	normal = normalize(normal);
	float3 L = lightPos - worldPos;
	float d = length(L);
	 L /= d;

	 float atten = 1 / (lightAttenuation * d);
	 float diff = saturate(dot(normal, L));

	 color +=mtlDiffuseColor * diff * atten;

	 float3 V = normalize(worldPos - eyePos);
	 float3 R = reflect(L, normal);

	 float specular = pow(saturate(dot(R, V)), 8) * atten * diff;
	 color += float4(specular, specular, specular, 0);

	 return color;
}

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

对于着色器来说,只需要修改部分代码就可以了,在环境映射的基础上增加计算反射以及计算高光specular,当然Phong不需要环境映射中关于材质的处理。代码如下所示:

	float3 R = reflect(L, normal);

	 float specular = pow(saturate(dot(R, V)), 8) * atten * diff;
	 color += float4(specular, specular, specular, 0);

C++执行代码与上面的类似,在这里就不重复了。运行渲染效果图如下:

Phong着色模型是将物体表面的光反射看成是环境光的反射之和与光源直接有关的漫反射及镜面反射的组合。这句话理解起来比较拗口,从数学上讲就是将反射的总能量看做是光环境的强度,点光源的强度乘以三个不同的系数后相加的和。这三个系数分别表示:物体表面反射环境光、产生漫反射和产生镜面反射的能力。在代码的实现过程中都离不开数学公司的运算,在这里再啰嗦一下,数学知识对于程序开发来说非常重要,它决定了你将能达到的高度。

时间: 2024-10-06 07:50:17

3D游戏引擎系列九的相关文章

Top 10:HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二十一节:地表漫游与寻路

<使用Cocos2d-x 开发3D游戏>系列在线课程 第二十一节:地表漫游与寻路 视频地址:http://edu.csdn.net/course/detail/1330/20822?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: ?? 版权声明:本文为博主原创文章,未经博主允许不得转载.

Java 3D游戏引擎——JME(java Monkey Engine)

转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java 3D游戏引擎 一直以来,由于性能等原因,Java并不是3D图形应用的主流平台,但随着各种新技术的出现,这种情况有了很大改变.从开始的JIT.Static compilers,到现代的HotSpot技术,使Java程序的运行效率越来越高,目前已经接近于C++程序.此外,通过JNI技术,Java程序可以调用任

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十一节:骨骼动画模型播放控制

?? <使用Cocos2d-x 开发3D游戏>系列在线课程 第十一节:骨骼动画模型播放控制 视频地址:http://edu.csdn.net/course/attend/1330/20811 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:明天放出 课程截图: 实例工程演示: ?? ?? 版权声明:本文为博主原创文章,未经博主允许不得转载.

3D游戏引擎StingRay:支持实时多平台研发

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. [狗刨学习网]报道/之前<Autodesk将推跨平台3D游戏引擎StingRay>一文发布之后,业内很多童鞋表示关注.就在北京时间3月5日凌晨的发布活动上,Autodesk透露了3D引擎StingRay的进一步消息,据该公司透露,这款引擎采用了Bitsquid引擎

吴涛作品介绍-易语言和VOLCANO 3D游戏引擎

易语言 易语言是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言.易语言降低了广大电脑用户编程的门槛,可以通过使用本语言极其快速地进入Windows程序编写的大门. VOLCANO 3D 游戏引擎 VOLCANO是一款MMORPG(大型多人在线角色扮演)3D网络游戏的开发引擎,用作支持用户快速并简单地开发具有真实游戏环境和丰富游戏玩点的游戏. 易语言 易语言是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言.易语言降低了广大电脑用户编程的门槛,尤其是根本不

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十二节:换装系统

?? <使用Cocos2d-x 开发3D游戏>系列在线课程 第十二节:换装系统 视频地址:http://edu.csdn.net/course/detail/1330/20812?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 实例工程演示: ?? 版权声明:本文为博主原创文章,未经博主允许不得转载.

火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第四节:3D公告板

<使用Cocos2d-x 开发3D游戏>系列在线课程 第四节:3D公告板 视频地址:http://edu.csdn.net/course/attend/1330/20804 交流论坛:mod=viewthread&tid=5&page=1&extra=#pid5" target="_blank">http://www.firestonegames.com/bbs/forum.php? project下载地址:mod=viewthrea