D3D程序实现透视的一些基础知识程序

D3D程序实现透视的一些基础知识程序

大家好,这篇帖子我在其他论坛发过,把这篇帖子发布到这里,也是希望和更多

有共同爱好的朋友一块交流。我是5月份来到广海的,终于做出了一些自己的东

西。最近一直在弄D3D游戏的透视,被他弄得焦头烂额,很多时间都花在了解决

代码错误的问题上。不过功夫不负有心人我取得了一些成果,在编写代码的过程

当中参阅了大量的DirectX编程方面的资料。同时也在国外N多论坛做了一个名

副其实的伸手党,了解和掌握了D3D程序实现透视的一些基础知识。在这里我把

我自己在研究过程中的心得体会和一些经验大体整理了一下,只是希望能够找到

对D3D感兴趣的朋友能够共同研究,话不多说了,下面开始咱们的教程。(说明

一下,下面的内容都是我一个字一个字敲出来的,没有复制粘贴)。

在看这篇教程之前橙光游戏,你最好有一些基本的C++的知识,此外还需要一些基本的D

irectX编程的基础。我的教程呢分为两个部分,第一部分呢主要讲一些透视原

理。第二部分主要讲透视dll的制作过程。

首先来看第一部分,主要是讲解一些透视的原理,

在讲透视之前首先来说一下什么是Z轴缓冲

Z轴缓冲就是DirectX中的成像元素之一 ,他是一个深度缓冲,用来决定

渲染对象的遮蔽关系 ,在计算机图形学中, 有时候通过硬件完成,有时候通过

软件完成。 在观察被渲染对象的时候就出现这样一个问题, 如果一个对象在另

一个对象的后面,并且距离观察者的距离较远那么我们是看不到他的。 Z轴缓

冲也就是深度缓冲。

上面说的可能有点抽象我就直白的说一下吧: Z轴缓冲就是要告诉摄像机,如

果他在一个对象的后面,就不用显示它了 ,如果他在这个对象前面,就得显示

他。

现在根据上面所说的,你可能要说把Z轴缓冲禁用来实现透视就是了。但事实情

况并不是这样。你会注意到,你会看到所有的东西甚至还有场景之外的东西也就

是说你必须找到某一个对象,再选这个对象的时候来禁用Z轴缓冲。这就是:

Strides(数据流中每个顶点所占内存的大小), NumVertices(渲染的顶点索

引的跨度),和 PrimitiveCounts(渲染的图元个数)。

上面这三个就决定了透视到墙(物体)后你想看到的东西,在大部分情况下就是

人物模型(也就是想弄人物透视)

如果直接禁用Z轴缓冲的话,那就是全图透视了,玩过AVA

的都知道全图透视在冰冻工厂是可以使用的,不过在其他地图,或者可以说在其

他游戏里,全图透视效果是很差的,所以要实现人物透视就必须找到游戏中的人

物模型表示。例如,CF的人物模型表示为44和40游戏透视制作,AVA(战地之王的人物模型

标识为32),所以我们说的人物透视是必须找到人物模

型的表示然后再禁用Z轴缓冲

下面我们来禁用Z轴缓冲了。首先把人物模型标识来定义一下

#define PlayerBody ( Stride == 44 || Stride == 40 )// 注意这个 " ||

" 是“或”的意思。意思就是说"PlayerBody 等价于 44或者是40。

//这里的Stride即为游戏中的人物模型标识,

好了,上面的代码是对人物模型的标识进行了定义,下面就要开始D3D9中的Dr

awIndexedPrimitive函数来修改游戏中人物模型的渲染状态

下面的的代码就是在hook the DrawIndexedPrimitive 这函数之中

复制代码

1.

LPDIRECT3DVERTEXBUFFER8 Stream_Data;

UINT Stride = 0;

if (m_pD3DDev->GetStreamSource(0, &Stream_Data, &Stride) == D3D_OK)

Stream_Data->Release();

if(Chams)//这里的chams是透视开关 if(Player)

