﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-. . . . . . . . . . . . . . Blog Garden'  C plus plus (My technology Impire!)-文章分类-Game Develope &amp; Game Engine</title><link>http://www.cppblog.com/stevennash/category/2737.html</link><description>................................................................ It‘s a age of economic globalization and Infomation globalization........................................</description><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 18:13:44 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 18:13:44 GMT</pubDate><ttl>60</ttl><item><title>[转] Game Programming with DirectX -- 12[红+绿+蓝+Alpha]</title><link>http://www.cppblog.com/stevennash/articles/14554.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14554.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14554.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14554.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14554.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 12[红+绿+蓝+Alpha]						第十二集												红+绿+蓝+Alpha														 												红绿蓝组成了绚烂的颜色世界, 当红绿蓝遇到Alpha后, 这个颜色世界又多了一份神秘.														 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14554.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:52 <a href="http://www.cppblog.com/stevennash/articles/14554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 11[粒子系统的实际应用]</title><link>http://www.cppblog.com/stevennash/articles/14553.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:50:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14553.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14553.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14553.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14553.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 11[粒子系统的实际应用]						第十一集												粒子系统的实际应用														 												现实中的不规则物体要精确的模拟需要更多的粒子属性和更好的过程控制, 我们只是简单的模拟一些常见的物体.											...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14553.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:50 <a href="http://www.cppblog.com/stevennash/articles/14553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 10[粒子系统的实现]</title><link>http://www.cppblog.com/stevennash/articles/14552.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:49:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14552.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14552.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14552.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14552.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 10[粒子系统的实现]						第十集												粒子系统的实现														 												第六集中的二维纹理技术有着天生的缺陷, 1. 纹理走样; 2. 表现单一. 特别是在表达不规则物体如流水, 行云时, 这些缺陷被放大了.			...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14552.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:49 <a href="http://www.cppblog.com/stevennash/articles/14552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 09[那是什么鬼东西]</title><link>http://www.cppblog.com/stevennash/articles/14551.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14551.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14551.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14551.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14551.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 09[那是什么鬼东西]						第九集 那是什么鬼东西														 												想起第一次面对StarCraft的主界面, 看到旋转的星球, 晃着脑袋的卫星, 				…				, 那是什么? 														 				...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14551.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:48 <a href="http://www.cppblog.com/stevennash/articles/14551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 08[Mesh]</title><link>http://www.cppblog.com/stevennash/articles/14548.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:46:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14548.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14548.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14548.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14548.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 08[Mesh]						第八集 Mesh														 																		    构造简单的球的3D模型已经复杂化了, 如果用代码构造比球更复杂的3D模型就更难了, 还好有专业级的3D模型设计软件, 这些软件构造的3D模型在DirectX Graphic...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14548.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:46 <a href="http://www.cppblog.com/stevennash/articles/14548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 07[基本3D模型构造]</title><link>http://www.cppblog.com/stevennash/articles/14546.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14546.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14546.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14546.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14546.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 07[基本3D模型构造]						第七集 基本3D模型构造																						 																																7.1 顶点索引																																...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14546.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:39 <a href="http://www.cppblog.com/stevennash/articles/14546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 06[纹理映射技术]</title><link>http://www.cppblog.com/stevennash/articles/14545.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:38:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14545.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14545.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14545.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14545.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 06[纹理映射技术]						第六集 纹理映射技术																						 																		为使建立的3D模型更接近现实世界中的物体, 简单的颜色变换已经无能为力, 这时我们就需要纹理映射技术了.														 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14545.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:38 <a href="http://www.cppblog.com/stevennash/articles/14545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 05[3D中的太阳]</title><link>http://www.cppblog.com/stevennash/articles/14544.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14544.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14544.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14544.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14544.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第五集 3D中的太阳																						 																																    3D虚拟世界是尽可能的模拟现实的, 所以在3D中没有光照是不行的. 前面的例子都是在没有光照的环境里直接由计算机给出物体表面不同点的光亮度和颜色的, 这是不现实的模拟.													...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14544.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:36 <a href="http://www.cppblog.com/stevennash/articles/14544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 04[动起来更精彩]</title><link>http://www.cppblog.com/stevennash/articles/14543.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14543.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14543.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14543.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 04[动起来更精彩]						第四集 动起来更精彩																						 																		左看, 右看, 上看, 都喜欢; 老板, 能不能把房子倒过来让我看看? 老板(汗!)														 						...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14543.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:32 <a href="http://www.cppblog.com/stevennash/articles/14543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 03[谁把我挡住了]</title><link>http://www.cppblog.com/stevennash/articles/14542.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:28:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14542.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14542.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14542.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 03[谁把我挡住了]						第三集 谁把我挡住了																						 																		现实中拍的照片中, 刚好按快门时, 有人从摄象机前走过, 结果照片中只能看到部分想照下来的。														 				...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14542.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:28 <a href="http://www.cppblog.com/stevennash/articles/14542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 02[并非3D的3D]</title><link>http://www.cppblog.com/stevennash/articles/14541.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:27:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14541.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14541.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14541.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14541.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 02[并非3D的3D]						第二集 并非3D的3D																						 																		我们开始展示3D的世界了， 好好复习一下几何吧。																						 											...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14541.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:27 <a href="http://www.cppblog.com/stevennash/articles/14541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Game Programming with DirectX -- 01[初识Direct3D]</title><link>http://www.cppblog.com/stevennash/articles/14540.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14540.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14540.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14540.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14540.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Game Programming with DirectX -- 01[初识Direct3D]						第一卷 朦胧的3D世界														 												第一集 初识Direct3D														 												简介								我们通过2个例子来简单的认识3D...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/14540.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/14540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:25 <a href="http://www.cppblog.com/stevennash/articles/14540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Game Programming with DirectX -- 00[序言]</title><link>http://www.cppblog.com/stevennash/articles/14539.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Wed, 01 Nov 2006 13:23:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/14539.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/14539.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/14539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/14539.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/14539.html</trackback:ping><description><![CDATA[
		<p align="center">Game Programming with DirectX -- 00[序言]<br /><br /></p>
		<h3>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">序言</span>
		</h3>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">我是数学出身的程序员,所以在这个系列中我会讲解很多的数学模型.<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">再有, 这个系列是以一个完整的3D游戏为背景的.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
				<h3>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">环境</span>
				</h3>
		</span>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<a href="http://www.microsoft.com/downloads/details.aspx?familyid=EDB98FFA-A59C-4C23-9B92-BA304F188314&amp;displaylang=en">
								<u>
										<font color="#0000ff">DirectX9c SDK</font>
								</u>
						</a>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">的编译环境是要求Windows XP, Windows Server 2003, Visual Studio .Net 2003 or 2005.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
				<h3>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">基础知识</span>
				</h3>
		</span>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">这个系列的基础知识 :<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">a. C/C++; 使用DirectX 的native API.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">b. Windows SDK programming skill.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">c. COM basic skill.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">d. 几何学和高等代数<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
				<h3>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">第零卷 简介</span>
				</h3>
		</span>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<strong>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.1 图形技术的发展</span>
				</strong>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.1.1 硬件的发展<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">    </span>我们可以从图0.1了解大致的过程.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">   </span>字符显示<span style="mso-spacerun: yes">                  </span>基于位图的图形<span style="mso-spacerun: yes">       </span>覆盖图<span style="mso-spacerun: yes">       </span>实时视频<span style="mso-spacerun: yes">          </span>AGP<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">    </span>-------------------------------------------------------------------------------------------&gt;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">    </span>Multiple/Soft 字体<span style="mso-spacerun: yes">           </span>图形协助处理器<span style="mso-spacerun: yes">                        </span>简单3D<span style="mso-spacerun: yes">               </span>高级3D<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">图0.1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.1.2 AGP的由来<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">    </span>随着硬件的发展, 显示卡有了自己的内存--显示内存, 图0.2显示了当时的硬件结构.</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
								<a href="http://img331.photo.163.com/jaredz/40686350/1097446388.jpg">
								</a>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes"> <img height="171" alt="" hspace="140" src="http://blog.csdn.net/images/blog_csdn_net/jaredz/193444/o_002.jpg" width="567" align="absMiddle" /></span>
				</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<?XML:NAMESPACE PREFIX = V /?>
						<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
								</v:path>
								<o:lock v:ext="edit" aspectratio="t">
								</o:lock>
						</v:shapetype>
				</span>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">图0.2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">系统扩展总线的一边是CPU和系统内存; 另一边是GPU和显示内存. 正象它们的名字的暗示一样, 在主板上的系统内存可以很轻易的被CPU访问, 但GPU却不能自由访问, GPU只能自由访问显示内存.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">如果GPU要系统内存中的数据, 必须由CPU负责从系统内存复制到显示内存,必须通过性能有限的扩展总线.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">于是主板就为GPU开了专线--AGP(图0.3), AGP的作用是给GPU访问系统内存开了后门, 在CPU不必知道的情况下自由访问.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">当扩展总线还是双道的普通公路时, AGP已经是8道的高速公路了.</span>
		</p>
		<p>
				<a href="http://img331.photo.163.com/jaredz/40686350/1097446514.jpg">
				</a>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">
						</span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
				</span>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<img height="190" alt="" hspace="140" src="http://blog.csdn.net/images/blog_csdn_net/jaredz/193444/o_003.jpg" width="567" align="absMiddle" />
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">图0.3<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.1.3 DirectX的由来<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">Windows图形显示操作系统在PC上有着辉煌的历史, Windows所提供的应用程序与硬件设备完全分离的特性使得程序员不必为不同的硬件在代码中加入不同的硬件依赖指令, 对于普通的应用程序这是个好想法; 但这个特性对游戏和多媒体程序员来说是个噩梦.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">为把应用程序与硬件设备完全分离, 在应用程序与硬件设备之间添加了N层的隔离, 你只能调用最上层的命令, 让最上层再依次调用它相邻的层, 这样一层一层往下调用, 到最下层后再通知硬件设备的驱动层, 驱动层才命令硬件设备为你的调用服务.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">------ 近在眼前但似远在天边...<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">图0.4为图形显示的层次调用</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<a href="http://img331.photo.163.com/jaredz/40686350/1097446603.jpg" target="_self">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						</span>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</a>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<a href="http://img331.photo.163.com/jaredz/40686350/1097446603.jpg">
						</a>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<img height="226" alt="" hspace="140" src="http://blog.csdn.net/images/blog_csdn_net/jaredz/193444/o_004.jpg" width="173" align="absMiddle" />
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">图0.4<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">于是又一专线来了--DirectX, 它是Windows系统下的游戏和多媒体专线, 如图0.5为图形显示DirectX Graphics</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<a href="http://img331.photo.163.com/jaredz/40686350/1097446736.jpg" target="_self">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						</span>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</a>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<a href="http://img331.photo.163.com/jaredz/40686350/1097446736.jpg">
						</a>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<img height="292" alt="" hspace="140" src="http://blog.csdn.net/images/blog_csdn_net/jaredz/193444/o_005.jpg" width="510" align="absMiddle" />
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">图0.5<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">DirectX Graphics的工作很简单, 如果硬件设备提供相应的硬件加速功能, 那就用硬件加速; 如果没有相应的硬件加速功能, </span>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">那就软件模拟; 之后就通知硬件设备的驱动层. <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.1.4 DirectX的Directness原理<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">a. 最快速<span style="mso-spacerun: yes">    </span>--- 同硬件厂商合作实现特定的硬件功能.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">b. 最短延迟<span style="mso-spacerun: yes">  </span>--- 达到子弹打到你时就能听到你的惨叫, 不会象恐龙一样N秒后才怪叫.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">c. 底层接口<span style="mso-spacerun: yes">  </span>--- 提供最基本的功能, 同样的游戏在不同创造性和革命性的程序员手里出来有本质的差别; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<span style="mso-spacerun: yes">                 </span>你能作出魔兽的效果吗? 为什么我们就不能呢?<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<strong>
						<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2 DirectX</span>
				</strong>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2.1 DirectX Components<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">前面废话了很多, 现在我们要结束跑题了. 我们首先来看看DirectX的组成模块,<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">a. DirectX Graphics<span style="mso-spacerun: yes">   </span>--- 图形模块<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">b. DirectX Input<span style="mso-spacerun: yes">      </span>--- 输入/控制模块<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">c. DirectX Audio<span style="mso-spacerun: yes">   </span><span style="mso-spacerun: yes">   </span>--- 音效模块</span>
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">d. DirectMusic<span style="mso-spacerun: yes">        </span>--- capture and play sounds模块<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">e. <s>DirectDraw</s><span style="mso-spacerun: yes">         </span>--- 被废弃, 由DirectX Graphics中的Direct3D接管 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">f. <s>DirectPlay</s><span style="mso-spacerun: yes">         </span>--- 被废弃, 由Windows Sockets代替<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">g. DirectShow<span style="mso-spacerun: yes">         </span>--- video and audio playback or capture模块, 不再是DirectX的模块, 由Platform接管<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">h. DirectSetup<span style="mso-spacerun: yes">        </span>--- 自动安装DirectX模块<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">我们主要讲解兰色的部分, 再包括算法和AI.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2.2 DirectX Graphics<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">这个模块只包括Direct3D.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">我们游戏显示的虚幻的世界都是由Direct3D来创建的, 这部分是最最主要的, 我们会化大半的时间来讲解如何展示你心中的梦想,以及你要用Direct3D来实现梦想要掌握的数学模型知识.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2.3 DirectX Input<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">这个模块只包括DirectInput和XInput. XInput是Xbox 360 连接到Windows PC后的控制的部分, 我们不讲解.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">如何控制游戏, 我们是通过DirectInput.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2.4 DirectX Audio<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">这个模块只包括DirectSound和XACT. 我们只讲解DirectSound.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2.5 算法和AI<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">这里将展示如何让虚拟的人物和怪物更人性化的在虚拟世界里活动.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 49.7pt" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 28.4pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">0.2.6 综合运用<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 49.7pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Verdana; mso-ansi-language: ZH-CN">结合上面的内容, 我们要建立一个完整的3D游戏.<o:p></o:p></span>
		</p>
