挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运寻找会做《单机》游戏修改器的开发作者长期合作,价格不是问题!联系QQ:1874088565
IOS签名/udid证书出售/送证书加群1040456405 ██【我要租此广告位】██.
.. .
查看: 5477|回复: 6
打印 上一主题 下一主题

[讨论交流] Direct3D透视教程_教你做出属于自己的透视

[复制链接]

15

积分

6

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
9
海币
740
交易币
0
跳转到指定楼层
楼主
发表于 2015-2-6 21:15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


大家好,这篇帖子我在其他论坛发过,把这篇帖子发布到这里,也是希望和更多有共同爱好的朋友一块交流。我是5月份来到广海的,终于做出了一些自己的东西。最近一直在弄D3D游戏的透视,被他弄得焦头烂额,很多时间都花在了解决代码错误的问题上。不过功夫不负有心人我取得了一些成果,在编写代码的过程当中参阅了大量的DirectX编程方面的资料。同时也在国外N多论坛做了一个名副其实的伸手党,了解和掌握了D3D程序实现透视的一些基础知识。在这里我把我自己在研究过程中的心得体会和一些经验大体整理了一下,只是希望能够找到对D3D感兴趣的朋友能够共同研究,话不多说了,下面开始咱们的教程。(说明一下,下面的内容都是我一个字一个字敲出来的,没有复制粘贴)。  

在看这篇教程之前,你最好有一些基本的C++的知识,此外还需要一些基本的DirectX编程的基础。我的教程呢分为两个部分,第一部分呢主要讲一些透视原理。第二部分主要讲透视dll的制作过程。  

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

在讲透视之前首先来说一下什么是Z轴缓冲  
     Z轴缓冲就是DirectX中的成像元素之一 ,他是一个深度缓冲,用来决定渲染对象的遮蔽关系 ,在计算机图形学中, 有时候通过硬件完成,有时候通过软件完成。 在观察被渲染对象的时候就出现这样一个问题, 如果一个对象在另一个对象的后面,并且距离观察者的距离较远那么我们是看不到他的。 Z轴缓冲也就是深度缓冲。  
上面说的可能有点抽象我就直白的说一下吧: Z轴缓冲就是要告诉摄像机,如果他在一个对象的后面,就不用显示它了 ,如果他在这个对象前面,就得显示他。  
现在根据上面所说的,你可能要说把Z轴缓冲禁用来实现透视就是了。但事实情况并不是这样。你会注意到,你会看到所有的东西甚至还有场景之外的东西也就是说你必须找到某一个对象,再选这个对象的时候来禁用Z轴缓冲。这就是: Strides(数据流中每个顶点所占内存的大小), NumVertices(渲染的顶点索引的跨度),和 PrimitiveCounts(渲染的图元个数)。  
上面这三个就决定了透视到墙(物体)后你想看到的东西,在大部分情况下就是人物模型(也就是想弄人物透视)  
[    post]如果直接禁用Z[/post]轴缓冲的话,那就是全图透视了,玩过AVA的都知道全图透视在冰冻工厂是可以使用的,不过在其他地图,或者可以说在其他游戏里,全图透视效果是很差的,所以要实现人物透视就必须找到游戏中的人物模型表示。例如,XF的人物模型表示为44和40,AVA(战地之王的人物模型标识为32),所以我们说的人物透视是必须找到人物模



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

下面我们来禁用Z轴缓冲了。首先把人物模型标识来定义一下  
#define PlayerBody  ( Stride == 44 || Stride == 40 )// 注意这个 " || " 是“或”的意思。意思就是说"PlayerBody  等价于 44或者是40。  
//这里的Stride即为游戏中的人物模型标识,  

好了,上面的代码是对人物模型的标识进行了定义,下面就要开始D3D9中的DrawIndexedPrimitive函数来修改游戏中人物模型的渲染状态  
下面的的代码就是在hook the DrawIndexedPrimitive 这函数之中



LPDIRECT3DVERTEXBUFFER8 Stream_Data;  c3 ]^f6)?  
  UINT Stride = 0;   Tee3U%Y  
        x?& xz;   
  if (m_pD3DDev->GetStreamSource(0, &Stream_Data, &Stride) == D3D_OK)  Ku,A}5-6  
  Stream_Data->Release();  vT<wd#   
8Nq Iz  
if(Chams)//
这里的chams是透视开关
      if(Player)   K`Zb;R X   
      {  ?d`+vHK]>  
          {  1Owk Ly,P  
//
一旦游戏中Stride的值等于所设定的值,就开始执行以下代码:
    DrawIndexedPrimitive(Device, Type, MinIndex,  NumVertices, StartIndex, PrimitiveCount);  jWm BUHCb  
//
在墙后面就是绿色
    Device->SetRenderState( D3DRS_ZENABLE,false );  [5d][1=  
    Device->SetTexture( 0, texGreen );  D`ge3f8Wi  
//
禁用Z轴缓冲
    DrawIndexedPrimitive(Device, Type, MinIndex, NumVertices, StartIndex,  PrimitiveCount);  !d@`r1t  
//
游戏模型在墙前面的话(就是可以看见)
    Device->SetRenderState( D3DRS_ZENABLE, true );  c|a|z}(/J  
//
打开Z轴缓冲,并填充为蓝色
    Device->SetTexture( 0, texBlue);  O lIH0  
    DrawIndexedPrimitive(Device, Type,  MinIndex,  NumVertices, StartIndex, PrimitiveCount);  6?x{-Zj ^?  
          }  ty=?SZF  
      }
  #IwB  
#a l^Uqd  






我们继续:  


如果你想知道透视上色的代码是如何运行的,它是通过消息队列进行操作的。.  
下面就是他的工作流程:  


·                     如果人物要被显示:  


·                     给人物上色为红色.  


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


·                     禁用Z轴缓冲  


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


·                     Disable stencil shaders.(这个我暂时还没搞懂)
然后这样不断重复。说到重复,有人就会问了,什么是重复。我简单地说一下吧。游戏在渲染人物模型的时候,是一帧一帧的进行渲染的,放在显存中的中的每幅图像从后备缓冲区到前台缓冲区并呈现到屏幕上。打个形象的比喻,好比放幻灯片。速度慢了,可以看成是一张一张的,当速度很快时,就可以看成连续的画面。所以上面的渲染过程至少每秒要执行24次,要不然画面就会很卡


联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:Delphi做魔域 之怪物列表遍历
下一篇:圣魔之血的消息处理函数对象指针反跟踪解决办法-带图
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

贡献
11
海币
586
交易币
0
沙发
发表于 2015-4-5 21:10:57 | 只看该作者
一直在看

0

积分

0

主题

2

听众
已帮网友解决0 个问题
好评
0
贡献
0
海币
0
交易币
0
板凳
发表于 2015-4-5 22:38:21 | 只看该作者
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下

57

积分

14

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
43
海币
940
交易币
0
地板
发表于 2015-4-21 04:09:19 | 只看该作者
需要的就是这个

15

积分

4

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
11
海币
647
交易币
0
5#
发表于 2015-5-23 16:32:45 | 只看该作者
我只是看看这个是什么

1

积分

0

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
9
交易币
0
6#
发表于 2017-1-24 14:45:33 | 只看该作者
不错的基础知识~ 赞一个

1

积分

0

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
6
交易币
0
7#
发表于 2018-10-14 16:53:32 | 只看该作者
{:撸啊撸:}基础很不错,支持下~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-4-12 21:23 , Processed in 0.124084 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表