{

{

//一旦游戏中Stride的值等于所设定的值,就开始执行以下代码: DrawIndexedPrim

itive(Device, Type, MinIndex, NumVertices, StartIndex, PrimitiveCoun

t);

//在墙后面就是绿色 Device->SetRenderState( D3DRS_ZENABLE,false );

Device->SetTexture( 0, texGreen );

//禁用Z轴缓冲 DrawIndexedPrimitive(Device, Type, MinIndex, NumVerti

ces, StartIndex, PrimitiveCount);

//游戏模型在墙前面的话(就是可以看见) Device->SetRenderState( D3DRS_ZEN

ABLE, true );

//打开Z轴缓冲,并填充为蓝色 Device->SetTexture( 0, texBlue);

DrawIndexedPrimitive(Device, Type, MinIndex, NumVertices, Start

Index, PrimitiveCount);

}

}

我们继续:

如果你想知道透视上色的代码是如何运行的,它是通过消息队列进行操作的。.

下面就是他的工作流程:

如果人物要被显示:

给人物上色为红色.

启用Z轴缓冲, 在物体前面的时候为红色。

禁用Z轴缓冲

在物体后面的时候就为黄色

Disable stencil shaders.(这个我暂时还没搞懂)

然后这样不断重复。说到重复,有人就会问了,什么是重复。我简单地说一下吧。

游戏在渲染人物模型的时候,是一帧一帧的进行渲染的,放在显存中的中的每幅

图像从后备缓冲区到前台缓冲区并呈现到屏幕上。打个形象的比喻,好比放幻灯

片。速度慢了,可以看成是一张一张的,当速度很快时,就可以看成连续的画面。

所以上面的渲染过程至少每秒要执行24次,要不然画面就会很卡。

fps游戏透视辅助制作_易语言制作cf透视教程_游戏透视制作

游戏透视制作_易语言制作cf透视教程_fps游戏透视辅助制作

fps游戏透视辅助制作_易语言制作cf透视教程_游戏透视制作

这是我在AVA中实现的透视效果图,当然了,最后着一张是《全球使命》的截图。

这里我是以AVA和全球使命为例子来讲解的游戏透视制作,其他的FPS游戏都大同小异,游戏

的透视半透和全透只是一个函数的差别,就是遮盖剔除函数。加上遮盖剔除函数,

半透就可以变成全透

这就是透视的整个流程,其实上面只是写了最核心的人物透视,如果你还想

添加其他功能,比如说准星游戏图片素材,透视上色、字幕显示,功能菜单等等都可往里面添

加函数,我会在教程的最后把D3D的透视模板发出来,大家想添加什么功能的话

只要往里面加入代码就可以了

上面只是实现人物透视的最核心的部分,也是实现人物透视的实质内容。整个实

现透视的流程为:

找到所需函数的地址 —> 修改函数地址(拦截API) -->写入你想修改的代码(比

如画准星,禁用Z轴缓冲,上色等操作)—> 返回正常值

找到你想要HOOK的函数地址,由于DirectX是COM组件,普通的函数HOOK是找

不到这些函数的,我们必须用能HOOK COM对象的函数,这就是Detour,利用D

etour我们就可以HOOK COM对象里的函数了。

pEndScene = (EndScene_)DetourFunction((PBYTE)VTable[ES],(PBYTE)pEndS

cene);

上面就是一个detour的使用例子,其实很多功能都是在这个函数里面实现的,

例如画准星,菜单显示等等。那么第一个参数是怎么来的呢,这里我们就需要找

到EndScene这个函数的地址,怎么找呢,有两种方法:

1、 修改PE导入地址表的函数地址,使游戏在调用函数的时候转到我们的函

数上来

2、 直接找到EndScene函数的基址和偏移,然后把这个地址的函数改成我们自

己的函数

举个例子我们可以在EndScene里面去设置开关,画准星以及渲染方框

if(bTip) //bTip初始化为true ,注入成功进入游戏后直接显示

{

DrawFont( 600,50, D3DCOLOR_ARGB(255,0,255,255), "小键盘-> 0 文字提示,

1 准星开关,人物透视");

DrawFont( 600,70, D3DCOLOR_ARGB(255,0,255,255), " Coded By

文章来源:https://blog.csdn.net/u010488395/article/details/8900455?locationNum=11&fps=1