|

楼主 |
发表于 2005-8-8 23:07:58
|
显示全部楼层
是什么。如果你不这样做,它将假设顶点是不同格式的,并且导致崩溃。这时,你就可以编译运行代码了,如果一切正常,你会看到在蓝色的背景里有一个黑色的矩形。这还不是很正确的,因为我们设置顶点的颜色是白色的。这个问题是设备允许了光照,这是我们不需要的。通过在PostInitialize函数里加入这行来关掉光照:g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);现在,重新编译,设备将会使用顶点的颜色了。如果你喜欢,你可以改变顶点的颜色看看效果。到目前为止,一切顺利,但是一个显示一个白色矩形的游戏看上去是很令人厌烦的,我们还没有触及到blit一个位图。所以,我们不得不加入纹理。
Texturing the Panel为面板粘贴纹理
纹理是一个能够从文件装入或者通过数据生成的基本的位图。为简单起见,我们只使用文件。将下面的变量加入到你的全局变量中:LPDIRECT3DTXTURE8 g_pTexture = NULL;这便是我们将要使用的纹理对象。加入这行代码到PostInitialize函数以从文件装入纹理。D3DXCreateTextureFromFileEx(g_pd3dDevice, [Some Image File], 0, 0, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT , 0, NULL, NULL, &g_pTexture);你可以用你选择的文件名替换[Some Image File]。D3DX函数可以装入很多标准格式的文件。我们所使用的象素格式是有alpha通道的,所以我们装入带alpha通道的格式文件,象.dss文件。另外,我也乎略了ColorKey参数,但是你也可以指定一个ColorKey以进行透明。我会回头来讨论一点关于透明的知识。现在,我们有了一个纹理并且已经装入了一个图片。然后我们要告诉设备使用它。加入下面的代码行到Render2D函数的开头:g_pd3dDevice->SetTexture(0, g_pTexture);这告诉了设备用纹理来渲染三角形。这儿要特别记住的事情是考虑到简单我没有加入错误检查。你应该进行正确的错误检查,以确定在纹理被使用之前已经被实际的装入了。一个可能的错误是,在很多硬件中,纹理的大小必须是2的幂,如:64X64,128X512,等等。对于最新的nVidia硬件,这个约束不再是正确的了,但是安全起见,请使用2的幂。这个限制让很多人感到烦心,所以一会儿我会告诉你如何绕过这个限制。现在,编译运行,你可以看到你的图片已经映射到了三角形上了。
Texture Coordinates纹理坐标
注意纹理会被拉伸和缩短以适合矩形。你可以通过调整纹理的坐标来调整这些。例如,如果你把u=1.0那行改为u=0.5,那么只有一半的纹理被使用,而剩下的另一半不会被压缩。所以,如果你有一个640X480的图片,你想把它放到一个640X480的窗口中去,你应该将640X480大小的图片放到一个1024X512大小的纹理中去然后指定纹理坐标为0.625,0.9375。你可以使用纹理中剩余的部分来放置那些会被映射到其他的面板中去的子图片(通过相应的纹理坐标)。通常,你会想优化纹理被使用的方式,因为它们吃光了图片内存并且在总线中移动。这看上去很象blit中的大量的工作,但是很多都会被新式的为3D进行优化的显卡处理掉了。此外,多多考虑如何在系统中移动大块的内存决不是一个坏的想法。但是我还是开始我的演说吧。让我们来看看我们走了多远。首先,我们写了很多代码来blit一个简单的位图。但是,希望你能够看到一些好处和机会。例如,纹理坐标自动缩放图片以适应我们的几何定义。这为我们做了很多工作,但是考虑到后面。如果我们设置使用一个基于百分比映射的垂直矩阵,并且,我们指定一个占据屏幕底部四分之一位置的面板(让我们说它是UI吧),而且我们也用正确的纹理坐标来指定它的纹理,这样,我们的UI在任何选定的窗口/屏幕大小下都会被自动的正确绘制出来。(Not exactly cold fusion),但这只是很多例子中的一个。现在我们已经让纹理可以工作的很好了,我们回过头来谈论一下透明。
Transparency透明
象我以前所说的,加入透明的一个简单的方法就是在调用D3DXCreateTextureFromFileEX函数里指定一个ColorKey值。另一个办法是使用一个实际带alpha通道的图片。无论使用哪种方法为纹理指定透明(使用alpha通道,或者ColorKey),然后运行,你都会看不到有什么区别。这是因为alpha混合还没有被允许。在PostInitialize中加入这些行以允许alpha混合:g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);第一行允许了混合。下两行指定混合如何工作。这会有很多的可能性,不过这是最基本的类型。最后一行进行一些设置以致当改变顶 |
|