③访问printColorQ?/span>
1 // 讉KConfig表中的printColor函数?/span>2 luabind:: object printColor = configTable[ "fun " ];
在C++代码中调用printColor有两U方法:
1 printColor(); // W一U调用方法?/span>2 luabind::call_function < void > (printColor); // W二U调用方法?/span>
注意W二U调用方法用了call_function函数的重载Ş式?br> 如果要访问全局表中的变量,Ҏ是一LQ只不过是用globle句柄q行讉KQ这里就不再赘言?/span>
]]>Ogre学习W记(一) http://www.shnenglu.com/eros/archive/2009/05/20/83455.html林公?/dc:creator>林公?/author>Wed, 20 May 2009 03:48:00 GMT http://www.shnenglu.com/eros/archive/2009/05/20/83455.html http://www.shnenglu.com/eros/comments/83455.html http://www.shnenglu.com/eros/archive/2009/05/20/83455.html#Feedback 0 http://www.shnenglu.com/eros/comments/commentRss/83455.html http://www.shnenglu.com/eros/services/trackbacks/83455.html 本系列文章部分内Ҏ源于 http://ogre3d.cn
的Ogrepd教程的中文翻译版Q加上一些我自己学习时的W记?/span> Ogre三基?br> SceneManager 场景理?br> 屏幕上显C的所有东襉K有场景管理器来管理。当往场景中添加物体时Q场景管理器会记录物体的位置Q当d摄像机来观察某个场景Ӟ场景理器会记录摄像机的位置。Ogre里有多种场景理?br> Entity 实体 一个实体是可以在场景中渲染的物体之一。可以把实体理解ZQ何一?D模型。一个机器h可以使一个实体,一条鱼可以是一个实体,大地草原可以是一个非常大的实体?span style="color: red;">灯光Q摄像机Q粒子,q告牌等不能成ؓ实体?/span> Ogre中你不能直接一个实体放入场景中Q而是实体与场景节点l在一Pq个场景节点则包括了实体的方位信息?br> SceneNode 场景节点 场景节点持l跟t与它绑在一L实体的方位。当你创Z一个实体时Q它直到与一个场景节点绑定后才会被渲染。同P一个场景节点也不能单独的在屏幕上显C出来,只有与一个实体绑定后才能在屏q上昄?span style="color: red;">一个场景节点可以绑定多个实体,场景节点同样可以和其他场景节点绑定,但是一个实体不能被多个场景节点l定?/span> 每个场景理器都有一个根节点Q而场景节炚w是在根节点的基础上徏立,其位|L相对于根节点的?br> 实践 要创Z个实体,可以调用SceneManager的createEntityҎQ?br>
// 创徏一个实? 加蝲Athena|格?/span> Entity* entity1 = mSceneMgr -> createEntity( " athene1 " , " athene.mesh " );
createEntity的第一个参Cؓ实体指定了一个唯一的标识符Q第二个参数表示要加载的资源名称Q在q里是一个名为athene的网格模型?br> 我们可以个实体代表的|格模式指定一个材质:
// 讄|格材质?/span>entity1 -> setMaterialName( " Examples/Athene/NormalMapped " );
创徏了一个实体后Q还要创Z个场景节点与它绑定v来:
// 创徏一个子场景节点?/span>SceneNode * node1 = mSceneMgr -> getRootSceneNode() -> createChildSceneNode( " athene1 " );
与实体一P场景节点的名字也是唯一的,在这里是athene1?br> 然后实体和场景节点l定Q?br>
// 实体绑定到场景节点上?/span>node1 -> attachObject(entity1);
l定之后实体׃被渲染出来,默认情况下实体会被渲染到世界坐标的原?0, 0, 0)处?br> 要改变实体在场景中的位置Q可以用与之绑定的场景节点的setPositionҎQ?br>
node1 -> setPosition( 30 , 0 , 0 );
q样场景节点q对于根节点往X轴正方向Ud?0个单位?br> 同样Q还可以使用场景节点的translateҎ辑ֈ相同的目的:
node1 -> translate(Vector3( 30 , 0 , 0 ));
setPosition位置的改变是相对于父节点?translate则可以设|变换相对于哪个坐标pR?br> 要得到场景节点的父节点,可以调用getParentNode:
SceneNode* parentNode = node1 -> getParentSceneNode();
要得到场景节点的名称Q可以调用getName:
String nodeName = nod1 -> getName();
因ؓ场景节点的移动都是相对于父节点的Q所以很Ҏ实现两个节点一L动:
Entity * entity1 = mSceneMgr -> createEntity( "Athene1 " , " Athene.mesh " ); SceneNode * node1 = mSceneMgr -> getRootSceneNode() -> createChildSceneNode( "Athene Node1 " ); ode1 -> attachObject( entity1 ); Entity * entity2 = mSceneMgr -> createEntity( " Athene2" , " Athene.mesh " ); SceneNode * node2 = node1 -> createChildSceneNode( " AtheneNode2 " , Vector3( 50 , 0 , 0 ) ); node2 -> attachObject( entity2 );
q样一来,node1成了node2的父节点Q移动node1会node2跟着一L动,而移动node2不会影响node1?br> ~放 使用场景节点可以对网格模型进行羃放:
node1 -> scale( 1.5 , 1.5 , 1.5 );
scale的三个参数分别对应x, y, z方向上的~放比例Q上面的例子网格模型放大到1.5倍?br> 旋{ q可以对|格模型q行旋{Q其中yaw是Y轴的旋{Qpitch是X轴的旋{Qroll是Z轴的旋{Q?br>
node1 -> yaw(Degree( - 90 )); node1 -> pitch(Degree( - 90 )); node1 -> roll(Degree( - 90 ));
]]>Direct3D材质和灯光小?/title> http://www.shnenglu.com/eros/archive/2009/05/14/82894.html林公?/dc:creator>林公?/author>Wed, 13 May 2009 18:53:00 GMT http://www.shnenglu.com/eros/archive/2009/05/14/82894.html http://www.shnenglu.com/eros/comments/82894.html http://www.shnenglu.com/eros/archive/2009/05/14/82894.html#Feedback 0 http://www.shnenglu.com/eros/comments/commentRss/82894.html http://www.shnenglu.com/eros/services/trackbacks/82894.html mDevice -> SetRenderState(D3DRS_AMBIENT, 0xffffffff ); 光照
DirectX中有四种光照模型Q?/font>
环境光:环境光没有方向和位置上的特征Q只有一个颜色亮度|不会衰减Q所以在所有方向和所有物体表面投的环境光的数量是恒定不变的?/p>
漫反:漫反在生活中最为普遍,太阳光的直射Q日光灯的照都可以用O反射光来模拟。O反射由光的方向和物体表面的法向量军_。O反射光的I间位置和方向对物体的照明有很大的媄响?/p>
镜面反射Q当观察金属制品和玻璃制品的表面Ӟ改变观察点的位置Q会发现物体表面的亮度也会发生变化,q种现象UC为镜面反?/p>
自发光:是物体自n发光Q通过讄材质的自发光属?font face="Times New Roman">EmissiveQ颜色和透明度)来实现。自发光可以影响一个对象的颜色。可以用材质的自发光来实现发光的对象,而不用在场景中添加灯光,减少了计量?/font>
用自发光属性创建的材质q不发射能被场景中其他物体反的光,也就是说自发光不参与光照计算?/p>
有三U光?/p>
点光源:点光源有颜色和位|,但是没有方向Q它向所有方向发的光都一栗在E序中需要提供点光源的颜Ԍ位置Q衰减系数等参数?/p>
늁泡是点光源的一个例子。这U光的强度会随着距离物体的远q而衰减?/p>
方向光:只有方向和颜色属性的光源Q没有位|,衰减。可以想象成从无I处发来的光,例如太阳光?/p>
聚光灯:聚光灯有颜色Q位|,方向Q类似现实中的探照灯。聚光灯又一个明亮的内椎体和大一点的外椎体组成。光的强度从内椎体到外椎体逐渐衰减Q衰减的规律?font face="Times New Roman">Falloff,Theta(内锥角)?/font>Phi Q外锥角Q三个属性共同决定?/font>
DirectX中物体的颜色由光的颜色和材质的颜色共同决?/font>( 和现实世界情况不同)?/font>
默认情况下,D3D中的灯光是开启的Q就是说?
mDevice->Set
RenderState(D3DRS_LIGHTING, TRUE);
和忽略这一句效果一栗?br />
如果要禁用灯光,将q句代码中的TRUE改ؓFALSE?br />
1 mDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);
如果用灯光Q那么Q何的材质讄都不会有效果?
2 mDevice -> SetRenderState(D3DRS_AMBIENT, 0xffffffff );
关于q两句代?~号??)Q又有几U情? 1)1为FALSEӞ启用2Q那么会获得一个环境光照明Q此时设|材质无?渲染对象为白?Q纹理可以正常显C?如果有纹??br /> 2)1为TRUEӞ启用2Q材质设|有效,会媄响渲染结果,U理可以正常昄?br /> 3)1为FALSEӞ用2Q材质设|失效,U理可以正常昄?br /> 4)1为TRUEӞ用2Q材质设|失效,U理无法昄(渲染对象为黑??br /> P.S.以上所说的材质指的是D3DMATERIAL9Q不包括点艌Ӏ带有顶点色Ӟ1为TRUE时渲染ؓ黑色QFALSE时ؓ正常Q和2的状态无兟?br /> l论Q当开启光照时Q必L定一U光源才能渲染对象正确l制(渲染状态设|的环境光或者其?U类型的光源)?br />
]]> 在Qt中用DirectX http://www.shnenglu.com/eros/archive/2009/05/13/82758.html林公?/dc:creator>林公?/author>Tue, 12 May 2009 22:40:00 GMT http://www.shnenglu.com/eros/archive/2009/05/13/82758.html http://www.shnenglu.com/eros/comments/82758.html http://www.shnenglu.com/eros/archive/2009/05/13/82758.html#Feedback 0 http://www.shnenglu.com/eros/comments/commentRss/82758.html http://www.shnenglu.com/eros/services/trackbacks/82758.html 阅读全文 ]]> Luabind导出cdlua http://www.shnenglu.com/eros/archive/2009/05/02/81661.html林公?/dc:creator>林公?/author>Fri, 01 May 2009 17:32:00 GMT http://www.shnenglu.com/eros/archive/2009/05/02/81661.html http://www.shnenglu.com/eros/comments/81661.html http://www.shnenglu.com/eros/archive/2009/05/02/81661.html#Feedback 6 http://www.shnenglu.com/eros/comments/commentRss/81661.html http://www.shnenglu.com/eros/services/trackbacks/81661.html 刚开始学习LuabindQ所以算是一些简单的W记?br> 使用Luabind前要包含相关的头文gQ引入luabind命名I间。注意包含luabind.hppq不会自动包含lua相关头文Ӟ要根据需要自己添加?/span>
#include < luabind / luabind.hpp > extern " C " { #include < lua.h > #include < lualib.h > }using namespace luabind;
假设有以下类定义Q?br>
1 // TestClass.h 2 class TestClass 3 { 4 public : 5 6 TestClass( string s); 7 8 static TestClass * Singleton(); 9 10 void Print(); 11 12 private : 13 14 static TestClass * mSingleton; 15 16 string mString; 17 }; 18 19 // TestClass.cpp 20 TestClass * TestClass::mSingleton = NULL; 21 22 TestClass::TestClass( string s) 23 { 24 mString = s; 25 } 26 27 TestClass * TestClass::Singleton() 28 { 29 if (TestClass::mSingleton == NULL) 30 { 31 return new TestClass( " Hello " ); 32 } 33 else 34 { 35 return mSingleton; 36 } 37 } 38 39 void TestClass::Print() 40 { 41 cout << mString << endl; 42 }
创徏一个bindClass函数Q用来进行导出类的相兛_?/span>
1 int bindClass(lua_State * L) 2 { 3 open(L); 4 5 module(L) 6 [ 7 class_ < TestClass > ( " TestClass " ) 8 .def(constructor < string > ()) 9 .def( " Print " , & TestClass::Print), 10 def( " Singleton " , TestClass::Singleton) // h意static成员函数Singleton()导出时和非静态成员函数的写法区别Q?br> // 和全局函数的导出写法一栗?/span>11 ]; 12 13 return 0 ; 14 }
def模版cM定义导出函数Ӟ成员函数指针一定要用取地址W?/span>&Q?span style="COLOR: #000000">如TestClass::Print ()?span style="FONT-FAMILY: 微Y雅黑">而自由函数和静态函数可用可不用Q如 TestClass::Singleton()?br> 现在可以写代码试了: // test.lua
1 testClass = Singleton() 2 testClass:Print()
// main.cpp
1 int _tmain( int argc, _TCHAR * argv[]) 2 { 3 TestClass testClass( " Hello from lua. " ); 4 5 lua_State * L = luaL_newstate(); 6 7 init(L); 8 9 luaL_dofile(L, " add.lua " ); 10 11 lua_close(L); 12 13 return 0 ; 14 } 15
q行l果Q?/span>
]]> VS2008下编译luabind 0.8.1 http://www.shnenglu.com/eros/archive/2009/04/29/81508.html林公?/dc:creator>林公?/author>Wed, 29 Apr 2009 15:31:00 GMT http://www.shnenglu.com/eros/archive/2009/04/29/81508.html http://www.shnenglu.com/eros/comments/81508.html http://www.shnenglu.com/eros/archive/2009/04/29/81508.html#Feedback 5 http://www.shnenglu.com/eros/comments/commentRss/81508.html http://www.shnenglu.com/eros/services/trackbacks/81508.html 学了一D|间LuaQ显然直接在目中用是很不方便Qgoogle了一下,g大家都对luabindq个lua包装c青睐有加,于是我也随大势想用用看?br> 先做好准备工作,下蝲了luabin 0.8.1源码QBoost 1.3.8源码和lua 5.1.4源码Q编译环境是VS2008 SP1。之前在|上看到一些文章说q些开源Y件之间的版本依赖比较敏感Q可能会有这样那L问题Q动手之前有些惶恐?br> q运的是Q编译过E很利Q如下: 1.~译lua 5.1.4 q入VS2008的命令行工具Q定位到lua的源码目录下Q执行命令etc\luavs.batQ没什么问题的话很快就可以~译好luaQ得到lua51.lib和lua51.dll?br> 2.~译luabind 解压下蝲回来的luabind压羃包,假设解压到d:\luabind-0.8.1\QBoost解压到d:\boost 1_38_0\Qlua解压到d:\lua 5.1.4\ 在VS中新Z个静态库目Q将d:\luabind-0.8.1\src下的源码全部d到项目中Q然后在目中新建luabind和luabind\detail\两个虚拟文g夹,对应的将d:\luabind-0.8.1\luabind和d:\luabind-0.8.1\luabind\detail下的文gd到文件夹中?br> 然后为项目添加附加包含目录,右键点击目节点->属?>配置属?>C\C++标签下,在附加包含目录中填入d:\luabind-0.8.1\Qd:\boost 1_38_0\kQd:\lua 5.1.4\src\。然后修攚w目字W集为多字节字符集?br> 准备qAQ生成项目。在我的环境中编译很利Q没有出CQ何问题,成功后会得到luabind.lib?br> 接下来就按照惯例来写一个hello worldE序作ؓ使用luabind的第一步?br> 在VS中新Z个控制台目Q类型ؓDLLQ命名项目ؓHello WorldQ然后键入以下代码:
1 #include " stdafx.h " 2 #include < iostream > 3 #include < luabind / luabind.hpp > 4 5 void greet() 6 { 7 std::cout << " hello world!\n " ; 8 } 9 10 extern " C " int __declspec(dllexport) init(lua_State * L) 11 { 12 using namespace luabind; 13 14 open(L);15 16 module(L)17 [18 def(" greet " , & greet) 19 ];20 21 return 0 ; 22 }
注意Q在Windows环境下init函数之前是要加__declspec(dllexport)才能函数导出的Q而luabind的文档中的环境是linuxQ默认不用加__declspec(dllexport)也可以导?因个折腾了我半天才把hello word成功q行)?br> ~译目Q?记得luabind.lib和lua51.libd到链接选项中:目属?>q接?>输入->附加依赖文gQ加入luabind.lib和lua51.lib )?br> hello world.dll攑ֈlua51.dll和lua.exe所在的目录下?br> 打开lua命o行,键入: 试成功Qenjoy?/font>
]]> SceneNode::setDirection函数问题 http://www.shnenglu.com/eros/archive/2008/12/30/70732.html林公?/dc:creator>林公?/author>Mon, 29 Dec 2008 17:27:00 GMT http://www.shnenglu.com/eros/archive/2008/12/30/70732.html http://www.shnenglu.com/eros/comments/70732.html http://www.shnenglu.com/eros/archive/2008/12/30/70732.html#Feedback 0 http://www.shnenglu.com/eros/comments/commentRss/70732.html http://www.shnenglu.com/eros/services/trackbacks/70732.html mSn -> translate(mPosition * evt.timeSinceLastFrame, Node::TS_WORLD);
刚开始学习Ogre,做了个很单的demo,用键盘的上下左右控制一个h物模型四处走动。逻辑很简单,但是实现到想要的效果却费了一番周折?br> 一开始用一个Vector3 mPosition变量保存人物的位|,然后Real mWalkSpeed保存人物的移动速度Q在上下左右的按键响应代码中分别 写上处理人物各方向移动的代码Q?/span>
]]> [ZT]DirectX中的投媄变换 http://www.shnenglu.com/eros/archive/2008/11/08/66356.html林公?/dc:creator>林公?/author>Sat, 08 Nov 2008 12:42:00 GMT http://www.shnenglu.com/eros/archive/2008/11/08/66356.html http://www.shnenglu.com/eros/comments/66356.html http://www.shnenglu.com/eros/archive/2008/11/08/66356.html#Feedback 0 http://www.shnenglu.com/eros/comments/commentRss/66356.html http://www.shnenglu.com/eros/services/trackbacks/66356.html 原脓地址Q?/span>http://blog.csdn.net/BAKER_LEE/archive/2008/08/20/2801515.aspx
DirectX中投影变换D3DXMatrixPerspectiveFovLHQ)其实产生的变换矩阵不是将3D物体转换?Dq面画面的变换。实际上
是把3D世界的物体变换到(1,1,0) (-1,1,0) (-1,-1,0) (1,-1,0) (1,1,1) (-1,1,1)
(-1,-1,1) (1,-1,1)q个盒子中。在Jim Adams 的著?lt;Role playing games with
DriectX 8.0>和Frank Luna 的著作中<Introduction to 3D Game Programming
with
DirectX9.0>都把q个变换矩阵讲成?D?D的变换。实际上在DirectX?D?D的变换是由SDK自己完成的。而我们要做的?
?D世界变换C面那个小盒子中?
q个变换矩阵是投影变换的预变换?/p>
在DirectX中,把视口的高作?D世界里面的长度:2.0f来用的Q一个视点观察世界的视野范围在Y轴上无论什么情况下都是 -1.0f?.0fQ这一点在后面来证明)。把视口的高作ؓy_端坐标为(xQ?Q,底端坐标为(xQ?1Q?/p>
视口Q在H体中显C?D的矩形范_可以通过D3DDevice的SetViewPortQ)来设|大,默认的大ؓH体的大?/p>
变换的过E就是把点的向量乘以变换矩阵Q可以得到这个点在新坐标pȝ对应向量Q在投媄变换矩阵中Z轴的D?~1之内Q也是?D世界里所有的炚w会被投媄C上描q的盒子中?/p>
我们用函数D3DXMatrixPerspectiveFovLH来获得该“投媄变换”矩阵?/p>
D3DXMATRIX * D3DXMatrixPerspectiveFovLH(
D3DXMATRIX * pOut ,
FLOAT fovy ,
FLOAT Aspect ,
FLOAT zn ,
FLOAT zf
);
其中参数fovy为y轴上的视角,Aspect为高宽比Qzn裁面Qzf裁面?/p>
Y轴的视角Q在DirectX的帮助文档中描述fovy为filed of view in y direction?/p>
高宽比:一般用于全屏显C,如果我们要让3D世界充满整个H口Q就必须让高宽比{于H口的高宽比Q例如让我们的窗口正常显C?#8221;标准视野”[2X2
的一个面,点坐标为(1Q?Q,Q?1Q?Q,Q?1Q?1Q,Q?Q?1Q]Q我们必LH口的高宽比讄?Q?Q这P标准视野可以充满整个窗
口,否则
会在左右留出I白Q这个空白是无法用VIEWQWORLD变换所能填充的Q相当于word文档采用“文档”视图里面的两边的灰色区域Q是无法~辑的,在一
般的3DE序里面是不允许出现q种情况的,但是我们的显C器的高宽比不是1Q?Q而且大部分的用户也不习惯?Q?的窗口来使用E序Q我们需要调整这个标
准视野,来适应我们的窗口大,Aspect是q个作用Q有一炚w要说明的Aspect不等?Q不代表标准视野׃是(1Q?Q,Q?1Q?Q,
Q?1Q?1Q,Q?Q?1Q,如果Aspect = 0.5
标准视野也还是(1Q?Q,Q?1Q?Q,Q?1Q?1Q,Q?Q?1Q,只不qx轴上的单位长度的像素??y轴上单位长度的像素值的2倍?/p>
裁面的作? 在Z轴方向上Q不昄z坐标于zn的或者大?zf的点?/p>
在上图中QU色的线为我们要昄的面Q红色的弧就是上面函数fovy 的夹角,当这个夹角ؓ90°的时候,我们H口的视野ؓ标准视野Q?span style="color: red;">当夹角羃时Q可视范围就变小Q如图,?0°变ؓ60°的时候,可视范围变小了,要显C的面,相对于可以范围变大了Q由于我们的H口是不变的Q也是说实际显C的像素g变,要显C的面就相对于变大,fovy的值变的l果是把要昄的面变大?/span>
当fovy?的时候呢Q视野就?Q就是说什么都看不刎ͼH口中显C的是底色?/p>
当fovy变大?80°的时候呢Q视野的范围U夹角上的垂直于Z轴的且过点(0Q?Q?Q的q线。当视线夹角变大视野范围也变大,夹角近?80°的时候视野范围趋q于无穷大,要显C的面相对于视野范围是0Q也是说羃到最就?.所以我们在讑֮fovy的gؓ180°的时候也是什么都看不见,为底艌Ӏ?/p>
那大?80°的情况呢Q在我们的视野理Z是不存在q种情况的,当视角大?80°Ӟ视角于Z轴垂直的q线是不会过点(0Q?Q?Q的。但是函数放在我们面前,我们是可以输入大?80°的数|l果会如何呢Q?/p>
非常奇的事情发生了Q我们的图以原点Z心旋转了180°Q这是无法用我们的视野理论来解释?因ؓ180°的视野范围就已经是个极限了,“越极限”是只能在q告中出现的词汇Q如果能越Q那׃叫极限了QPQ?/p>
在MSDN的文档中有这样一个数学公式:y-scale = cotQfovy/2Q?/p>
q下明白了Q当我们输入大于180°的时候cot的gؓ负数。而x-scale = y-scale/ Aspect?
也就是说Q一?D世界的点Q在视野大于180°的作用下Q它的放?~小倍数不变Q但是需要对X轴做一ơ对U变换,q要对Y轴做一ơ对U变换。相当于对原点做一ơ对U变换?/p>
拿到q个公式Q我们就可以对前面的标准做一个证明:
当fovy?0° Aspect = 1的时候,是说y-scale = cotQ?5°Q?= 1
x-scale = 1Q这时y和x的羃放比都ؓ1Q没有羃放。我们显C样一个面
{-1.0f, -1.0f, 0.0f},
{-1.0f, 1.0f, 0.0f},
{ 1.0f, 1.0f, 0.0f},
{-1.0f, -1.0f, 0.0f},
{ 1.0f, 1.0f, 0.0f},
{ 1.0f,-1.0f, 0.0f}
我们会发现无论怎么改变H口的高度,q个画面的Y轴方向上都会充满整个视口。(如果我们把视口的高度和宽度设|成一LQ在X轴上也会充满整个视口Q所以DirectX会以视口的高度的二分之一作ؓY轴的单位长度?/p>
]]> 自定义顶点结构与D3DXCOLOR http://www.shnenglu.com/eros/archive/2008/11/08/66298.html林公?/dc:creator>林公?/author>Fri, 07 Nov 2008 20:54:00 GMT http://www.shnenglu.com/eros/archive/2008/11/08/66298.html http://www.shnenglu.com/eros/comments/66298.html http://www.shnenglu.com/eros/archive/2008/11/08/66298.html#Feedback 0 http://www.shnenglu.com/eros/comments/commentRss/66298.html http://www.shnenglu.com/eros/services/trackbacks/66298.html 最q系l的学习Direct3D Q?span style="font-family: 微Y雅黑; ">从DXSDK的例子学赗在Tut02_Vertices例子中,自定义顶Ҏ式ؓQ?br />struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; // D3DXCOLOR color; }; // 初始化顶Ҏ?/span> CUSTOMVERTEX vertices[] = { { 150.0f , 50.0f , 0.5f , 1.0f , D3DXCOLOR( 1.0f , 0.0f , 0.0f , 0.0f ) /* 0xffff0000 */ , }, // x, y, z, rhw, color { 250.0f , 250.0f , 0.5f , 1.0f , D3DXCOLOR( 0.0f , 1.0f , 0.0f , 0.0f ) /* 0xff00ff00 */ , }, { 50.0f , 250.0f , 0.5f , 1.0f , D3DXCOLOR( 0.0f , 0.0f , 1.0f , 0.0f ) /* 0xff00ffff */ , }, };
自定义格式结构体中注释掉的是我后来想用的D3DXCOLOR。原本以为将原先定义的DWORD颜色换成D3DXCOLORcdQ然后初始化的时候相应做替换可以了Q谁知道Q渲染出来的三角形顶炚w色异常: 正常的应该是q样 百思不得其解,郁闷x。后来终于在GameDev.net上找到近似案?