<img src ="http://www.cppblog.com/stevennash/aggbug/14539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-11-01 21:23 <a href="http://www.cppblog.com/stevennash/articles/14539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 作一个阶段DirectX开发的总结</title><link>http://www.cppblog.com/stevennash/articles/13333.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:47:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13333.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13333.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13333.html</trackback:ping><description><![CDATA[[转] 作一个阶段DirectX开发的总结<br /><br /><p><span class="Title">/////////////////////////////////////////////////下面是头文件：</span></p><span class="Code"><p>//****************************************************************************<br />//说明： <br />//开发环境：Visual C++.NET 7.1.3091 DirectX 9.0C<br />//操作系统：WindowsXP SP2<br />//硬件：AMD Athlon XP 2500+,DDR400 256MB,Geforce4 MX440 AGP 8X 64MB<br />//****************************************************************************<br />//包含文件<br />#include&lt;d3d9.h&gt;<br />#include&lt;d3dx9.h&gt;<br />#include&lt;d3d9types.h&gt;<br />//资源文件<br />#pragma comment(lib,"d3d9.lib")<br />#pragma comment(lib,"d3dx9.lib")<br />#pragma comment(lib,"gdi32.lib")<br />#pragma comment(lib,"Winmm.lib")<br />//全局变量<br />HWND      hWnd;<br />LPDIRECT3D9     D3d9;<br />LPDIRECT3DDEVICE9   D3dDevice9;<br />//类声明<br />class CDirect3D<br />{<br />public:<br /> //变量<br /> LPDIRECT3DTEXTURE9   LPTexture;  //位图矩形的纹理对象接口指针<br /> LPDIRECT3DVERTEXBUFFER9  LPVB;  //位图矩形的顶点缓存区接口指针 <br /> //结构体<br /> //const D3DRECT *Pos;</p><p> typedef struct _POSITION<br /> {<br />  float x1, y1;<br />  float x2, y2;<br /> }POSITION;<br /> POSITION *Pos;</p><p>public:<br /> //函数<br /> CDirect3D();<br /> ~CDirect3D();<br /> void AddPicButton(float xPos,float yPos,LPCTSTR PicName,float xSize,float ySize);<br /> //void AddPicButton(long xPos,long yPos,LPCTSTR PicName,long xSize,long ySize);<br /> int  LoadXFile(LPCTSTR XFileName);<br /> void SetupMatrices();<br /> void Render(void);<br /> bool InitD3D(void);<br /> void CleanPic(void);<br /> void Clean3D(void);<br /> void SetLight();<br />private:<br /> LPD3DXMESH     m_pMesh;    //Mesh对象的接口指针<br /> D3DMATERIAL9    *m_pMeshMaterials;  //用于保存模型中各个子集的材质<br /> LPDIRECT3DTEXTURE9   *m_pMeshTextures;  //用于保存模型中各个子集的纹理<br /> DWORD      m_dwNumSubsets;   //模型中子集的数目<br /> //位图矩形的 FVF 格式：RHW 坐标、顶点颜色、纹理坐标 <br /> struct CUSTOMVERTEX <br /> { <br />  float x,y,z;  //顶点坐标 <br />  float tu,tv;  //纹理坐标 <br /> }; <br /> #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)</p><p>};</p><p></p><p></p><p></p><br /><span class="Title">////////////////////////////////////////////////////////////////////下面是实现文件：</span><p></p></span><p></p><p></p><br /><span class="Title">////////////////////////////////////////////////////////////////////下面是实现文件：</span><span class="Code"><p>//****************************************************************************<br />//说明： <br />//开发环境：Visual C++.NET 7.1.3091 DirectX 9.0C<br />//操作系统：WindowsXP SP2<br />//硬    件：AMD Athlon XP 2500+,DDR400 256MB,Geforce4 MX440 AGP 8X 64MB<br />//****************************************************************************<br />#include "Direct3D.h"<br />CDirect3D::CDirect3D()<br />{<br />}<br />CDirect3D::~CDirect3D()<br />{<br />}<br />bool CDirect3D::InitD3D()<br />{<br /> <br /> if(NULL==(D3d9=Direct3DCreate9(D3D_SDK_VERSION)))<br /> {<br />  ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);<br />  return FALSE;<br /> }<br /> <br /> //取得当前显示设备的显示模式<br />    D3DDISPLAYMODE d3ddm;<br />    if(D3D_OK!=(D3d9-&gt;GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&amp;d3ddm)))<br />   {<br />  ::MessageBox(0,"GetAdapterDisplayMode() - FAILED",0,0);<br />  return FALSE;<br /> }<br /> <br /> D3DPRESENT_PARAMETERS D3dpp;<br /> //设置D3D设备的属性<br /> ZeroMemory(&amp;D3dpp, sizeof(D3dpp));<br /> D3dpp.Windowed=false;//全屏<br /> D3dpp.hDeviceWindow=hWnd;//窗口设备的句柄<br /> D3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;// 设置交换模式<br /> D3dpp.BackBufferCount=1; //有一个后台缓存<br /> D3dpp.BackBufferWidth=d3ddm.Width;//屏幕宽度<br /> D3dpp.BackBufferHeight=d3ddm.Height;//屏幕长度<br /> //立即显示刷新后的图像<br /> D3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;<br /> D3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;//色彩深度<br /> //开启自动深度缓冲<br /> D3dpp.EnableAutoDepthStencil=true;<br /> D3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;//24位深度缓冲并保留8位模版缓冲（stencil buffer）<br /> //创建D3D设备<br /> if(D3D_OK!=(D3d9-&gt;CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&amp;D3dpp,&amp;D3dDevice9))) <br /> {<br />  ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);<br />  return FALSE;<br /> }<br /> return true;<br />}<br />void CDirect3D::AddPicButton(float xPos,float yPos,LPCTSTR PicName,float xSize,float ySize)<br />{<br /> Pos-&gt;x1=xPos;<br /> Pos-&gt;x2=yPos;<br /> Pos-&gt;y1=xPos+xSize;<br /> Pos-&gt;y2=yPos+ySize;<br /> //用蓝色清空背景区域<br />    D3dDevice9-&gt;Clear(1,(D3DRECT *)Pos,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);<br /> void* pVertices;<br /> //建立按钮的数学模型 <br /> CUSTOMVERTEX vertices[4] =   <br /> {<br />  {xPos,         yPos, 0,0.0f,0.0f},  <br />  {xPos,   yPos+ySize, 0,0.0f,1.0f}, <br />  {xPos+xSize, yPos+ySize, 0,1.0f,1.0f}, <br />  {xPos+xSize,    yPos, 0,1.0f,0.0f}<br /> };<br /> //创建位图矩形的顶点缓存区，填入顶点数据 <br /> D3dDevice9-&gt;CreateVertexBuffer(sizeof(vertices),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&amp;LPVB,NULL);<br /> LPVB-&gt;Lock( 0, sizeof(vertices),(void**)&amp;pVertices, 0 ); <br /> memcpy(pVertices,vertices, sizeof(vertices)); <br /> LPVB-&gt;Unlock(); </p><p> //创建纹理对象 <br /> ::D3DXCreateTextureFromFile(D3dDevice9, PicName, &amp;LPTexture );<br /> //因为二维图形使用顶点颜色或纹理渲染，所以关闭光照 <br /> D3dDevice9-&gt;SetRenderState( D3DRS_LIGHTING, FALSE ); <br /> //关闭 Z 缓存 <br /> D3dDevice9-&gt;SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );<br /> //加载纹理，纹理混合方式使用缺省值。由于使用顶点颜色渲染， <br /> //缺省的纹理混合方式＝纹理×顶点颜色。 <br /> D3dDevice9-&gt;SetTexture( 0, LPTexture ); <br /> //显示位图矩形 <br /> D3dDevice9-&gt;SetFVF( D3DFVF_CUSTOMVERTEX ); <br /> D3dDevice9-&gt;SetStreamSource( 0, LPVB, 0, sizeof(CUSTOMVERTEX) ); <br /> D3dDevice9-&gt;DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); <br /> D3dDevice9-&gt;SetTexture( 0, NULL );<br />}<br />void CDirect3D::SetLight()<br />{<br /> //创建一个白色的平行光<br /> D3DLIGHT9 light;<br /> ::ZeroMemory( &amp;light, sizeof(D3DLIGHT9) );<br /> light.Type = D3DLIGHT_DIRECTIONAL; //灯光类型<br /> light.Diffuse.r = 1.0f;<br /> light.Diffuse.g = 1.0f;<br /> light.Diffuse.b = 1.0f;<br /> light.Direction = D3DXVECTOR3( -1.0f, -1.0f, 0.0f );<br /> light.Range  = 1000.0f;    //灯光的作用范围<br /> D3dDevice9-&gt;SetLight( 0, &amp;light ); //设置灯光，参数1为灯光的索引号<br /> D3dDevice9-&gt;LightEnable( 0, TRUE ); //打开灯光，参数1为灯光的索引号</p><p> //设置环境光<br /> D3dDevice9-&gt;SetRenderState( D3DRS_AMBIENT, D3DCOLOR_RGBA(32,32,32,0) );<br />}<br />int CDirect3D::LoadXFile(LPCTSTR XFileName)<br />{<br /> //我们将通过该接口指针访问Mesh对象的材质和纹理<br /> LPD3DXBUFFER pD3DXMtrlBuffer;</p><p> //从.x文件创建Mesh对象<br /> if(FAILED(D3DXLoadMeshFromX("XFileName",D3DXMESH_SYSTEMMEM,D3dDevice9,NULL,&amp;pD3DXMtrlBuffer,NULL,&amp;m_dwNumSubsets,&amp;m_pMesh))) <br /> {<br />   ::MessageBox(0, "D3DXLoadMeshFromX() - FAILED", 0, 0);<br />   return FALSE;<br /> }<br /> m_pMeshMaterials = new D3DMATERIAL9[m_dwNumSubsets];<br /> m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumSubsets];</p><p> //从接口指针pD3DXMtrlBuffer获得各个子集的材质和纹理图片的文件名<br /> D3DXMATERIAL* d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer-&gt;GetBufferPointer();<br /> for( DWORD i=0;i&lt;m_dwNumSubsets;i++ )<br /> {<br />  //复制子集的材质<br />  m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;<br />  //Direct3D在调入Mesh模型时，没有设置材质的环境光颜色，<br />  //这里把它设置成和漫反射一样的颜色。<br />  m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;</p><p>  //调入纹理图片<br />  if(FAILED(D3DXCreateTextureFromFile(D3dDevice9,d3dxMaterials[i].pTextureFilename,&amp;m_pMeshTextures[i])))<br />  {<br />   ::MessageBox(0, "D3DXCreateTextureFromFile() - FAILED", 0, 0);<br />   return FALSE;<br />  }<br /> }<br /> pD3DXMtrlBuffer-&gt;Release(); //释放接口<br /> return 1;<br />}<br />void CDirect3D::SetupMatrices()<br />{<br /> <br />    D3DXMATRIX matWorld;<br />    UINT  iTime  = timeGetTime() % 5000;<br />    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 5000.0f;//把旋转角换算成弧度<br />    D3DXMatrixRotationY( &amp;matWorld, fAngle );//计算世界变换矩阵<br />    D3dDevice9-&gt;SetTransform( D3DTS_WORLD, &amp;matWorld );//把世界变换矩阵设置到渲染环境<br /> </p><p>    D3DXVECTOR3 vEyePt( 0.0f, 15.0f,-25.0f );//观察点<br />    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );//视线目标点<br />    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );//上方向<br />    D3DXMATRIX matView;<br />    D3DXMatrixLookAtLH( &amp;matView, &amp;vEyePt, &amp;vLookatPt, &amp;vUpVec );//计算视角变换矩阵<br />    D3dDevice9-&gt;SetTransform( D3DTS_VIEW, &amp;matView );//把视角变换矩阵设置到渲染环境</p><p>    D3DXMATRIX matProj;<br />    D3DXMatrixPerspectiveFovLH( &amp;matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );//计算透视投影变换矩阵<br />    D3dDevice9-&gt;SetTransform( D3DTS_PROJECTION, &amp;matProj );//把投影变换矩阵设置到渲染环境<br />}<br />void CDirect3D::Render()<br />{ <br /> //用蓝色清空背景区域<br />    D3dDevice9-&gt;Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);<br /> // 开始绘制场景 <br />    if(SUCCEEDED(D3dDevice9-&gt;BeginScene()))<br />    { <br />  SetupMatrices();//设置变换矩阵<br />  SetLight(); //设置灯光</p><p> for( DWORD i=0; i &lt; m_dwNumSubsets; i++ )<br />  {<br />   //设置子集的材质<br />   D3dDevice9-&gt;SetMaterial( &amp;m_pMeshMaterials[i] );<br />   //设置子集的纹理，混合方式使用缺省值：纹理 × 材质的漫反射<br />   D3dDevice9-&gt;SetTexture( 0, m_pMeshTextures[i] );<br />   //绘制子集<br />   m_pMesh-&gt;DrawSubset( i );<br />   D3dDevice9-&gt;SetTexture( 0, NULL);<br />   }<br />  }<br />  // 结束场景绘制<br />     D3dDevice9-&gt;EndScene();<br />  // 显示到屏幕上<br />     D3dDevice9-&gt;Present(NULL,NULL,NULL,NULL);<br />}<br />void CDirect3D::CleanPic(void)<br />{<br /> if(LPTexture!=NULL)<br />  LPTexture-&gt;Release();   //释放纹理对象</p><p> if(LPVB!=NULL)<br />  LPVB-&gt;Release();  //释放位图矩形的顶点缓存区 </p><p>}<br />void CDirect3D::Clean3D(void)<br />{<br /> if(D3dDevice9!=NULL) <br />       D3dDevice9-&gt;Release();</p><p>    if(D3d9!=NULL)       <br />       D3d9-&gt;Release();<br />}</p></span><img src ="http://www.cppblog.com/stevennash/aggbug/13333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:47 <a href="http://www.cppblog.com/stevennash/articles/13333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[引] 建立自己的3D静态模型文件</title><link>http://www.cppblog.com/stevennash/articles/13332.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:46:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13332.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13332.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13332.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000080">[引] 建立自己的3D静态模型文件<br /><br /><font color="#000000">跟着我一步一步来吧（我的思路和过程）。<br />我有一个能画出微软例子中tiger.x的工程，其中创建Mesh的代码片断如下（代码中有一些变量在.h文档中定义的）：<br />  HRESULT CMyMesh::Create( LPDIRECT3DDEVICE9 pDevice, string MeshFile )<br />  {<br />    if( pDevice == NULL ) <br />      return E_FAIL; </font></font>
		</p>
		<p>    LPD3DXBUFFER pD3DXMtrlBuffer;<br />    if( FAILED( D3DXLoadMeshFromX( MeshFile.c_str(), D3DXMESH_SYSTEMMEM, pDevice, NULL, &amp;pD3DXMtrlBuffer, NULL, &amp;NumOfMaterials, &amp;Mesh ) ) )<br />      return E_FAIL;<br />    <br />    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer-&gt;GetBufferPointer();<br />    MeshMaterials = new D3DMATERIAL9[NumOfMaterials];<br />    MeshTextures  = new LPDIRECT3DTEXTURE9[NumOfMaterials];</p>
		<p>    for( DWORD i = 0; i &lt; NumOfMaterials_; i ++ )<br />    {<br />      MeshMaterials[i] = d3dxMaterials[i].MatD3D;<br />      MeshMaterials[i].Ambient = MeshMaterials[i].Diffuse;<br />      MeshTextures[i] = NULL;<br />      if( d3dxMaterials[i].pTextureFilename != NULL &amp;&amp; lstrlen(d3dxMaterials[i].pTextureFilename) &gt; 0 )<br />      {<br />        if( FAILED( D3DXCreateTextureFromFile( pDevice, d3dxMaterials[i].pTextureFilename, &amp;MeshTextures[i] ) ) )<br />          return E_FAIL;<br />      }<br />    }</p>
		<p>    pD3DXMtrlBuffer-&gt;Release();<br />    return S_OK;<br />  }</p>
		<p>画这个Mesh的代码如下：<br />  void CMyMesh::Render( LPDIRECT3DDEVICE9 pDevice )<br />  {<br />    for( DWORD i = 0; i &lt; NumOfMaterials; i ++ )<br />    {<br />      pDevice-&gt;SetMaterial( &amp;MeshMaterials[i] );<br />      pDevice-&gt;SetTexture( 0, MeshTextures[i] );</p>
		<p>      Mesh-&gt;DrawSubset( i );<br />    }<br />  }<br />  <br />我们先想办法替换DrawSubset函数，代码如下：<br />  void CMyMesh::Render( LPDIRECT3DDEVICE9 pDevice )<br />  {<br />  LPDIRECT3DVERTEXBUFFER9 pVertexBuffer;<br />  LPDIRECT3DINDEXBUFFER9 pIndexBuffer;<br />  DWORD dwNumBytesPerVertex;<br />  DWORD dwFVF;<br />  DWORD dwNumVertex;<br />  DWORD dwFaces;<br />  Mesh-&gt;GetVertexBuffer(&amp;pVertexBuffer);<br />  Mesh-&gt;GetIndexBuffer(&amp;pIndexBuffer);<br />  dwNumBytesPerVertex = Mesh-&gt;GetNumBytesPerVertex();<br />  dwFVF = Mesh-&gt;GetFVF();<br />  dwNumVertex = Mesh-&gt;GetNumVertices();<br />  dwFaces = Mesh-&gt;GetNumFaces();</p>
		<p>  pDevice-&gt;SetStreamSource(0, pVertexBuffer, 0, dwNumBytesPerVertex);<br />  pDevice-&gt;SetFVF(dwFVF);<br />  pDevice-&gt;SetTexture(0, MeshTextures[0]);<br />  pDevice-&gt;SetMaterial(&amp;MeshMaterials[0]);<br />  pDevice-&gt;SetIndices(pIndexBuffer);<br />  pDevice-&gt;DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, dwNumVertex, 0, dwFaces);<br /> }<br /> <br />虽然MeshTextures和MeshMaterials处有点问题，但是我们知道了画tiger.x的时候都需要什么东西：<br />VB,IB,NumBytesPerVertex,FVF,NumVertex,Faces,Texture,Material<br />那么我们将这些东西保存到文件中，不就和.x文件目的相同了么， 并且可以绕过D3DXMesh了。那么这些东西怎么得到呢：我修改了Create部分的代码：</p>
		<p>  HRESULT CMyMesh::Create( LPDIRECT3DDEVICE9 pDevice, string MeshFile )<br />  {<br />    if( pDevice == NULL ) <br />      return E_FAIL;</p>
		<p>    LPD3DXBUFFER pD3DXMtrlBuffer;<br />    if( FAILED( D3DXLoadMeshFromX( MeshFile.c_str(), D3DXMESH_SYSTEMMEM, pDevice, NULL, &amp;pD3DXMtrlBuffer, NULL, &amp;NumOfMaterials, &amp;Mesh ) ) )<br />      return E_FAIL;<br />    <br />    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer-&gt;GetBufferPointer();<br />    MeshMaterials = new D3DMATERIAL9[NumOfMaterials];<br />    MeshTextures  = new LPDIRECT3DTEXTURE9[NumOfMaterials];</p>
		<p>    for( DWORD i = 0; i &lt; NumOfMaterials_; i ++ )<br />    {<br />      MeshMaterials_[i] = d3dxMaterials[i].MatD3D;<br />      MeshMaterials_[i].Ambient = MeshMaterials_[i].Diffuse;<br />      MeshTextures_[i] = NULL;<br />      if( d3dxMaterials[i].pTextureFilename != NULL &amp;&amp; lstrlen(d3dxMaterials[i].pTextureFilename) &gt; 0 )<br />      {<br />          FILE* fp;<br />          int nLen = 0;<br />          char* pBuf;<br />          if(fp=fopen( d3dxMaterials[i].pTextureFilename, "rb" )) {<br />          fseek(fp,0,SEEK_END);<br />          nLen = ftell(fp);<br />          fseek(fp,0,SEEK_SET);<br />          pBuf = new char[nLen];<br />          fread(pBuf,1,nLen,fp);<br />          fclose(fp);<br />        }<br />        HRESULT hr = D3DXCreateTextureFromFileInMemory(D3DDevice,pBuf,nLen,&amp;MeshTextures[i]);<br />        delete [] pBuf;</p>
		<p>    //HRESULT hr = D3DXCreateTextureFromFile( D3DDevice_, d3dxMaterials[i].pTextureFilename, &amp;MeshTextures_[i] );<br />        if( FAILED( hr ) )<br />          return E_FAIL;<br />      }<br />    }<br /></p>
		<p>    <br />    //下面是增加的内容<br />    FILE* fp;<br />    if( ( fp = fopen("tiger.o","w") ) != NULL ) {<br />   LPDIRECT3DVERTEXBUFFER9 pVertexBuffer;<br />   LPDIRECT3DINDEXBUFFER9 pIndexBuffer;<br />   D3DVERTEXBUFFER_DESC desc;<br />   D3DINDEXBUFFER_DESC idesc;<br /> <br />   Mesh-&gt;GetVertexBuffer(&amp;pVertexBuffer);<br />   Mesh-&gt;GetIndexBuffer(&amp;pIndexBuffer);<br />   pVertexBuffer-&gt;GetDesc( &amp;desc );<br />   pIndexBuffer-&gt;GetDesc( &amp;idesc );<br /> <br />   VOID* pVBData = NULL;<br />   VOID* pIBData = NULL;<br />   <br />   pVertexBuffer-&gt;Lock( 0, 0, (VOID**)&amp;pVBData, 0 );<br />   pIndexBuffer-&gt;Lock( 0, 0, (VOID**)&amp;pIBData, 0 );<br />   <br />   DWORD dwFVF = Mesh-&gt;GetFVF();<br />   DWORD dwNumBytesPerVertex = Mesh-&gt;GetNumBytesPerVertex();<br />   DWORD dwNumFaces = Mesh-&gt;GetNumFaces();<br />   <br />   //怎么样？该有的都有了吧，要怎么保存就看你的了<br />   //这段代码显然不完善，你需要自己去完善它<br />   //有人说了你光考虑了Mesh，还有多AnimationSet等等东西呢？<br />   //这里本来就只是建立静态模型，当然没有AnimationSet啦。动画的部分我后面在写吧。<br />   <br />   pVertexBuffer-&gt;UnLock();<br />   pIndexBuffer-&gt;UnLock();<br />   <br />   fclose(fp);<br />    }<br />    //增加结束</p>
		<p>    pD3DXMtrlBuffer-&gt;Release();<br />    return S_OK;<br />  }<br />  </p>
<img src ="http://www.cppblog.com/stevennash/aggbug/13332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:46 <a href="http://www.cppblog.com/stevennash/articles/13332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] DirectX 图形接口指南</title><link>http://www.cppblog.com/stevennash/articles/13331.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:42:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13331.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13331.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13331.html</trackback:ping><description><![CDATA[[转] DirectX 图形接口指南<br /><br /><strong>DirectX 图形接口指南 </strong><font size="2"><br />                                        作者：译：In355Hz <br /><br /><br />译者申明：<br /><br />这些指南是我在阅读 DirectX8.1 SDK 中逐步翻译出来的。对于初次接触 DirectX Graphics 的编程者而言，这应该是很好的上手资料。其实，本人就是从这些指南开始深入 Direct3D8.1 的；由于这是本人第一次翻译英文材料，言语不通，词不达意之处一定很多，一些术语也译得很勉强，请见谅。<br /><br />此外，需要转载此文者，请保留以下部分：<br /><br />-----------------------------------------------------------------------<br /><br />DirectX图形接口指南 译者：In355Hz 电子邮箱： In355Hz@hotmail.com<br /><br />-----------------------------------------------------------------------<br /><br />DirectX 图形接口指南：（应用于 DirectX 8.1 版 C/C++ 编程） <br />本区域的指南将说明如何在 C/C++ 程序中使用 Microsoft Direct3D 和 Direct3DX 完成一些普通的工作。这些工作总是被分解成若干个必要的步骤。在某些情况下，为了使表达更清楚，一些步骤还被细分成几个子步骤。 <br /><br />本区域提供的指南有：<br /><br /><br />· 指南一：创建设备 <br /><br />· 指南二：演示顶点 <br /><br />· 指南三：使用矩阵 <br /><br />· 指南四：创建和使用光源 <br /><br />· 指南五：使用纹理映射 <br /><br />· 指南六：使用Mesh模型 <br /><br /><br />提示：指南中出现的示例代码来自于每个指南具体提供的路径里的源文件。 <br /><br /><br />这些指南中的源代码是用 C++ 写成的。如果使用C编译器，你必须适当的改变这些文件使它们能够编译通过。最少的，你需要加入 vtable 然后用它引用接口函数。 <br /><br />包含在示例代码中的一些注解可能与来自 Microsoft Platform Software Development Kit (SDK) 中的源代码不同。这些改变仅仅为了简化表述并且只限于注解中，这样能够防止示例程序的行为被改变。<br /><br /><br />指南一：创建设备 <br /><br />为了使用 Microsoft Direct3D，你首先需要创建一个应用程序窗口，并紧接着创建和初始化 Direct3D 对象。你应该使用这些对象提供的 COM 接口来操纵它们，以及创建描绘一个场景所必需的其它对象。本指南包含的 CreateDevice 示例将例示并说明以下几个工作：创建 Direct3D 设备并且绘制一个简单的蓝色屏幕。 <br /><br />这个指南使用以下步骤：初始化 Direct3D，绘制场景，以及最后清理与关闭。 <br /><br /><br />·步骤一：创建一个窗口 <br /><br />·步骤二：初始化 Direct3D <br /><br />·步骤三：处理系统消息 <br /><br />·步骤四：绘制与显示场景 <br /><br />·步骤五：关闭与清除 <br /><br /><br />注意：CreateDevice 示例程序的路径在： <br /><br />(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut01_CreateDevice. <br /><br /><br />步骤一：创建一个窗口<br /><br />任何 Microsoft Windows 程序执行中必须要作的第一件事就是创建一个应用程序窗口并将其显示给用户。为做到这点，CreateDevice 例程将首先实现它的 WinMain 函数。以下示例代码完成了窗口的初始化。 <br /><br />INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) <br /><br />{ <br /><br />// Register the window class. <br /><br />WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, <br /><br />GetModuleHandle(NULL), NULL, NULL, NULL, NULL, <br /><br />"D3D Tutorial", NULL }; <br /><br />RegisterClassEx( &amp;wc ); <br /><br /><br />// Create the application's window. <br /><br />HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", <br /><br />WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, <br /><br />GetDesktopWindow(), NULL, wc.hInstance, NULL ); <br /><br /><br />前述示例代码是标准的 Windows 编程。例子开始时定义和注册了一个窗口类名为 "D3D Tutorial"。类注册以后，示例代码使用已注册的类创建了一个基本的顶层（top-level）窗口，客户区域为 300 像素宽，300 像数高。这个窗口没有菜单或子窗口。示例使用了 WS_OVERLAPPEDWINDOW 属性创建一个包括最大化，最小化，以及关闭按钮的普通窗口。（如果该例程将运行在全屏模式下，首选的窗口属性应该是WS_EX_TOPMOST，它指定创建的窗口置于并且保持在所有非最高（non-topmost）窗口之前，甚至在窗口失活的情况下。）一旦窗口创建完成，例代码调用标准的 Microsoft Win32 函数显示和更新窗口。 <br /><br /><br />在应用程序窗口准备好以后，你就能开始设置具体的 Microsoft Direct3D 对象了， <br /><br />请见：步骤二：初始化 Direct3D <br /><br /><br />步骤二：初始化 Direct3D <br /><br />CreateDevice 示例在 WinMain 中创建窗口之后，调用该程序定义的函数 InitD3D 完成 Microsoft Direct3D 初始化过程。在创建窗口之后，程序已经准备好初始化你将用来绘制场景的 Direct3D 对象了。这个过程包括创建一个 Direct3D 对象，设置Present Parameters，以及最后创建 Direct3D 设备。 <br /><br />创建完 Direct3D 对象之后，你可以立即使用 IDirect3D8::CreateDevice 方法创建 Direct3D 设备。你也能够使用 Direct3D 对象枚举设备，类型，模式以及其他东西。这些工作的代码段应位于使用 Direct3DCreate8 函数创建 Direct3D 对象之后。 <br /><br />if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) <br /><br />return E_FAIL; <br /><br /><br />传递给 Direct3DCreate8 的唯一参数应该始终是 D3D_SDK_VERSION，它告诉 Direct3D 当前使用的头文件信息。无论如何，头文件或者其他的变化将导致这个值增加并强制使用该值的应用程序重新编译。如果此版本不匹配，调用 Direct3DCreate8 将失败。 <br /><br /><br />下一个步骤是使用 IDirect3D8::GetAdapterDisplayMode 接口找到当前的显示模式，代码如下： <br /><br /><br />D3DDISPLAYMODE d3ddm; <br /><br />if( FAILED( g_pD3D-&gt;GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &amp;d3ddm ) ) ) <br /><br />return E_FAIL; <br /><br /><br />D3DDISPLAYMODE 结构中的 Format 变量将被用于创建 Direct3D 设备。如果是运行于窗口模式下的话，Format 参数通常用来创建一个与适配器当前模式相匹配的后背缓冲 (Back buffer)。 <br /><br /><br />在给 D3DPRESENT_PARAMETERS 各参数赋值时，你必须指定你的应用程序在3D下工作的方式。本 CreateDevice 例程设置D3DPRESENT_PARAMETERS结构中 Windowed 为 TRUE，SwapEffect 为 D3DSWAPEFFECT_DISCARD，BackBufferFormat 为 d3ddm.Format。 <br /><br /><br />D3DPRESENT_PARAMETERS d3dpp; <br /><br />ZeroMemory( &amp;d3dpp, sizeof(d3dpp) ); <br /><br />d3dpp.Windowed = TRUE; <br /><br />d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; <br /><br />d3dpp.BackBufferFormat = d3ddm.Format; <br /><br /><br />最后一步，是利用 IDirect3D8::CreateDevice 函数创建 Direct3D 设备，代码如下： <br /><br />if( FAILED( g_pD3D-&gt;CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, <br /><br />D3DCREATE_SOFTWARE_VERTEXPROCESSING, <br /><br />&amp;d3dpp, &amp;g_pd3dDevice ) ) ) <br /><br /><br />前述代码使用 D3DADAPTER_DEFAULT 标志创建了一个使用省缺适配器的设备。在非常多数的情况下，系统只有一个适配器，除非它安装了多个图形加速卡。通过把 DeviceType 参数设成 D3DDEVTYPE_HAL，表示你希望获得一个实际硬件设备 (hardware device) 而不是软件虚拟设备 (software device)。示例代码还使用 D3DCREATE_SOFTWARE_VERTEXPROCESSING 标志通知系统使用软件顶点处理 (software vertex processing)。注意，如果你指定 D3DCREATE_HARDWARE_VERTEXPROCESSING 标志通知系统使用硬件顶点处理 (hardware vertex processing),你可以在支持硬件顶点处理的图形加速卡上得到大幅度的性能提升。 <br /><br /><br />现在 Direct3D 已经初始化完毕，下一步是确保你的程序具有一个机制用来来处理系统消息， <br /><br />见下文：步骤三：处理系统消息 <br /><br /><br />步骤三：处理系统消息 <br /><br />完成创建程序窗口以及初始化 Direct3D 以后，你已经准备好绘制场景 (Render scene)。大多数情况下，Microsoft Windows 程序在它们的消息循环里监视系统消息，并且在队列里没有消息时绘制画面帧。然而，CreateDevice 例程仅仅在等到一个WM_PAINT出现在队列里时，才通知应用程序重绘窗口的所有部分。 <br /><br />// The message loop. <br /><br />MSG msg; <br /><br />while( GetMessage( &amp;msg, NULL, 0, 0 ) ) <br /><br />{ <br /><br />TranslateMessage( &amp;msg ); <br /><br />DispatchMessage( &amp;msg ); <br /><br />} <br /><br />当每循环一次，DispatchMessage 调用 MsgProc，后者负责处理队列里的消息，当 WM_PAINT 消息进队时，调用该程序自身定义的函数 Render()，它将负责重绘窗口。然后 Microsoft Win32 函数 ValidateRect 执行并将整个客户区域设为有效。 <br /><br />消息处理函数的例代码如下： <br /><br />LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) <br /><br />{ <br /><br />switch( msg ) <br /><br />{ <br /><br />case WM_DESTROY: <br /><br />PostQuitMessage( 0 ); <br /><br />return 0; <br /><br />case WM_PAINT: <br /><br />Render(); <br /><br />ValidateRect( hWnd, NULL ); <br /><br />return 0; <br /><br />} <br /><br />return DefWindowProc( hWnd, msg, wParam, lParam ); <br /><br />} <br /><br /><br />现在，应用程序处理了系统消息，接着的一步是绘制显示，见：步骤四：绘制与显示场景 <br /><br />步骤四：绘制与显示场景 <br /><br />为了描绘和显示需要的场景，本例程在这一步把后背缓冲 (back buffer) 填充为蓝色，然后将此后背缓冲的内容传给前景缓冲 (front buffer), 并且将前景缓冲提交至屏幕。 <br /><br />清除表面，应调用 IDirect3DDevice8::Clear 函数： <br /><br />// Clear the back buffer to a blue color <br /><br />g_pd3dDevice-&gt;Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ); <br /><br />Clear() 接受的前两个参数通知 Microsoft Direct3D 被清除的矩形区域数组的基址和大小，该矩形区域数组描述了绘制目标表面 (render target surface) 里需要清除的区域。 <br /><br />在大多数情况下，只使用单个矩形覆盖整个绘制目标表面。这样你只需设置第一个参数为 0 及第二个参数为 NULL。第三个参数将决定方法的行为，你可以通过设置特定的标志用来清除绘制目标表面 (render target surface)，关联的Z缓冲 (associated depth buffer)，模版缓冲 (stencil buffer)，以及任意这三者的混合。本指南不使用Z缓冲，所以仅仅使用了 D3DCLEAR_TARGET 标志。最后三个参数分别用于设置对应绘制目标表面、Z缓冲和模版缓冲的清除填充值 (reflect clearing values)。该 CreateDevice 例程将绘制目的表面的清除填充色设置为蓝色 (D3DCOLOR_XRGB(0,0,255)。由于相应的标志没有设置，最后两个参数被 Clear() 忽略。 <br /><br />在清除了视口 (viewport) 之后，CreateDevice 例程告知 Direct3D 绘图将要开始，然后立即通知这次绘制完成，见以下代码段： <br /><br />// Begin the scene. <br /><br />g_pd3dDevice-&gt;BeginScene(); <br /><br />// Rendering of scene objects happens here. <br /><br />// End the scene. <br /><br />g_pd3dDevice-&gt;EndScene(); <br /><br />当绘制开始或完成时，IDirect3DDevice8::BeginScene 和 IDirect3DDevice8::EndScene 函数将用信号通知系统。你只能在这两函数之间调用其它的绘图函数。即使调用绘图函数失败，你也应该在重新调用 BeginScene 之前调用 EndScene。 <br /><br />绘制完之后，调用 IDirect3DDevice8::Present显示该场景： <br /><br />g_pd3dDevice-&gt;Present( NULL, NULL, NULL, NULL ); <br /><br />Present() 接受的前两个参数是原始矩形和目标矩形。在这一步，例程设置这两个参数为 NULL 并把整个后备缓冲提交到前景缓冲。第三个参数用于设置该次提交的目标窗口。因为这个参数被设为 NULL，实际使用的窗口是 D3DPRESENT_PARAMETERS 的 hWndDeviceWindow 成员。第四个是 DirtyRegion 参数，在绝大多数情况下应该设为 NULL。 <br /><br />本指南的最终步骤是关闭应用程序，见：步骤五：关闭与清除 <br /><br />步骤五：关闭与清除 <br /><br />在执行的若干时刻，你的应用程序必须立即关闭。关闭一个 Direct3D 应用程序中不只是意味着你必须销毁程序窗口，并且你还要释放程序中使用过的的任何 Direct3D 对象并且无效化它们的指针。当收到一个 WM_DESTROY 消息时，CreateDevice 例程通过调用一个本地定义的函数 Cleanup() 来处理这些工作。 <br /><br />VOID Cleanup() <br /><br />{ <br /><br />if( g_pd3dDevice != NULL) <br /><br />g_pd3dDevice-&gt;Release(); <br /><br />if( g_pD3D != NULL) <br /><br />g_pD3D-&gt;Release(); <br /><br />} <br /><br />上述函数对每个对象调用 IUnknown::Release 方法来释放它们自身。由于DirectX遵循 COM 规则，大多数对象当其引用计数降为0时，DirectX会自动的从内存中释放这个对象。 <br /><br />对于其他关闭程序情况，可能发生在程序的平常执行中——比如用户改变了桌面的参数或色深——此时你可能需要撤销和重建使用中的 Microsoft Direct3D 对象。因此一个好的主意就是将你的释放代码放到一起，以便能在需要时随时调用它。 <br /><br />本指南已经说明了如何创建一个设备，指南二：演示顶点(Render Vertex) ，将告诉你如何用顶点（Vertex）创建几何形体。 <br /><br />指南二：演示顶点(Render Vertex) <br /><br />Microsoft Direct3D 写的应用程序使用顶点(Vertex)构造几何物体。每一个三维空间 (3D) 场景包括一个或几个这样的几何物体。Vertices 例程构造简单的物体，一个三角形，并且将它绘制到显示屏上。 <br /><br />本指南说明如何采用以下步骤从顶点构造一个三角形： <br /><br /><br />·第一步：定义一个自定义顶点类型 <br /><br />·第二步：设置顶点缓冲 <br /><br />·第三步：绘制至显示屏 <br /><br />注意：Vertices 示例程序的路径为： <br /><br />(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut02_Vertices. <br /><br />Vertices 程序的示例代码与 CreateDevice 的代码大部分相同。本“演示顶点（Render Vertex）”指南仅仅关注于那些独特的，关于顶点的代码而不包括初始化 Direct3D，处理 Microsoft Windows 消息，绘图，与清理等工作。如要得到有关这些任务的信息，请参考 指南一：创建设备。 <br /><br />第一步：定义一个自定义顶点类型 <br /><br />Vertices 例程使用三个顶点构造一个 2D 的三角形。这里提及了顶点缓冲的概念，这是用于保存和演示大量顶点的 Microsoft Direct3D 对象。通过指定一个自定义的顶点结构和相应的可变向量格式 (FVF)，顶点能够采用很多方法定义。本 Vertices 例程使用的顶点格式定义于以下代码片断中。 <br /><br />struct CUSTOMVERTEX <br /><br />{ <br /><br />FLOAT x, y, z, rhw; // The transformed position for the vertex. <br /><br />DWORD color; // The vertex color. <br /><br />}; <br /><br />上面的结构体说明了自定义顶点类型的格式。下一步是定义 FVF 以描述顶点缓冲区中的顶点内容。以下代码片段定义了一个 FVF 并符合此上建立的自定义顶点类型。 <br /><br />#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) <br /><br />可变顶点格式标记描述了使用中的自定义顶点类型。前述示例代码使用了 D3DFVF_XYZRHW 和 D3DFVF_DIFFUSE 标志，这将告诉顶点缓冲，自定义顶点类型包含一组转换过的点坐标并紧跟着一个颜色参数。 <br /><br />现在自定义向量格式和 FVF 已经被指定好了，下一步将使用顶点填充顶点缓冲区，请参看：第二步：设置顶点缓冲 。 <br /><br />注意：Vertices 例程中的顶点是转换过的。用另一句话说，它们已经在 2D 窗口坐标系下。这意味着座标点 (0,0) 位于左上角，且正的 x 半轴向右，正的 y 半轴向下。这些顶点同样也是光照过的，这说明它们的着色不通过 Direct3D 照明而由它们自己的颜色代替。 <br /><br />第二步：设置顶点缓冲 <br /><br />现在自定义顶点格式已经完成，初始化顶点的时候到了。 Vertices 例程创建了必需的 Microsoft Direct3D 对象之后调用本程序内部定义的函数 InitVB() 进行这个工作。以下代码段将初始化三个自定义顶点的值。 <br /><br />CUSTOMVERTEX g_Vertices[] = <br /><br />{ <br /><br />{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color <br /><br />{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, <br /><br />{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, <br /><br />}; <br /><br />前述代码片段采用三角形的三个顶点填充三个Vertex并指定了每个顶点的散射光的颜色。第一个顶点位于 (150,50) ，散射红色 (0xffff0000)。第二个顶点位于 (250,250) ，为绿色 (0xff00ff00)。第三点位于 (50,250) 并散射蓝绿色 (0xff00ffff)。每一点都具有相同的 0.5 Z值及 1.0 的 RHW 参数。关于这些矢量格式的其它信息见 SDK: Transformed and Lit Vertices。 <br /><br />下一步将调用 IDirect3DDevice8::CreateVertexBuffer 创建顶点缓冲区，如以下代码段所示： <br /><br />if( FAILED( g_pd3dDevice-&gt;CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), <br /><br />0 /* Usage */, D3DFVF_CUSTOMVERTEX, <br /><br />D3DPOOL_DEFAULT, &amp;g_pVB ) ) ) <br /><br />return E_FAIL; <br /><br />CreateVertexBuffer 的头两个参数告诉 Direct3D 新顶点缓冲区预计的大小和用法。紧跟的两个参数指定新缓冲区的矢量格式及存储位置。这里的向量格式是 D3DFVF_CUSTOMVERTEX，就是例程先前定义的 FVF 值。D3DPOOL_DEFAULT 标记告诉 Direct3D 在最合适的位置创建此顶点缓冲区。最后一个参数返回创建完成的顶点缓冲区对象地址。 <br /><br />创建了顶点缓冲区之后，如以下代码段所示，开始采用自定义格式的顶点填充缓冲区中的数据。 <br /><br />VOID* pVertices; <br /><br />if( FAILED( g_pVB-&gt;Lock( 0, sizeof(g_Vertices), (BYTE**)&amp;pVertices, 0 ) ) ) <br /><br />return E_FAIL; <br /><br />memcpy( pVertices, g_Vertices, sizeof(g_Vertices) ); <br /><br />g_pVB-&gt;Unlock(); <br /><br /><br />首先调用 IDirect3DVertexBuffer8::Lock 锁定顶点缓冲区。函数第一个参数是锁定顶点数据的偏移量，按字节计算。第二个参数是需锁定的顶点数据长度，同样按字节计算。第三个参数是一个 BYTE 类型指针的地址，用于返回指向顶点数据的地址。第四个参数告知顶点缓冲区如何锁定数据。 <br /><br />通过使用 memcpy，顶点被复制到顶点缓冲区里。将顶点放入缓冲区之后，调用一次 IDirect3DVertexBuffer8::Unlock 以解锁顶点缓冲区。这个锁定——解锁机制是必需的，因为正在使用的顶点缓冲区可能位于设备内存中。 <br /><br />现在顶点缓冲区已经填入顶点，绘制到显示的时候到了，见描述：第三步：绘制至显示屏 。 <br /><br />第三步：绘制至显示屏 <br /><br />现在缓冲区已经填入顶点，现在需要把它绘制到显示屏上。在绘制到屏幕之前，先将背景清除为蓝色并调用 BeginScene。 <br /><br />g_pd3dDevice-&gt;Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L ); <br /><br />g_pd3dDevice-&gt;BeginScene(); <br /><br />从顶点缓冲区绘制顶点数据需要一些步骤。首先，你需要设置流数据源；在当前情况下，使用第 0 个流 。流的数据源是通过调用 IDirect3DDevice8::SetStreamSource 设置的。 <br /><br />g_pd3dDevice-&gt;SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) ); <br /><br />SetStreamSource 的第一个参数告诉 Microsoft Direct3D 设备设置数据流的索引。第二个参数是绑定在该数据流上的顶点缓冲区。第三个参数是数据单元的大小，用字节数表示。在上面的示例代码中，将使用CUSTOMVERTEX 的大小作为数据单元的大小。 <br /><br />下一步通过调用 IDirect3DDevice8::SetVertexShader 使 Direct3D 了解使用中的顶点处理器（Vertex Shader）。就整体而言，自定义顶点处理器是一种高级的话题，但是在绝大多数情况下顶点处理器仅仅等于 FVF 代码。这能够让 Direct3D 知道处理中的顶点类型。以下代码片段将FVF设置为当前顶点处理器： <br /><br />g_pd3dDevice-&gt;SetVertexShader( D3DFVF_CUSTOMVERTEX ); <br /><br />SetVertexShader() 唯一的参数是当前设置的顶点处理器的句柄。这个参数的值可以是从IDirect3DDevice8::CreateVertexShader 返回的句柄，或者是 FVF 代码。在这儿，使用的参数是定义为 D3DFVF_CUSTOMVERTEX 的 FVF 代码。 <br /><br />关于顶点处理器的更多信息，请见 SDK: Vertex Shader 一章。 <br /><br />下一步使用 IDirect3DDevice8::DrawPrimitive 绘制顶点缓冲区中的顶点，见以下代码片段： <br /><br />g_pd3dDevice-&gt;DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); <br /><br /><br />DrawPrimitive 接受的第一个参数是一个标记，它通知 Direct3D 绘制哪种类型的物件(Primitive)。本例程使用 D3DPT_TRIANGLELIST 标记指定为三角形序列。第二个参数是第一个顶点的索引。第三个参数通知绘制的物件的数目。本例子只画一个三角形，这个值为 1。 <br /><br />关于不同种类物件的更多信息，可见 SDK: 3-D Primitive <br /><br />最后的一步是结束场景并立即将后背缓冲提交为前景缓冲。这些写在以下代码片段中： <br /><br />g_pd3dDevice-&gt;EndScene(); <br /><br />g_pd3dDevice-&gt;Present( NULL, NULL, NULL, NULL ); <br /><br />当后背缓冲被提交为前景缓冲后，客户窗口将显示出一个三个点颜色各异的三角形。 <br /><br />本指南已经指导你如何使用顶点构造几何外形了。指南三：使用矩阵 将介绍矩阵的概念以及如何使用它们。 <br /><br /><br />指南三：使用矩阵 <br /><br />本指南介绍矩阵的概念及演示如何使用它们。Vertices 例程通过呈递2D的顶点画出了一个三角形。然而，在这个指南中，你将通过顶点变换在 3-D 环境下工作。矩阵和变换也同样用于设置摄影头与视口（Viewport）。 <br /><br />在 Matrices 例程呈递几何物体之前，它调用程序自定义函数 SetupMatrices 创建并设置用于演示 3-D 三角形的矩阵变换。作为代表，三种类型的变换同时被设置到一个 3-D 场景。创建这些典型变换的步骤如下表： <br /><br />·第一步：定义世界变换矩阵 <br /><br />·第二步：定义观察变换矩阵 <br /><br />·第三步：定义映射变换矩阵 <br /><br />注意：Matrices 示例程序的路径为： <br /><br />(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut03_Matrices. <br /><br /><br />创建这三种变换的顺序并不影响场景元素的输出。无论如何，Direct3D 都使用以下顺序依次将矩阵作用于场景：(1) 世界，(2) 观察，(3) 映射。 <br /><br />Matrices 工程的示例代码几乎与 Vertices 工程的代码相同。该“使用矩阵”指南仅仅关注那些有关矩阵的独特代码，而不重复初始化 Direct3D，处理 Microsoft Windows 消息，演示，以及清除。关于这些工作的信息，请见 指南一：创建设备 。 <br /><br />本指南使用自定义顶点格式和单个顶点缓冲区呈递几何模型，关于更多的有关选择自定义顶点类型以及执行顶点缓冲区的信息，见 指南二：演示顶点 。 <br /><br />第一步：定义世界变换矩阵（World Transformation Matrix） <br /><br />世界变换矩阵定义了怎样转换、缩放、以及旋转 3-D 模拟空间中的几何物体。 <br /><br />以下代码片段为 Microsoft Direct3D 设备设置当前的世界变换并且使三角形绕 y-轴 旋转。 <br /><br />D3DXMATRIX matWorld; <br /><br />D3DXMatrixRotationY( &amp;matWorld, timeGetTime()/150.0f ); <br /><br />g_pd3dDevice-&gt;SetTransform( D3DTS_WORLD, &amp;matWorld ); <br /><br />第一步是通过调用 D3DXMatrixRotationY 函数使三角形绕 y-轴 旋转。函数第一个参数是指向 D3DMATRIX 结构的指针用于返回操作结果。第二个参数是以弧度表示的旋转角度。 <br /><br /><br />下一步是调用 IDirect3DDevice8::SetTransform 给 Direct3D 设备设置世界变换。SetTransform 接受的第一个参数通知 Direct3D 被设置的是哪个转换。这个例子用 D3DTS_WORLD 宏指定被设置的是世界变换。第二个参数是一个指向被设为当前变换之矩阵的指针。 <br /><br /><br />关于世界变换的更多信息，见：SDK: World Transformation <br /><br /><br />定义完场景的世界变换后，你可以准备观察变换矩阵了。再一次请注意：定义任一变换的顺序不是关键。无论如何，Direct3D 采用以下顺序将这些矩阵作用于场景：(1) 世界，(2) 观察，(3) 映射。 <br /><br /><br />定义观察变换矩阵请参看 第二步：定义观察变换矩阵 <br /><br /><br />第二步：定义观察变换矩阵（View Transformation Matrix） <br /><br /><br />观察变换矩阵定义了观察的位置和旋转角度。此观察矩阵就相当于场景的摄影机。 <br /><br /><br />以下代码片段创建了一个观察变换矩阵并将其设置为 Microsoft Direct3D 设备的当前观察矩阵。 <br /><br />D3DXMATRIX matView; <br /><br />D3DXMatrixLookAtLH( &amp;matView, &amp;D3DXVECTOR3( 0.0f, 3.0f,-5.0f ), <br /><br />&amp;D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), <br /><br />&amp;D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); <br /><br />g_pd3dDevice-&gt;SetTransform( D3DTS_VIEW, &amp;matView ); <br /><br /><br />第一步是通过调用 D3DXMatrixLookAtLH 定义观察矩阵。第一个参数是一个指向 D3DXMATRIX 结构的指针，用来接受操作结果。第二、三、四个参数定义了观察点、注视点、以及方向“上”。这儿设置观察点为沿 Z-轴 反方向 5 单位再往上 3 单位，注视点为原点，以及作为“上”的方向为 Y-轴。 <br /><br />下一步是调用 IDirect3DDevice8::SetTransform 给 Direct3D 设备设置观察矩阵。SetTransform 接受的第一个参数通知 Direct3D 哪一个变换将要被设置。该例程使用 D3DTS_VIEW 标记指定为观察矩阵。第二个参数是一个指向矩阵的指针，它被设为当前的变换。 <br /><br /><br />关于观察矩阵的更多信息，见：SDK: View Transformation <br /><br /><br />定义了场景的世界变换后，你可以开始准备映射变换矩阵了。再一次提醒，定义每一变换的顺序不是关键性的。无论如何，Direct3D 总是采用以下顺序将矩阵应用于场景：(1) 世界，(2) 观察，(3) 映射。 <br /><br />定义映射变换矩阵的工作被描述在 第三步：定义映射变换矩阵 <br /><br /><br />第三步：定义映射变换矩阵（Projection Transformation Matrix） <br /><br />映射变换矩阵定义了将 3-D 观察空间转换为 2-D 视口空间的几何学方法。 <br /><br />以下代码片段创建映射变换矩阵并将其设为 Microsoft Direct3D 设备的当前映射变换。 <br /><br />D3DXMATRIX matProj; <br /><br />D3DXMatrixPerspectiveFovLH( &amp;matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); <br /><br />g_pd3dDevice-&gt;SetTransform( D3DTS_PROJECTION, &amp;matProj ); <br /><br /><br />第一步是调用 D3DXMatrixPerspectiveFovLH 设置映射矩阵。函数第一个参数是一个指向 D3DXMATRIX 的结构，用于接受操作的结果。第二个参数定义视场，它说明物体如何随着距离而缩小。一个典型的视场是 1/4 π，就像这个例子使用的一样。第三个参数定义了屏幕纵横比。本示例采用典型的纵横比 1。第四和第五个参数定义最近和最远剪切平面。这是用于确定位于何种距离之外的几何物体无需再绘制。本 Matrices 示例设置它的最近剪切平面为 1，最远剪切平面为 100。 <br /><br /><br />下一步是调用 IDirect3DDevice8::SetTransfrom 对 Direct3D 应用变换。SetTransfrom 接受的第一个参数通知 Direct3D 何种变换被设置。本例程使用 D3DTS_PROJECTION 标志指定映射变换将被设置。第二个参数是一个指向矩阵的指针，它将被设置为当前的变换。 <br /><br />关于映射变换的更多信息，参见：“映射变换” <br /><br />本指南已经提示你如何使用矩阵。指南四：创建和使用光源 将揭示如何在你的场景中添加光源以增加真实性。 <br /><br />指南四：创建和使用光源 <br /><br />Microsoft Direc3D 光照系统给 3-D 物体提供更多的真实性。当使用它时，每个场景中的几何对象将被照亮，基于它们的位置和使用的光源类型。这个指南的例程将介绍关于光照和材质的主题。 <br /><br />本指南包含以下步骤用于创建材质与光照： <br /><br /><br />·第一步：创始化场景几何 <br /><br />·第二步：设置材置与光照 <br /><br />注意：Lights 示例程序的路径为： <br /><br />(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut04_Lights. <br /><br />注意：Lights 例程中的代码和 Matrices 例程的代码几乎完全一样。“创建和使用光源”指南仅仅关注于有关创建和使用光照的独特代码，而并不重复有关设置 Direct3D，处理 Microsoft Windows 消息，绘制，或者清理的内容。关于这些任务的其他信息，见：指南一：创建设备。 <br /><br />本指南使用自定义顶点和顶点缓冲区呈递几何形体。关于选择一个自定义顶点格式并执行顶点缓冲的更多信息，见：指南二：演示顶点。 <br /><br />本指南采用矩阵变换几何对象。关于矩阵和变换的更多信息，参见：指南三：使用矩阵。 <br /><br />第一步：创始化场景几何 <br /><br /><br />使用光照的一个前提是每个表面都应该有法向量。为此，Lights 例程使用一个稍微不同的自定义顶点格式，新的自定义顶点格式具有一个 3-D 位置坐标和一个表面法向量。这个表面法向量被用于 Microsoft Direct3D 光照计算的核心。 <br /><br />struct CUSTOMVERTEX <br /><br />{ <br /><br />D3DXVECTOR3 position; // The 3-D position for the vertex. <br /><br />D3DXVECTOR3 normal; // The surface normal for the vertex. <br /><br />}; <br /><br /><br />// Custom FVF. <br /><br />#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL) <br /><br />现在适当的矢量格式定义好了，Lights 例程调用 InitGeometry()，一个程序自定义的函数以创建一个圆柱体。最初的步骤是创建一个顶点缓冲区并用它保存这个圆柱体的各点，如以下例代码所示： <br /><br />// Create the vertex buffer. <br /><br />if( FAILED( g_pd3dDevice-&gt;CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX), <br /><br />0 /* Usage */, D3DFVF_CUSTOMVERTEX, <br /><br />D3DPOOL_DEFAULT, &amp;g_pVB ) ) ) <br /><br />return E_FAIL; <br /><br /><br />下一步是使用圆柱体的顶点填充顶点缓冲区。注意下面的示例代码，每个点都被定义了一个位置和一个法向量。 <br /><br /><br />for( DWORD i=0; i&lt;50; i++ ) <br /><br />{ <br /><br />FLOAT theta = (2*D3DX_PI*i)/(50-1); <br /><br />pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) ); <br /><br />pVertices[2*i+0].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) ); <br /><br />pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) ); <br /><br />pVertices[2*i+1].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) ); <br /><br />} <br /><br /><br />在前述例程使用圆柱体顶点填充了顶点缓冲区之后，这个顶点缓冲区已经准备好用于呈递了。但是首先，这个场景的材质与光照必须在绘制圆柱体之前被设置。这些描述在 第二步：设置材质与光照。 <br /><br /><br />第二步：设置材质与光照 <br /><br /><br />为了在 Microsoft Direct3D 中使用光照，你必须创建一个或多个光源。为了确定一个几何物体放射何种颜色的光线，材质必须被创建于绘制几何对象。在绘制这个场景之前，Lights 例程调用 SetupLights，一个程序自定义函数来设置材质和一个方向性光源。 <br /><br /><br />创建一种材质 <br /><br /><br />材质被定义为当一束光照到几何物体表面后，反射出的颜色。以下代码片段使用 D3DMATERIAL8 结构来创建一个黄色的材质。 <br /><br /><br />D3DMATERIAL8 mtrl; <br /><br />ZeroMemory( &amp;mtrl, sizeof(D3DMATERIAL8) ); <br /><br />mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f; <br /><br />mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; <br /><br />mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f; <br /><br />mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f; <br /><br />g_pd3dDevice-&gt;SetMaterial( &amp;mtrl ); <br /><br /><br />这个材质的漫射光颜色与环境光颜色都被设为黄色。对 IDirect3DDevice8::SetMaterial 函数的调用将应用此材质到用于绘制场景的 Microsoft Direct3D 设备。SetMaterial() 接受的唯一参数是设置材质的指针。在这个调用完成以后，每个物件都将使用这个材质绘制直到另一次对 SetMaterial 的调用指定了一个不同的材质为止。 <br /><br /><br />现在材质已经被应用到场景，下一个步骤是创建光源。 <br /><br /><br />创建一个光源 <br /><br />Microsoft Direct3D 里有三种可用的光源：点光源，方向形光源，与聚光灯光源。本示例代码创建一个方向形光源，它向一个方向发光，并且不停的变换发光的方向。 <br /><br />下列代码片段使用 D3DLIGHT8 结构创建一个方向性光源。 <br /><br /><br />D3DXVECTOR3 vecDir; <br /><br />D3DLIGHT8 light; <br /><br />ZeroMemory( &amp;light, sizeof(D3DLIGHT8) ); <br /><br />light.Type = D3DLIGHT_DIRECTIONAL; <br /><br /><br />下列代码片设置光源的漫射光为白色。 <br /><br />light.Diffuse.r = 1.0f; <br /><br />light.Diffuse.g = 1.0f; <br /><br />light.Diffuse.b = 1.0f; <br /><br /><br />以下代码片在一个环内旋转光源的方向。 <br /><br />vecDir = D3DXVECTOR3(cosf(timeGetTime()/360.0f), <br /><br />0.0f, <br /><br />sinf(timeGetTime()/360.0f) ); <br /><br />D3DXVec3Normalize( (D3DXVECTOR3*)&amp;light.Direction, &amp;vecDir ); <br /><br />对 D3DXVec3Normalize 函数的调用将归一化方向矢量并初始化光源的方向。 <br /><br />可以设置一个范围告诉 Direct3D 此光源能影响多远的距离。这个成员参数对方向性光源无效。以下代码片指定此光源的范围为 1000 单位。 <br /><br /><br />light.Range = 1000.0f; <br /><br /><br />下面的代码片将这个光源分配到当前的 Direct3D 设备，通过调用 IDirect3DDevice8::SetLight。 <br /><br /><br />g_pd3dDevice-&gt;SetLight( 0, &amp;light ); <br /><br /><br />SetLight 接受的第一个参数是此光源被分配的索引号。注意如果在此索引已存在一个光源，它将被新光源覆盖。第二个参数是一个指向新定义光源数据结构的指针。本 Lights 例程设置这个光源位于 0 号索引。 <br /><br /><br />下列代码片激活这个光源，通过调用 IDirect3DDevice8::LightEnable。 <br /><br /><br />g_pd3dDevice-&gt;LightEnable( 0, TRUE); <br /><br /><br />LightEnable 接受的第一个参数是激活光源的索引。第二个参数是一个布尔量通知此光源是开 (TRUE) 还是闭 (FALSE)。在上面的例程中，索引 0 上的光源被打开。 <br /><br /><br />以下代码片通知 Direct3D 呈递此光源，通过调用 IDirect3DDevice8::SetRenderState。 <br /><br /><br />g_pd3dDevice-&gt;SetRenderState( D3DRS_LIGHTING, TRUE ); <br /><br /><br />SetRenderState 接受的头两个参数是哪一个设备状态变量被改写以及写入何种值。本例程设置 D3DRS_LIGHTING 设备变量为 TRUE，这将使设备能够演示光照效果。 <br /><br /><br />本例程的最后一步是通过再一次调用 SetRenderState 打开环境照明光。 <br /><br /><br />g_pd3dDevice-&gt;SetRenderState( D3DRS_AMBIENT, 0x00202020 ); <br /><br /><br />当前代码段设置 D3DRS_AMBIENT 设备变量为一种浅灰色 (0x00202020)。环境照明将使用所给的颜色照亮所有的物体。 <br /><br /><br />关于照明及材质的更多信息，参见 SDK: Lights and Materials。 <br /><br /><br />本例程向你说明了如何使用照明与材质。指南五：使用纹理映射 将向你说明如何将纹理添加到物体表面上。 <br /><br /><br /><br />指南五：使用纹理映射 <br /><br /><br />尽管光照和材质大大增加了场景的真实感，但没有比在表面上添加纹理更能增加真实感的了。纹理能够被想象为一层紧紧包装在表面的贴纸。你能在一个立方体上放置一层木质纹理使它看起来就象用木头制成的一样。本 Texture 例程将在 指南四：创建和使用光照 中构造的圆柱上添加一幅类似香蕉的纹理。此指南介绍的内容包括如何载入纹理，设置纹理，与呈递带有纹理的物体。 <br /><br /><br />本指南采用以下步骤实现纹理： <br /><br /><br />·第一步：定义一个定制顶点格式 <br /><br />·第二步：初始化屏幕几何 <br /><br />·第三步：演示场景 <br /><br />注意：Texture 示例程序的路径为： <br /><br />(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut05_Textures. <br /><br /><br />注意：除了 Texture 示例不创建材质和光照以外，Texture 工程中的示例代码与 Lights 工程的几乎完全一样。本“使用纹理映射”指南仅仅关注于有关于纹理的独特代码，而并不重复有关初始化 Microsoft Direct3D，处理 Microsoft Windows 消息，演示，或清理的内容。关于这些工作的信息，见：指南一：创建设备。 <br /><br />本指南使用自定义顶点和顶点缓冲区显示几何物体。关于选择一个自定义顶点格式并执行顶点缓冲的更多信息，见：指南二：演示顶点。 <br /><br /><br />本指南采用矩阵进行几何变换。关于矩阵和变换的更多信息，参见：指南三：使用矩阵。 <br /><br /><br />第一步：定义一个定制顶点格式 <br /><br /><br />在使用纹理以前，必须使用包含纹理坐标的自定义顶点格式。纹理坐标告诉 Microsoft Direct3D 在物件上如何将纹理定位于每个顶点上。纹理坐标范围从 0.0 到 1.0，(0.0, 0.0) 的位置代表纹理贴图的左上角而 (1.0, 1.0) 代表纹理贴图的右下角。 <br /><br /><br />以下示例代码说明了 Texture 例程是如何通过设置它的自定义顶点格式来包含纹理坐标的。 <br /><br />struct CUSTOMVERTEX <br /><br />{ <br /><br />D3DXVECTOR3 position; // The position. <br /><br />D3DCOLOR color; // The color. <br /><br />FLOAT tu, tv; // The texture coordinates. <br /><br />}; <br /><br /><br />// The custom FVF, which describes the custom vertex structure. <br /><br />#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1) <br /><br /><br />关于纹理坐标的进一步信息，参见 SDK: Texture Coordinates 一章。 <br /><br /><br />现在自定义顶点格式已经准备好了，下一步将是载入一幅纹理并创建一个圆柱体，见 第二步：初始化屏幕几何。 <br /><br /><br />第二步：初始化屏幕几何 <br /><br /><br />在绘制之前，Texture 例程调用 InitGeometry，一个程序自定义的函数用于创建一幅纹理并初始化圆柱体的几何参数。 <br /><br /><br />纹理是由基于文件的图像构造的。以下示例代码使用 D3DXCreateTextureFromFile 从 Banana.bmp 文件创建一幅纹理并用它覆盖圆柱的表面。 <br /><br /><br />if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, "Banana.bmp", <br /><br />&amp;g_pTexture ) ) ) <br /><br />return E_FAIL; <br /><br /><br />D3DXCreateTextureFromFile 接受的第一个参数是一个指向 Microsoft Direct3D 设备的指针，这个设备将用于绘制纹理。第二个参数是一个指向 ANSI 字符串的指针，它指定用于创建纹理的文件名。本例程指定从此文件：“Banana.bmp” 来装载图像。第三个参数是一个指向纹理对象指针的地址。 <br /><br />当这个类似香蕉的纹理被装载并准备好之后，下一个步骤是创建圆柱体。以下示例代码用一个圆柱体填充顶点缓冲区。注意每一点都具备了纹理坐标 (tu, tv)。 <br /><br /><br />for( DWORD i=0; i&lt;50; i++ ) <br /><br />{ <br /><br />FLOAT theta = (2*D3DX_PI*i)/(50-1); <br /><br /><br />pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0, cosf(theta) ); <br /><br />pVertices[2*i+0].color = 0xffffffff; <br /><br />pVertices[2*i+0].tu = ((FLOAT)i)/(50-1); <br /><br />pVertices[2*i+0].tv = 1.0f; <br /><br /><br />pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0, cosf(theta) ); <br /><br />pVertices[2*i+1].color = 0xff808080; <br /><br />pVertices[2*i+1].tu = ((FLOAT)i)/(50-1); <br /><br />pVertices[2*i+1].tv = 0.0f; <br /><br />} <br /><br /><br /><br />每一个顶点包括位置，颜色，以及纹理坐标。上面的例程给每一点设置了纹理坐标并使此纹理能够平滑的包裹在圆柱体周围。 <br /><br /><br />现在纹理和顶点缓冲区已经准备好用于演示了，现在能够呈递和着色图形了，参见 第三步：演示场景。 <br /><br /><br />第三步：演示场景 <br /><br /><br />在场景几何被初始化之后，应该是绘制场景的时候了。为了绘制一个带有纹理的物体，使用的纹理必须要设置成当前纹理中的一个。下一步将是设置纹存储器的状态。纹理存储器状态使你能够定义一个或者多个纹理被呈递的方式。比如说，你能将多个纹理混合在一起。 <br /><br /><br />现在 Texture 示例开始设置需要使用的纹理。以下代码段使用 IDirect3DDevice8::SetTexture 设置 Microsoft Direct3D 设备用于绘制的纹理。 <br /><br /><br />g_pd3dDevice-&gt;SetTexture( 0, g_pTexture ); <br /><br /><br />SetTexture 接受的第一个参数是设置纹理存储器的标示符。一个设备能够支持八个已初始化的纹理，所以这儿的最大值是 7。本 Texture 示例仅仅使用一个纹理并且把它设置在存储器 0。第二个参数是一个指向纹理对象的指针。在这儿，Texture 示例使用由它的程序自定义函数 InitGeometry 创建的纹理。 <br /><br /><br /><br />以下代码片设置纹理存储器状态的值，通过调用 IDirect3DDevice8::SetTextureStageState 方法。 <br /><br /><br />g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); <br /><br />g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); <br /><br />g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); <br /><br />g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); <br /><br /><br /><br />SetTextureState 的第一个参数是需要改变状态的存储器的索引。本示例代码改变位于存储器 0 的纹理，所以这儿置为 0。下一个参数是要设置的纹理状态。关于所有有效的纹理状态以及它们的意义，见 "SDK: D3DTEXTURESTAGESTATETYPE"。再下一个参数是设置为此纹理状态的参数。你放置这儿的值应取决于你要改变的纹理存储器状态。 <br /><br /><br />在设置完每个纹理存储器状态的合适值之后，这个圆柱体可以被呈递了，现在纹理将被添加在它的表面上。 <br /><br /><br />使用纹理坐标的其他方法是使它们自动的生成。这是用一种纹理坐标索引 (TCI) 实现的。TCI 使用一个纹理矩阵来变换 (x,y,z) TCI 坐标为 (tu, tv) 纹理坐标。在 Texture 例程中，位于摄像机空间中的顶点位置被用来产生纹理坐标。 <br /><br /><br />第一步是创建用于转换的矩阵，示范在以下代码片段中： <br /><br /><br />D3DXMATRIX mat; <br /><br />mat._11 = 0.25f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f; <br /><br />mat._21 = 0.00f; mat._22 =-0.25f; mat._23 = 0.00f; mat._24 = 0.00f; <br /><br />mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f; <br /><br />mat._41 = 0.50f; mat._42 = 0.50f; mat._43 = 0.00f; mat._44 = 1.00f; <br /><br /><br /><br />在矩阵创建好之后，它必须通过调用 IDirect3DDevice8::SetTransform 来设置它，如以下代码段所示： <br /><br /><br />g_pd3dDevice-&gt;SetTransform( D3DTS_TEXTURE0, &amp;mat ); <br /><br /><br />D3DTS_TEXTURE0 标志告诉 Direct3D 应用此变换到位于纹理存储器 0 的纹理。本示例的下一步是设置其他的存储器状态值，以得到所需的效果。这些处理在以下代码段中。 <br /><br /><br />g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); <br /><br />g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION ); <br /><br /><br />纹理坐标被设置后，现在此场景已准备好被呈递了。注意到现在的坐标是自动设置到圆柱上的。这样精确的设置使几何物体被演示时纹理好象是覆盖在绘制的屏幕上。 <br /><br /><br />关于纹理的更多信息，见 SDK: Texture 一章。 <br /><br /><br />本指南已经向你说明了如何给表面添加纹理。指南六：使用Mesh模型 将告诉你如何应用Mesh模型呈递复杂的几何形体。 <br /><br /><br /><br />指南六：使用Mesh模型 <br /><br /><br />复杂的几何形状常常使用 3-D 建模软件构造模型并保存为文件。一个例子就是 .x 文件格式。Microsoft Direct3D 使用Mesh对象从文件装载这些物体。Mesh对象稍微有点复杂，但是 Microsoft Direct3DX 包含的函数使应用Mesh对象变的简单。Meshed 例程介绍关于Mesh的话题并展示如何装载，演示，以及卸载一个Mesh对象。 <br /><br /><br />本指南使用以下步骤说明如何装载，演示，以及卸载一个Mesh对象： <br /><br /><br />·第一步：装载一个Mesh对象 <br /><br />·第二步：演示一个Mesh对象 <br /><br />·第三步：卸载一个Mesh对象 <br /><br />注意：Methes 示例程序的路径为： <br /><br />(SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut06_Meshes. <br /><br /><br />注意：除了 Meshes 工程中的示例代码不创建材值与光照以外，此工程的示例代码与 Lights 工程几乎完全一样。“使用Mesh模型”指南仅仅关注于有关于Mesh对象的独特代码，而并不重复有关设置 Microsoft Direct3D，处理 Microsoft Windows 消息，演示，或清理的工作。关于这些工作的信息，见：指南一：创建设备。 <br /><br /><br />本指南使用自定义顶点和顶点缓冲区显示几何物体。关于选择一个自定义顶点格式并执行顶点缓冲的更多信息，见：指南二：演示顶点。 <br /><br /><br />本指南采用矩阵进行几何变换。关于矩阵和变换的更多信息，参见：指南三：使用矩阵。 <br /><br /><br />本指南使用纹理覆盖Mesh模型的表面。关于装载和使用纹理的更多信息，参见：指南五：使用纹理映射。 <br /><br /><br />第一步：装载一个Mesh对象 <br /><br /><br />在使用之前，Microsoft Direct3D 应用程序必须先装载一个Mesh对象。Meshes 例程通过调用 InitGeometry，一个该程序自定义的函数，装载一只虎的Mesh模型，当然这是在已经装载了必需的 Direct3D 对象以后。 <br /><br /><br />一个Mesh对象需要用一个材质缓冲保存所有将要用到的材质与纹理。所以该函数最初定义了一个材质缓冲，如以下代码段所示： <br /><br /><br />LPD3DXBUFFER pD3DXMtrlBuffer; <br /><br /><br />以下代码段使用 D3DXLoadMethFromX 函数装载Mesh对象。 <br /><br /><br />// Load the mesh from the specified file. <br /><br />if( FAILED( D3DXLoadMeshFromX( "tiger.x", D3DXMESH_SYSTEMMEM, <br /><br />g_pd3dDevice, NULL, <br /><br />&amp;pD3DXMtrlBuffer, &amp;g_dwNumMaterials, <br /><br />&amp;g_pMesh ) ) ) <br /><br />return E_FAIL; <br /><br /><br />D3DXLoadMeshFromX 接受的第一个参数是一个指向字符串的指针告诉 Microsoft Direct3D 要装载的文件。本例程从 Tiger.x 读取一只虎的Mesh模型。 <br /><br /><br />第二个参数通知 Direct3D 如何创建Mesh对象。本示例采用 D3DXMESH_SYSTEMMEM 标记，它等于同时指定 D3DXMESH_VB_SYSTEMMEM 与 D3DXMESH_IB_SYSTEMMEM，这两个参数告诉 Direct3D 把Mesh对象的索引缓冲区和顶点缓冲区都放到系统内存中。 <br /><br /><br />第三个参数是指向将被用于绘制Mesh对象的 Direct3D 设备的指针。 <br /><br /><br />第四个参数是一个指向 ID3DXBuffer 对象的指针。这个对象装入关于各个面相邻与否的信息。在本例程中此信息是不需要的，所以这个参数被设为 NULL。 <br /><br /><br />第五个参数同样取得一个指向 ID3DXBuffer 的指针。在函数执行完以后，此对象将被填入该Mesh对象使用的 D3DXMATERIAL 结构。 <br /><br /><br />第六个参数是一个指针，指向函数执行结束后，返回的置入 ppMaterials 队列中的 D3DXMATERIAL 结构数目。 <br /><br /><br />第七个参数是一个Mesh对象指针的地址，返回装载的Mesh对象。 <br /><br /><br />在装载了这个Mesh对象和相关材质信息之后，你需要从材质缓冲区中分解出材质属性及纹理名称。 <br /><br /><br />本 Mesh 例程先需要得到材质缓冲区指针才能处理这些事情。以下代码段使用 ID3DXBuffer::GetBufferPointer 函数得到这个指针。 <br /><br /><br />D3DXMATERIAL* d3dxMaterials = <br /><br />(D3DXMATERIAL*)pD3DXMtrlBuffer-&gt;GetBufferPointer(); <br /><br /><br />以下代码段创建了一个新的Mesh和纹理对象基于Mesh对象中材质的最大数目。 <br /><br /><br />g_pMeshMaterials = new D3DMATERIAL8[g_dwNumMaterials]; <br /><br />g_pMeshTextures = new LPDIRECT3DTEXTURE8[g_dwNumMaterials]; <br /><br /><br />对于每个Mesh对象里的材质都必须进行以下步骤。 <br /><br /><br />第一步是拷贝材质，如以下代码段所示. <br /><br />g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D; <br /><br /><br />第二步是设置材值的环境色，见以下代码段。 <br /><br /><br />g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse; <br /><br /><br />最后一步是为该材质创建纹理，如以下代码段。 <br /><br /><br />// Create the texture. <br /><br />if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, <br /><br />d3dxMaterials[i].pTextureFilename, <br /><br />&amp;g_pMeshTextures[i] ) ) ) <br /><br />g_pMeshTextures[i] = NULL; <br /><br />} <br /><br /><br />装载了每个材质以后，你使用完毕了这个材质缓冲区，必须调用 IUnknown::Release 来释放它。 <br /><br /><br />pD3DXMtrlBuffer-&gt;Release(); <br /><br /><br />现在，Mesh对象，连同其相应的材质与纹理都已经装载好了。这个Mesh物体已准备好呈递到屏幕上，参看 第二步：演示一个Mesh对象。 <br /><br /><br />第二步：演示一个Mesh对象 <br /><br /><br />在第一步中，Mesh对象已经准备号被呈递了。该对象被Mesh对象装载的每个材质分成若干个子集。为了绘制每个子集，应该在一个循环中绘制此Mesh对象。循环的第一步是为每个子集设置材质，如以下代码段所示： <br /><br /><br />g_pd3dDevice-&gt;SetMaterial( &amp;g_pMeshMaterials[i] ); <br /><br /><br />循环的第二步是给每个子集设置纹理，如以下代码段所示。 <br /><br /><br />g_pd3dDevice-&gt;SetTexture( 0, g_pMeshTextures[i] ); <br /><br /><br />在给每个子集设置完材质与纹理之后，子集被 ID3DXBaseMesh::DrawSubset 函数所绘制，如以下代码段所示。 <br /><br /><br />g_pMesh-&gt;DrawSubset( i ); <br /><br /><br />DrawSubset 函数带有一个 DWORD 参数用于指定Mesh对象的哪个子集被绘制。本例程使这个参数的值每循环一次就被加一。 <br /><br /><br />在使用完Mesh对象之后，重要的事是要将此Mesh对象完全移出内存，参见 第三步：卸载一个Mesh对象。 <br /><br /><br />第三步：卸载一个Mesh对象 <br /><br /><br />在任何 Microsoft Direct3D 程序结束前，它有必要解构它使用的所有 DirectX 对象并且使指向它们的指针无效。本例程使用的Mesh对象同样需要被解构。当它接收到一个 WM_DESTROY 消息时，Meshes 例程调用 Cleanup，一个该程序自定义的函数，来处理此事。 <br /><br /><br />以下代码段删除材质队列。 <br /><br /><br />if( g_pMeshMaterials ) <br /><br />delete[] g_pMeshMaterials; <br /><br /><br />以下代码解构每个装载过的单独纹理并删除纹理队列。 <br /><br /><br />if( g_pMeshTextures ) <br /><br />{ <br /><br />for( DWORD i = 0; i &lt; g_dwNumMaterials; i++ ) <br /><br />{ <br /><br />if( g_pMeshTextures[i] ) <br /><br />g_pMeshTextures[i]-&gt;Release(); <br /><br />} <br /><br />delete[] g_pMeshTextures; <br /><br /><br />以下代码段解构Mesh对象。 <br /><br /><br />Delete the mesh object <br /><br />if( g_pMesh ) <br /><br />g_pMesh-&gt;Release(); <br /><br /><br />本指南已经向你说明了如何装载和绘制Mesh对象。这是此区域最后一个指南。如果需要了解一个典型的 Direc3D 应用程序是如何写成的，见："SDK: DirectX Graphics C/C++ Samples" 。<br /></font><img src ="http://www.cppblog.com/stevennash/aggbug/13331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:42 <a href="http://www.cppblog.com/stevennash/articles/13331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[引] 微软DirectX9.0中粒子系统示例的源代码注释</title><link>http://www.cppblog.com/stevennash/articles/13330.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:39:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13330.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13330.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13330.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13330.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [引] 微软DirectX9.0中粒子系统示例的源代码注释创建点精灵顶点结构与顶点FVF：struct POINTVERTEX{    D3DXVECTOR3 v;    D3DCOLOR    color;     static const DWORD FVF;};const DWORD POINTVERTEX::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; 粒子结构：s...&nbsp;&nbsp;<a href='http://www.cppblog.com/stevennash/articles/13330.html'>阅读全文</a><img src ="http://www.cppblog.com/stevennash/aggbug/13330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:39 <a href="http://www.cppblog.com/stevennash/articles/13330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[引] 加载一个三维模型</title><link>http://www.cppblog.com/stevennash/articles/13328.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:38:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13328.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13328.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13328.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#0000ff">[引] 加载一个三维模型<br /><br /></font>
		</p>
		<p>//****************************************************************************<br />//说明： <br />//开发环境：Visual C++.NET 7.1.3091 DirectX 9.0C<br />//操作系统：WindowsXP SP2<br />//硬件：AMD Athlon XP 2500+,DDR400 256MB,Geforce4 MX440 AGP 8X 64MB<br />//****************************************************************************<br />#include&lt;d3d9.h&gt;<br />#include&lt;d3dx9.h&gt;<br />#include&lt;windows.h&gt;<br />#include&lt;d3d9types.h&gt;<br />#include&lt;d3dx9math.h&gt;</p>
		<p>
				<br />#pragma comment(lib,"d3d9.lib")<br />#pragma comment(lib,"d3dx9.lib")<br />#pragma comment(lib,"dxguid.lib")<br />#pragma comment(lib,"Winmm.lib")</p>
		<p>//变量说明<br />HWND      hWnd;<br />LPDIRECT3D9     D3d9;<br />LPDIRECT3DDEVICE9   D3dDevice9;<br />LPD3DXMESH     m_pMesh;    //Mesh对象的接口指针<br />D3DMATERIAL9    *m_pMeshMaterials;  //用于保存模型中各个子集的材质<br />LPDIRECT3DTEXTURE9   *m_pMeshTextures;  //用于保存模型中各个子集的纹理<br />DWORD      m_dwNumSubsets;   //模型中子集的数目<br />//函数申明</p>
		<p>BOOL InitWindow(HINSTANCE hInstance,int nCmdShow);<br />LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);<br />//*******************************************************************<br />//函数：InitWindow（）<br />//功能：创建窗口<br />//编写人：梁志斌<br />//*******************************************************************</p>
		<p>static BOOL InitWindow(HINSTANCE hInstance,int nCmdShow)<br />{<br />WNDCLASS wndcls;<br /> wndcls.cbClsExtra=0;  //分配给窗口类结构之后的额外字节数<br /> wndcls.cbWndExtra=0;  //分配给窗口实例之后的额外的字节数<br /> wndcls.hbrBackground=CreateSolidBrush(RGB(0,0,255));//蓝色背景<br /> wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);  //窗口中的鼠标形状<br /> wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);  //窗口图标<br /> wndcls.hInstance=hInstance;  //窗口所对应的应用程序的句柄<br /> wndcls.lpfnWndProc=(WNDPROC)WinProc;  //窗口消息处理函数的指针<br /> wndcls.lpszClassName="DirectX";  //窗口的类名称<br /> wndcls.lpszMenuName=NULL;  //窗口的菜单资源名称<br /> wndcls.style= NULL; //窗口的风格<br /> if(!RegisterClass(&amp;wndcls))<br /> {<br />  ::MessageBox(0, "RegisterClass() - FAILED", 0, 0);<br />  return FALSE;<br /> }</p>
		<p> hWnd=CreateWindow("DirectX","游戏主窗口",WS_POPUP|WS_MAXIMIZE,0,0,<br /> GetSystemMetrics(SM_CXSCREEN),//此函数返回屏幕宽度<br />    GetSystemMetrics(SM_CYSCREEN),//此函数返回屏幕高度<br /> GetDesktopWindow(),NULL,hInstance,NULL);<br /> if(!hWnd)<br /> {<br />  ::MessageBox(0, "CreateWindow() - FAILED", 0, 0);<br />  return FALSE;<br /> }</p>
		<p> ShowWindow(hWnd,SW_SHOWNORMAL);<br /> UpdateWindow(hWnd);<br /> return TRUE;</p>
		<p>}</p>
		<p>//**********************************************************************<br />//函数：InitD3D()<br />//功能：初始化D3D<br />//编写人：梁志斌<br />//**********************************************************************<br />bool InitD3D()<br />{</p>
		<p> if(NULL==(D3d9=Direct3DCreate9(D3D_SDK_VERSION)))<br /> {<br />  ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);<br />  return FALSE;<br /> }<br /> <br /> <br />    D3DDISPLAYMODE d3ddm;<br />    if(D3D_OK!=(D3d9-&gt;GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&amp;d3ddm)))<br />   {<br />  ::MessageBox(0,"GetAdapterDisplayMode() - FAILED",0,0);<br />  return FALSE;<br /> }</p>
		<p>   <br /> D3DPRESENT_PARAMETERS D3dpp;</p>
		<p> ZeroMemory(&amp;D3dpp, sizeof(D3dpp));<br /> D3dpp.Windowed=false;<br /> D3dpp.hDeviceWindow=hWnd;<br /> D3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;<br /> D3dpp.BackBufferCount=1; //有一个后台缓存<br /> D3dpp.BackBufferWidth=d3ddm.Width;//屏幕宽度<br /> D3dpp.BackBufferHeight=d3ddm.Height;//屏幕长度<br /> //立即显示刷新后的图像<br /> D3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;</p>
		<p>
				<br /> D3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;//色彩深度</p>
		<p> //开启自动深度缓冲<br /> D3dpp.EnableAutoDepthStencil=true;<br /> D3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;//24位深度缓冲并保留8位模版缓冲（stencil buffer）</p>
		<p> if(D3D_OK!=(D3d9-&gt;CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&amp;D3dpp,&amp;D3dDevice9))) <br /> {<br />  ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);<br />  return FALSE;<br /> }<br /> //启用Z缓存，允许消隐处理<br /> D3dDevice9-&gt;SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);<br /> //打开光照处理<br /> D3dDevice9-&gt;SetRenderState( D3DRS_LIGHTING, TRUE );</p>
		<p> //自动对法线矢量进行归一化处理<br /> D3dDevice9-&gt;SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );</p>
		<p> return true;<br />}<br />void SetLight()<br />{<br /> //创建一个白色的平行光<br /> D3DLIGHT9 light;<br /> ::ZeroMemory( &amp;light, sizeof(D3DLIGHT9) );<br /> light.Type = D3DLIGHT_DIRECTIONAL; //灯光类型<br /> light.Diffuse.r = 1.0f;<br /> light.Diffuse.g = 1.0f;<br /> light.Diffuse.b = 1.0f;<br /> light.Direction = D3DXVECTOR3( -1.0f, -1.0f, 0.0f );<br /> light.Range  = 1000.0f;    //灯光的作用范围<br /> D3dDevice9-&gt;SetLight( 0, &amp;light ); //设置灯光，参数1为灯光的索引号<br /> D3dDevice9-&gt;LightEnable( 0, TRUE ); //打开灯光，参数1为灯光的索引号</p>
		<p> //设置环境光<br /> D3dDevice9-&gt;SetRenderState( D3DRS_AMBIENT, D3DCOLOR_RGBA(32,32,32,0) );<br />}<br />int InitGeometry()<br />{<br /> //我们将通过该接口指针访问Mesh对象的材质和纹理<br /> LPD3DXBUFFER pD3DXMtrlBuffer;</p>
		<p> //从.x文件创建Mesh对象<br /> if(FAILED(D3DXLoadMeshFromX("su37.x",D3DXMESH_SYSTEMMEM,D3dDevice9,NULL,&amp;pD3DXMtrlBuffer,NULL,&amp;m_dwNumSubsets,&amp;m_pMesh))) <br /> {<br />   ::MessageBox(0, "D3DXLoadMeshFromX() - FAILED", 0, 0);<br />   return FALSE;<br /> }<br /> m_pMeshMaterials = new D3DMATERIAL9[m_dwNumSubsets];<br /> m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumSubsets];</p>
		<p> //从接口指针pD3DXMtrlBuffer获得各个子集的材质和纹理图片的文件名<br /> D3DXMATERIAL* d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer-&gt;GetBufferPointer();<br /> for( DWORD i=0;i&lt;m_dwNumSubsets;i++ )<br /> {<br />  //复制子集的材质<br />  m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;<br />  //Direct3D在调入Mesh模型时，没有设置材质的环境光颜色，<br />  //这里把它设置成和漫反射一样的颜色。<br />  m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;</p>
		<p>  //调入纹理图片<br />  if(FAILED(D3DXCreateTextureFromFile(D3dDevice9,d3dxMaterials[i].pTextureFilename,&amp;m_pMeshTextures[i])))<br />  {<br />   ::MessageBox(0, "D3DXCreateTextureFromFile() - FAILED", 0, 0);<br />   return FALSE;<br />  }<br /> }<br /> pD3DXMtrlBuffer-&gt;Release(); //释放接口<br />}<br />void SetupMatrices()<br />{<br /> <br />    D3DXMATRIX matWorld;<br />    UINT  iTime  = timeGetTime() % 5000;<br />    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 5000.0f;//把旋转角换算成弧度<br />    D3DXMatrixRotationY( &amp;matWorld, fAngle );//计算世界变换矩阵<br />    D3dDevice9-&gt;SetTransform( D3DTS_WORLD, &amp;matWorld );//把世界变换矩阵设置到渲染环境<br /> </p>
		<p>    D3DXVECTOR3 vEyePt( 0.0f, 15.0f,-25.0f );//观察点<br />    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );//视线目标点<br />    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );//上方向<br />    D3DXMATRIX matView;<br />    D3DXMatrixLookAtLH( &amp;matView, &amp;vEyePt, &amp;vLookatPt, &amp;vUpVec );//计算视角变换矩阵<br />    D3dDevice9-&gt;SetTransform( D3DTS_VIEW, &amp;matView );//把视角变换矩阵设置到渲染环境</p>
		<p>    D3DXMATRIX matProj;<br />    D3DXMatrixPerspectiveFovLH( &amp;matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );//计算透视投影变换矩阵<br />    D3dDevice9-&gt;SetTransform( D3DTS_PROJECTION, &amp;matProj );//把投影变换矩阵设置到渲染环境<br />}</p>
		<p>VOID Cleanup()<br />{<br /> if(D3dDevice9!=NULL) <br />       D3dDevice9-&gt;Release();</p>
		<p>    if(D3d9!=NULL)       <br />       D3d9-&gt;Release();</p>
		<p> for (DWORD i=0;i&lt;m_dwNumSubsets;i++)<br />  m_pMeshTextures[i]-&gt;Release();  //释放纹理对象<br /> delete [] m_pMeshMaterials;<br /> delete [] m_pMeshTextures;<br /> m_pMesh-&gt;Release();   //释放Mesh对象<br />}</p>
		<p>
				<br />VOID Render()<br />{ <br /> //用蓝色清空背景区域<br />    D3dDevice9-&gt;Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);<br /> // 开始绘制场景 <br />    if(SUCCEEDED(D3dDevice9-&gt;BeginScene()))<br />    { <br />  SetupMatrices();//设置变换矩阵<br />  SetLight(); //设置灯光</p>
		<p> for( DWORD i=0; i &lt; m_dwNumSubsets; i++ )<br />  {<br />   //设置子集的材质<br />   D3dDevice9-&gt;SetMaterial( &amp;m_pMeshMaterials[i] );<br />   //设置子集的纹理，混合方式使用缺省值：纹理 × 材质的漫反射<br />   D3dDevice9-&gt;SetTexture( 0, m_pMeshTextures[i] );<br />   //绘制子集<br />   m_pMesh-&gt;DrawSubset( i );<br />   D3dDevice9-&gt;SetTexture( 0, NULL);<br />   }<br />  }<br />  // 结束场景绘制<br />     D3dDevice9-&gt;EndScene();<br />  // 显示到屏幕上<br />     D3dDevice9-&gt;Present(NULL,NULL,NULL,NULL);<br />}<br />//**********************************************************************<br />//函数：WinMain()<br />//功能：Windows 程序入口函数。创建主窗口，处理消息循环<br />//编写人：梁志斌<br />//**********************************************************************</p>
		<p>int WINAPI WinMain(HINSTANCE hInstance,  //hInstance：表示该应用程序的句柄<br />HINSTANCE hPrevInstance,                 //hPrevInstance：为了保持与16位windows应用程序的兼容性<br />LPSTR lpCmdLine,                         //lpCmdLine：指向命令行参数字符串的指针<br />int nCmdShow)                            //nCmdShow:指定应用程序窗口显示方式的整数<br />{ <br /> InitWindow(hInstance,nCmdShow);<br /> InitD3D();<br /> InitGeometry();<br /> //Render(); //渲染</p>
		<p> MSG msg;<br /> ZeroMemory( &amp;msg, sizeof(msg) );<br />    while(GetMessage(&amp;msg,NULL,0,0))<br />    {<br />  Render(); //渲染<br />   TranslateMessage( &amp;msg );<br />   DispatchMessage( &amp;msg ); <br />  }<br /> <br /> return (int)msg.wParam;<br />}</p>
		<p>//*******************************************************************<br />//函数：WinProc()<br />//功能：处理窗口消息<br />//编写人：梁志斌<br />//*******************************************************************</p>
		<p>LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)<br />{<br /> switch(msg)<br /> {<br /> case WM_KEYDOWN:  //击键消息<br />  switch(wParam)<br />  {<br />  case VK_ESCAPE:<br />   DestroyWindow(hWnd);  //释放窗口<br />   Cleanup();<br />   PostQuitMessage(0);  //给窗口发送WM_QUIT消息<br />   return 0;  //处理完一个消息后返回0<br />  }<br /> //case WM_RBUTTONDOWN:<br /> // MessageBox(hWnd,"鼠标右键按下了！","Mouse",MB_OK);<br />  return 0;<br /> }<br />return DefWindowProc(hWnd,msg,wParam,lParam);   //调用缺省消息处理过程<br />/*<br />if(GetAsyncKeyState(VK_ESCAPE))<br />{<br /> DestroyWindow(hWnd);  //释放窗口<br /> Cleanup();<br /> PostQuitMessage(0);  //给窗口发送WM_QUIT消息<br />}<br />*/<br /> return 0;<br />}</p>
<img src ="http://www.cppblog.com/stevennash/aggbug/13328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:38 <a href="http://www.cppblog.com/stevennash/articles/13328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[引] 键盘控制3D场景漫游</title><link>http://www.cppblog.com/stevennash/articles/13329.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:38:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13329.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13329.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13329.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13329.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13329.html</trackback:ping><description><![CDATA[[引] 键盘控制3D场景漫游<br /><br /><p>//做了好久都不能整合鼠标做CS那样的运动引擎....看来暂时都只能用键盘控制了</p><p>//-----------------------------------------------------------------------------<br />// File: basic.cpp<br />//<br />//-----------------------------------------------------------------------------<br />#define STRICT<br />#include &lt;Windows.h&gt;<br />#include &lt;commctrl.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;math.h&gt;<br />#include &lt;D3DX9.h&gt;<br />#include "DXUtil.h"<br />#include "D3DEnumeration.h"<br />#include "D3DSettings.h"<br />#include "D3DApp.h"<br />#include "D3DFile.h"<br />#include "D3DFont.h"<br />#include "D3DUtil.h"<br />#include "resource.h"</p><p>//-----------------------------------------------------------------------------<br />// Name: class CMyD3DApplication<br />// Desc: Application class. The base class (CD3DApplication) provides the <br />//       generic functionality needed in all Direct3D samples. CMyD3DApplication <br />//       adds functionality specific to this sample program.<br />//-----------------------------------------------------------------------------<br />class CMyD3DApplication : public CD3DApplication<br />{<br />    LPD3DXMESH m_pMesh;     //Mesh对象的接口指针<br /> D3DMATERIAL9 *m_pMeshMaterials;  //用于保存模型中各个子集的材质<br /> LPDIRECT3DTEXTURE9 *m_pMeshTextures;//用于保存模型中各个子集的纹理<br /> DWORD m_dwNumSubsets;    //模型中子集的数目<br /> TCHAR               m_strMeshFilename[512];<br />    TCHAR               m_strInitialDir[512];</p><p> //CD3DArcBall         m_ArcBall;              // Mouse rotation utility<br />    D3DXVECTOR3         m_vObjectCenter;        // Center of bounding sphere of object<br />    FLOAT               m_fObjectRadius;        // Radius of bounding sphere of object</p><p> D3DXVECTOR3 VDot,VAtPoint,VUp;//全局观察变量<br /> BYTE  m_bKey[256];   // keyboard state buffer<br /> </p><p>protected:<br />    HRESULT OneTimeSceneInit();<br />    HRESULT InitDeviceObjects();<br />    HRESULT RestoreDeviceObjects();<br />    HRESULT InvalidateDeviceObjects();<br />    HRESULT DeleteDeviceObjects();<br />    HRESULT FinalCleanup();<br />    HRESULT Render();<br />    HRESULT FrameMove();<br />    HRESULT ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior, <br />  D3DFORMAT adapterFormat, D3DFORMAT backBufferFormat );<br /> LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );<br />public:<br />    CMyD3DApplication();<br />};</p><p></p><p><br />//-----------------------------------------------------------------------------<br />// Name: WinMain()<br />// Desc: Entry point to the program. Initializes everything, and goes into a<br />//       message-processing loop. Idle time is used to render the scene.<br />//-----------------------------------------------------------------------------<br />INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )<br />{<br />    CMyD3DApplication d3dApp;</p><p>    InitCommonControls();<br />    if( FAILED( d3dApp.Create( hInst ) ) )<br />        return 0;</p><p>    return d3dApp.Run();<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: CMyD3DApplication()<br />// Desc: Application constructor. Sets attributes for the app.<br />//-----------------------------------------------------------------------------<br />CMyD3DApplication::CMyD3DApplication()<br />{<br /> m_bStartFullscreen=TRUE;<br />    //m_dwCreationWidth  = 800;   // Width used to create window<br />    //m_dwCreationHeight  = 600;<br />  // Override base class members<br />    m_strWindowTitle    = _T("加载Mesh模型");<br />    m_d3dEnumeration.AppUsesDepthBuffer   = TRUE;<br />  DXUtil_GetDXSDKMediaPathCb( m_strInitialDir, sizeof(m_strInitialDir) );<br />    _tcscpy( m_strMeshFilename, _T("this.x") );<br />    //初始化<br /> ZeroMemory( m_bKey, 256 );<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: ConfirmDevice()<br />// Desc: Called during device initialization, this code checks the device<br />//       for some minimum set of capabilities<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior,<br />                                          D3DFORMAT adapterFormat, D3DFORMAT backBufferFormat )<br />{<br />    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: OneTimeSceneInit()<br />// Desc: Called during initial app startup, this function performs all the<br />//       permanent initialization.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::OneTimeSceneInit()<br />{<br />    return S_OK;<br />}</p><p><br />//-----------------------------------------------------------------------------<br />// Name: InitDeviceObjects()<br />// Desc: Initialize scene objects.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::InitDeviceObjects()<br />{<br /> LPD3DXBUFFER pD3DXMtrlBuffer;</p><p> TCHAR      strMeshPath[512];<br />  // Load the mesh from the specified file<br />    DXUtil_FindMediaFileCb( strMeshPath, sizeof(strMeshPath), m_strMeshFilename );<br /> //从.x文件创建Mesh对象<br /> ::D3DXLoadMeshFromX(<br />  strMeshPath, D3DXMESH_SYSTEMMEM, m_pd3dDevice, <br />  NULL, &amp;pD3DXMtrlBuffer, NULL,<br />  &amp;m_dwNumSubsets, //返回模型中子集的数目<br />  &amp;m_pMesh );   //返回Mesh对象的接口指针</p><p> m_pMeshMaterials = new D3DMATERIAL9[m_dwNumSubsets];<br /> m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumSubsets];<br />    ZeroMemory(m_pMeshMaterials , sizeof(D3DMATERIAL9) * m_dwNumSubsets);<br /> ZeroMemory(m_pMeshTextures , sizeof(LPDIRECT3DTEXTURE9) * m_dwNumSubsets);<br /> //从接口指针pD3DXMtrlBuffer获得各个子集的材质和纹理图片的文件名<br /> D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer-&gt;GetBufferPointer();<br /> for( DWORD i=0; i &lt; m_dwNumSubsets; i++ )<br /> {<br />  //复制子集的材质<br />  m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;<br />  //Direct3D在调入Mesh模型时，没有设置材质的环境光颜色，<br />  //这里把它设置成和漫反射一样的颜色。<br />  m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;</p><p>  TCHAR strTexturePath[512] = _T("");<br />        DXUtil_FindMediaFileCb( strTexturePath, sizeof(strTexturePath), d3dxMaterials[i].pTextureFilename );<br />  //调入纹理图片<br />  ::D3DXCreateTextureFromFile(<br />   m_pd3dDevice,<br />   strTexturePath, //纹理图片的文件名<br />   &amp;m_pMeshTextures[i] );<br /> }</p><p> pD3DXMtrlBuffer-&gt;Release(); //释放接口<br />    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: RestoreDeviceObjects()<br />// Desc: Initialize scene objects.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::RestoreDeviceObjects()<br />{<br />   m_pd3dDevice-&gt;SetRenderState( D3DRS_AMBIENT, <br />   D3DCOLOR_COLORVALUE(0.7,0.7,0.7,0.7 ));</p><p>    // Set the arcball parameters<br />    m_ArcBall.SetWindow( m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height,<br />                         0.85f );<br />    m_ArcBall.SetRadius( m_fObjectRadius );</p><p>    // Set the projection matrix<br /> D3DXMATRIXA16 matProj;<br /> ::D3DXMatrixPerspectiveFovLH( &amp;matProj, D3DX_PI/4, 1.0f, 1.0f, 10000.0f ); <br /> m_pd3dDevice-&gt;SetTransform( D3DTS_PROJECTION, &amp;matProj );</p><p> D3DXMATRIX matView;<br /> D3DXMatrixLookAtLH( &amp;matView,&amp;VDot, &amp;VAtPoint, &amp;VUp );<br /> m_pd3dDevice-&gt;SetTransform( D3DTS_VIEW,  &amp;matView );<br />    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: InvalidateDeviceObjects()<br />// Desc:<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::InvalidateDeviceObjects()<br />{</p><p>    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: DeleteDeviceObjects()<br />// Desc: Called when the app is exiting, or the device is being changed,<br />//       this function deletes any device dependent objects.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::DeleteDeviceObjects()<br />{<br /> for (DWORD i = 0; i &lt; m_dwNumSubsets; i++)<br />  m_pMeshTextures[i]-&gt;Release();  //释放纹理对象<br /> delete [] m_pMeshMaterials;<br /> delete [] m_pMeshTextures;<br /> m_pMesh-&gt;Release();   //释放Mesh对象<br />    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: FrameMove()<br />// Desc: Called once per frame, the call is the entry point for animating<br />//       the scene.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::FrameMove()<br />{    <br />  // Setup world matrix<br /> float angle = 3 * D3DX_PI / 180;<br /> D3DXMATRIX matWorld;<br /> ::D3DXMatrixRotationY( &amp;matWorld, angle ); <br /> m_pd3dDevice-&gt;SetTransform( D3DTS_WORLD, &amp;matWorld );</p><p><br />    // Set up view matrix<br /> <br />    float fRoll=0, fPitch =0, fYaw = 0.0f;<br />    float fOneStep=1.5;<br />    D3DXVECTOR3 vPos(0.0f, 0.0f, 0.0f);<br />    static D3DXMATRIX matView  = D3DXMATRIX(1.0f, 0.0f, 0.0f, 0.0f,<br />                 0.0f, 1.0f, 0.0f, 0.0f,  <br />                 0.0f, 0.0f, 1.0f, 0.0f,  <br />                 0.0f, 0.0f, 0.0f, 1.0f);<br /> // Process keyboard input<br /> if (m_bKey[VK_UP])   fPitch -= fOneStep*0.05; // Pitch Up<br />    if (m_bKey[VK_DOWN])  fPitch += fOneStep*0.05; // Pitch Down<br />    if (m_bKey[VK_LEFT])     fYaw -= fOneStep*0.05; // Turn Left<br />    if (m_bKey[VK_RIGHT])     fYaw += fOneStep*0.05; // Turn Right<br />    //if (m_bKey['C'])      fRoll += fOneStep; // Rotate Left<br />    //if (m_bKey['X'])      fRoll -= fOneStep; // Rotate Right<br />    if (m_bKey['W'])  vPos.z += fOneStep; // Move Forward<br />    if (m_bKey['S'])   vPos.z -= fOneStep; // Move Backward<br />    if (m_bKey['A'])  vPos.x -= fOneStep; // Slide Left<br />    if (m_bKey['D'])  vPos.x += fOneStep; // Slide Right<br />    if (m_bKey['Q'])     vPos.y += fOneStep; // Slide Down<br />    if (m_bKey['E'])     vPos.y -= fOneStep; // Slide Up</p><p>    // Update position and view matricies<br />    D3DXMATRIX matR, matTemp;<br /> D3DXQUATERNION qR;<br /> D3DXQuaternionRotationYawPitchRoll (&amp;qR, fYaw, fPitch, fRoll); <br /> D3DXMatrixRotationQuaternion (&amp;matR, &amp;qR);      <br /> D3DXMatrixMultiply (&amp;matView, &amp;matR, &amp;matView);<br /> D3DXMatrixTranslation (&amp;matTemp, vPos.x, vPos.y, vPos.z);<br /> D3DXMatrixMultiply (&amp;matView, &amp;matTemp, &amp;matView);<br /> D3DXMatrixInverse (&amp;matTemp, NULL, &amp;matView);<br /> //D3DXMatrixMultiply(&amp;matTemp,&amp;matTemp,m_ArcBall.GetRotationMatrix());<br /> m_pd3dDevice-&gt;SetTransform(D3DTS_VIEW, &amp;matTemp );<br /> <br />    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: Render()<br />// Desc: Called once per frame, the call is the entry point for 3d<br />//       rendering. This function sets up render states, clears the<br />//       viewport, and renders the scene.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::Render()<br />{<br /> // Clear the backbuffer<br />   m_pd3dDevice-&gt;Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,<br />                         0x000000ff, 1.0f, 0x00000000 );<br />    // Begin the scene<br />    if( SUCCEEDED( m_pd3dDevice-&gt;BeginScene() ) )<br />    {<br />  //m_pd3dDevice-&gt;SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);//解决发暗问题<br />  for( DWORD i=0; i &lt; m_dwNumSubsets; i++ )<br />    {<br />  //设置子集的材质<br />  m_pd3dDevice-&gt;SetMaterial( &amp;m_pMeshMaterials[i] );<br />  //设置子集的纹理，混合方式使用缺省值：纹理 × 材质的漫反射<br />  m_pd3dDevice-&gt;SetTexture( 0, m_pMeshTextures[i] );<br />  //绘制子集<br />  m_pMesh-&gt;DrawSubset( i );<br />  m_pd3dDevice-&gt;SetTexture( 0, NULL);<br />     }</p><p>      // End the scene.<br />      m_pd3dDevice-&gt;EndScene();<br />    }</p><p>    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: FinalCleanup()<br />// Desc: Called before the app exits, this function gives the app the chance<br />//       to cleanup after itself.<br />//-----------------------------------------------------------------------------<br />HRESULT CMyD3DApplication::FinalCleanup()<br />{<br />    return S_OK;<br />}</p><p>//-----------------------------------------------------------------------------<br />// Name: MsgProc()<br />// Desc: Message proc function to handle key and menu input<br />//-----------------------------------------------------------------------------<br />LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,<br />                                    LPARAM lParam )<br />{<br />    // Pass mouse messages to the ArcBall so it can build internal matrices<br />    //m_ArcBall.HandleMouseMessages( hWnd, uMsg, wParam, lParam );<br /> // Record key presses<br />    if( WM_KEYDOWN == uMsg )<br />    {<br />        m_bKey[wParam] = 1;<br />    }</p><p>    // Perform commands when keys are rleased<br />    if( WM_KEYUP == uMsg )<br />    {<br />        m_bKey[wParam] = 0;<br /> }<br />  // Pass remaining messages to default handler<br />    return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );<br />}<br /></p><img src ="http://www.cppblog.com/stevennash/aggbug/13329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:38 <a href="http://www.cppblog.com/stevennash/articles/13329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D 9.0 SDK 文档 (中文版)</title><link>http://www.cppblog.com/stevennash/articles/13327.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 19:30:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13327.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13327.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13327.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13327.html</trackback:ping><description><![CDATA[
		<strong>Direct3D 9.0 SDK 文档 (中文版)<br />引自：<a href="http://www.gesoftfactory.com/developer/">http://www.gesoftfactory.com/developer/</a><br /><br /><p align="center"><b><font color="#004080" size="5">开发者园地</font></b></p><p><b>版权声明：</b></p><p>此处提供的所有Direct3D 9.0 SDK 文档(中文版)的版权属于www.gesoftfactory.com及其所有人。在保持文档原貌（即：不对文档的内容做任何更改）的前提下，任何人可以免费下载和使用本文档，但不得以任何形式转载本文档的内容。在未经许可的情况下，禁止任何人/实体将本文档用于商业或赢利目的。如果需要在别处提供指向本站的链接，请事先用电子邮件联系并获得许可。www.gesoftfactory.com及其所有人保留对本文档的所有权利。</p><p>本页面（http://www.gesoftfactory.com/developer）提供的中文版文档将不定期更新，恕不另行通知。</p><p><b>Direct3D 9.0 SDK 文档 (中文版)</b></p><p><b>请注意：目前不提供单独的文件包供下载，不便之处，敬请谅解。</b></p><p>Direct3D起步 (Getting started with Direct3D)</p><p>- <a href="http://www.gesoftfactory.com/developer/D3DArch.htm">Direct3D体系结构 (Direct3D Architecture)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/3DCS.htm">三维坐标系与几何学 (3-D Coordinate Systems and Geometry)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/Device.htm">设备 (Devices)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/D3DObj.htm">Direct3D对象 (Direct3D Object)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/Resources.htm">资源 (Resources)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/States.htm">状态 (States)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/VD.htm">顶点声明 (Vertex Declaration)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/VF.htm">顶点格式 (Vertex Formats)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/OG.htm">几何体 (Object Geometry)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/Rendering.htm">渲染 (Rendering)</a> (alpha version)</p><p>固定功能流水线 (Fixed Function Pipeline)</p><p>- <a href="http://www.gesoftfactory.com/developer/VnPP.htm">顶点和像素处理 (Vertex and Pixel Processing)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/Transform.htm">变换 (Transforms)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/VnC.htm">视区和裁剪 (Viewports and Clipping)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/LnM.htm">光与材质 (Lights and Materials)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/Textures.htm">纹理 (Textures)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/PP.htm">可编程流水线 (Programmable Pipeline)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/PSM.htm">可编程数据流模型 (Programmable Stream Model)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/VertexShaders.htm">顶点着色器 (Vertex Shaders)</a> (alpha version)</p><p>- <a href="http://www.gesoftfactory.com/developer/PixelShaders.htm">像素着色器 (Pixel Shaders)</a> (alpha version)</p><p>高级主题 (Advanced Topics) (comming soon)</p><p>- 顶点流水线 (Vertex Pipeline)</p><p>- 像素流水线 (Pixel Pipeline)</p><p>- 帧缓存 (Frame Buffer)</p><p>- <a href="http://www.gesoftfactory.com/developer/Effects.htm">效果 (Effects)</a> (New, 2003/08/10, alpha version)</p><p><b><font color="#008000">欢迎任何意见或建议以及错误报告，你的帮助会使我们提供更好的文档。</font></b></p></strong>
<img src ="http://www.cppblog.com/stevennash/aggbug/13327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-04 03:30 <a href="http://www.cppblog.com/stevennash/articles/13327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE 分析之消息机制</title><link>http://www.cppblog.com/stevennash/articles/13241.html</link><dc:creator>Technical Consultant</dc:creator><author>Technical Consultant</author><pubDate>Tue, 03 Oct 2006 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/stevennash/articles/13241.html</guid><wfw:comment>http://www.cppblog.com/stevennash/comments/13241.html</wfw:comment><comments>http://www.cppblog.com/stevennash/articles/13241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/stevennash/comments/commentRss/13241.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/stevennash/services/trackbacks/13241.html</trackback:ping><description><![CDATA[
		<p align="left">                                             OGRE 分析之消息机制<br />一、 消息的产生<br />        InputReader：从各种输入设备读取数据，可以看作是消息产生地。具体的InputReader由PlatformManager 创建，它是与平台相关的。<br />                                       OGRE::InputReader<br />                        ________________|_______________<br />                        |                           |                         |<br />                Ogre::GLXInput   Ogre::SDLInput   Ogre::Win32Input8<br /><br />        InputEvent：消息的载体。界面元素层输入消息的基类。<br />        输入消息在它的产生地正常处理之前先被发送给Listeners。这样就可以用Listeners 和GuiElement subclasses 拦截消息，改变消息处理的默认行为。<br />        InputEvent 包含判断组合键的按下情况。<br />                        Ogre::InputEvent<br />                     ________|_______<br />                    |                            |<br />            Ogre::KeyEvent   Ogre::MouseEvent<br />二、 消息的处理<br />        EventListener：真正处理消息的地方。<br />                               Ogre::EventListener<br />           _________________|___________________<br />           |                              |                              |<br />Ogre::KeyListener   Ogre::MouseListener   Ogre::MouseMotionListener<br /> <br />       EventTarget：处理消息的中介。所有InputEvent消息处理者的基类。EventTarget处理<br />消息是由各种Listener 完成的。KeyTarget 调用KeyListener ， MouseTarget 调用<br />MouseListener，MouseMotionTarget调用MouseMotionListener。<br />                                        Ogre::EventTarget<br />                        _______________|____________________<br />                        |                                                            |<br />            Ogre::KeyTarget                                      Ogre::PositionTarget<br />                        |                                         __________|________________<br />           Ogre::EventProcessor                       |                                              |<br />                                      Ogre::MouseMotionTarget               Ogre::MouseTarget<br />                          ___________|________                     __________|________<br />                          |                                 |                    |                                |<br />               Ogre::Cursor     Ogre::EventProcessor   Ogre::Cursor   Ogre::EventProcessor<br /> 三、 消息的传递<br />        EventDispatcher：代理分发消息。负责把InputEvent消息分派给EventTarget。在分发消息时，EventDispatcher根据InputEvent的类型（MouseEvent或者KeyEvent）分别发送给需要的PositionTarget。<br />        EventTarget 由TargetManager 管理， 每一个TargetManager 都对应一个EventDispatcher。对应OverlayManager的EventDispatcher管理2D GUI组件，对应<br />SceneManager的EventDispatcher管理3D物体。<br /><br />        EventProcessor：获取消息、维护消息队列、分发消息。<br />                    Ogre::EventTarget     Ogre::EventTarget<br />                                   |                          | <br />                   Ogre::PositionTarget  Ogre::PositionTarget                         Ogre::EventTarget<br />                                    |                         |                                                             |<br />Ogre::FrameListener      |                         |                                                             |<br />            |      Ogre::MouseTarget    Ogre::MouseMotionTarget                   Ogre::KeyTarget<br />            |                       |                       |        Ogre::Singleton&lt;EventProcessor&gt;  |<br />            |_____________|_____________|________________|__________________|<br />                                                             |<br />                                           Ogre::EventProcessor<br />        EventProcessor 在初始化的时候，创建一个EventQueue 和一个InputReader，<br />InputReader 初始化为侦听鼠标和键盘消息，接收到的消息存放于上述的EventQueue<br />中。<br />        EventProcessor 是一个FrameListener，调用EventProcessor::startProcessingEvents(true)把EventProcessor 添加到Root 的FrameListener 链表中（实际为std::set），并激活EventQueue。<br />        EventProcessor又是EvenetTarget，所以维护有Listener列表，从基类继承而来的。除此之外，EventProcessor还维护了一个EvenetTarget列表和EventDispatcher列表。而所有的这些都是用来处理或传递消息的。<br /><br />四、 消息处理整个过程<br />        程序进入Root::startRendering()后，进入消息循环。在渲染帧开始之前，Root 调用所有注册的FrameListener 的FrameListener::framStarted(…)函数，使之做好渲染前的准备。前面分析了EventProcessor 属于FrameListener 并注册到了Root，所以Root会调用EventProcessor:: framStarted(…) 函数。此时， EventProcessor 调用InputReader 捕获鼠标、键盘消息，然后进入消息分发阶段。<br />        EventProcessor将把队列中所有的消息通过EventDispatchers分发给EventTarget处理，EventTarget本身不能处理消息，需要借助EventListeners来处理。所以消息由依附在EventTarget上的EventListeners处理。<br />        EventDispatchers返回后，若存在没有处理的消息则先由EventProcessor维护的EventTargets处理，仍未处理的则由EventProcessor本身处理。由于EventProcessor也是EventTargets，所以它需要发给添加到EventProcessor中的EventListeners来处理。<br />        处理完鼠标键盘消息之后，Root 开始调用RenderSystem 来渲染RenderTarget。然后调用所有FrameListener 的FrameListener::frameEnded(…)。<br /><br />总体过程可以看成如下顺序如下：<br />InputReader <br />--&gt; EventProcessor --&gt; EventDispatcher --&gt; EventTarget<br />--&gt; EventListener<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p>
<img src ="http://www.cppblog.com/stevennash/aggbug/13241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/stevennash/" target="_blank">Technical Consultant</a> 2006-10-03 15:46 <a href="http://www.cppblog.com/stevennash/articles/13241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>