最近一直在弄D3D游戏的透视,被他弄得焦头烂额,很多时间都花在了解决代码错误的问题上。不过功夫不负有心人我取得了一些成果,在编写代码的过程当中参阅了大量的DirectX编程方面的资料。同时也在国外N多论坛做了一个名副其实的伸手党,了解和掌握了D3D程序实现透视的一些基础知识。在这里我把我自己在研究过程中的心得体会和一些经验大体整理了一下,只是希望能够找到对D3D感兴趣的朋友能够共同研究,话不多说了,下面开始咱们的教程。 LPDIRECT3DVERTEXBUFFER8 Stream_Data; UINT Stride = 0; if (m_pD3DDev->GetStreamSource(0, &Stream_Data, &Stride) == D3D_OK) Stream_Data->Release(); if(Chams)//这里的chams是透视开关 if(Player) { { //一旦youxi中Stride的值等于所设定的值,就开始执行以下代码: DrawIndexedPrimitive(Device, Type, MinIndex, NumVertices, StartIndex, PrimitiveCount); //在墙后面就是绿色 Device->SetRenderState( D3DRS_ZENABLE,false ); Device->SetTexture( 0, texGreen ); //禁用Z轴缓冲 DrawIndexedPrimitive(Device, Type, MinIndex, NumVertices, StartIndex, PrimitiveCount); //youxi模型在墙前面的话(就是可以看见) Device->SetRenderState( D3DRS_ZENABLE, true ); //打开Z轴缓冲,并填充为蓝色 Device->SetTexture( 0, texBlue); DrawIndexedPrimitive(Device, Type, MinIndex, NumVertices, StartIndex, PrimitiveCount); } } 我们继续: 这是我在AVA中实现的透视效果图,当然了,这里我是以AVA为例子来讲解的,其他的FPSyouxi都大同小异,AVA的透视半透和全透只是一个函数的差别,就是遮盖剔除函数。加上遮盖剔除函数,半透就可以变成全透 这就是透视的整个流程,其实上面只是写了最核心的人物透视,如果你还想添加其他功能,比如说准星,透视上色、字幕显示,功能菜单等等都可往里面添加函数,我会在教程的最后把D3D的透视模板发出来,大家想添加什么功能的话只要往里面加入代码就可以了 找到你想要HOOK的函数地址,由于DirectX是COM组件,普通的函数HOOK是找不到这些函数的,我们必须用能HOOK COM对象的函数,这就是Detour,利用Detour我们就可以HOOK COM对象里的函数了。 举个例子我们可以在EndScene里面去设置开关,画准星以及渲染方框 if(bTip) //bTip初始化为true ,注入成功进入youxi后直接显示 { DrawFont( 600,50, D3DCOLOR_ARGB(255,0,255,255), "小键盘-> 0 文字提示, 1 准星开关,人物透视"); DrawFont( 600,70, D3DCOLOR_ARGB(255,0,255,255), " Coded By 顶级小白QQ:812191628"); } if(crosshair)//画准星 { D3DVIEWPORT9 viewP; //先定义一个接口指针 pDevice->GetViewport( &viewP ); //获得屏幕宽度和高度 DWORD ScreenCenterX = viewP.Width / 2;//屏幕中心X位置 DWORD ScreenCenterY = viewP.Height / 2; //屏幕中心Y位置 D3DRECT rec16 = {ScreenCenterX-15, ScreenCenterY, ScreenCenterX+ 15, ScreenCenterY+1};//这个D3DRECT是一个结构体。就是指定了画的这条直线的范围,水平的那条线 D3DRECT rec17 = {ScreenCenterX, ScreenCenterY-15, ScreenCenterX+ 1,ScreenCenterY+15}; //这个是垂直的那条线的上下两个点 pDevice->Clear( 1, &rec16, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 0, 0 );//clear方法可以指定使用某种颜色把后备缓冲区粉刷一遍(也可以是深度缓冲区,模板缓冲区) pDevice->Clear( 1, &rec17,D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ),0, 0 );//要清空的矩形区域的数目(第一个参数)//要清空的举行的数组,和第一个参数决定了要清除的矩形区域的组合(第二个参数) } //下面开始渲染方框 DrawBox (100,100,100,100,D3DCOLOR_ARGB(255, 255, 0, 255 |