技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
楼主: 0xAA55
收起左侧

【3D】用VB教你最基础的3D图形知识

  [复制链接]

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-21 18:26:56 | 显示全部楼层
wawzymu 发表于 2016-1-21 10:31
楼主,关于Dx 中 GetTransform 获取的M 是什么意思啊?
(百度没有找到很好的解释,是否获得的M11 -M44 和 ...

M就是Matrix(矩阵)啊。
一个DX的矩阵是由16个浮点数构成的,每4个浮点数是一个四维向量(x,y,z,w)
DX的矩阵可以理解为,前三个向量,是这个矩阵的“坐标轴”,而第四个向量则是这个矩阵的原点的位置。

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-22 10:48:10 | 显示全部楼层
这样是不是获取到 世界、视角、投影矩阵 的坐标呢?
.GetTransform D3DTS_WORLD, world(真实的世界矩阵坐标吗?)
.GetTransform D3DTS_VIEW, view
.GetTransform D3DTS_PROJECTION, Proj

那是不是可以理解:Matrix 的()
m11,m12,m13,m14 = X轴坐标
m21,m22,m23,m24 = Y轴坐标
m31,m32,m33,m34 = Z轴坐标
m41,m42,m43,m44 = 原点位置(这里不是很理解原点的意思。)

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-22 17:15:10 | 显示全部楼层
wawzymu 发表于 2016-1-22 10:48
这样是不是获取到 世界、视角、投影矩阵 的坐标呢?
.GetTransform D3DTS_WORLD, world(真实的世界矩阵坐 ...

“原点”就是坐标轴的位置偏移。

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-22 21:29:48 | 显示全部楼层
0xAA55 发表于 2016-1-22 17:15
“原点”就是坐标轴的位置偏移。

请问大大,HOOK DrawIndexedPrimitive 该如何拿到矩阵坐标呢?
GetTransform  获取的矩阵坐标都是 1 和 0

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-22 23:03:08 | 显示全部楼层
wawzymu 发表于 2016-1-22 21:29
请问大大,HOOK DrawIndexedPrimitive 该如何拿到矩阵坐标呢?
GetTransform  获取的矩阵坐标都是 1 和 0 ...

如果游戏用了VertexShader或者GeometryShader,你就不能用GetTransform取得矩阵了。

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-23 08:25:17 | 显示全部楼层
0xAA55 发表于 2016-1-22 23:03
如果游戏用了VertexShader或者GeometryShader,你就不能用GetTransform取得矩阵了。

游戏是用D3D的,难道用了 VertexShader ?那还有办法获取矩阵吗?

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-23 14:34:36 | 显示全部楼层
0xAA66 发表于 2016-1-23 08:25
游戏是用D3D的,难道用了 VertexShader ?那还有办法获取矩阵吗?

有,把它的Shader逆了,判断它用作矩阵的寄存器号,然后用GetVertexShaderConstant取得

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-23 21:59:15 | 显示全部楼层
0xAA55 发表于 2016-1-23 14:34
有,把它的Shader逆了,判断它用作矩阵的寄存器号,然后用GetVertexShaderConstant取得 ...

意思是去HOOK SetVertexShader 吗?

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-23 22:50:56 | 显示全部楼层
0xAA66 发表于 2016-1-23 21:59
意思是去HOOK SetVertexShader 吗?

并不是。

0

主题

1

帖子

8

积分

用户组: 初·技术宅

UID
1445
精华
0
威望
1 点
宅币
5 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-1-24
发表于 2016-1-24 20:12:46 | 显示全部楼层
怎么是VB的.我

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-25 09:52:51 | 显示全部楼层

请教大神,那我该如何逆向它的 Shader 呢?
SetVertexShader 是设置顶点着色通道吗?

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-26 11:25:51 | 显示全部楼层
0xAA66 发表于 2016-1-25 09:52
请教大神,那我该如何逆向它的 Shader 呢?
SetVertexShader 是设置顶点着色通道吗? ...

着色器,是运行于显卡中的一系列指令啊。

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-26 14:23:49 | 显示全部楼层
0xAA55 发表于 2016-1-26 11:25
着色器,是运行于显卡中的一系列指令啊。

我发现了一个函数  GetVertexShaderConstantF
pDevice.GetVertexShaderConstantF 0, world.m11, 4
好像这样能拿到一个矩阵,但不清楚 GetVertexShaderConstantF  拿到的究竟是什么东西
查到的解释如下
start 参数指示第一个寄存器的序号,count指示四维向量值的数目,value指向一个值的数组
但我这样拿到的矩阵是否是有用的呢?

0

主题

3

帖子

11

积分

用户组: 初·技术宅

UID
1446
精华
0
威望
1 点
宅币
6 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-1-26
发表于 2016-1-26 16:28:34 | 显示全部楼层
谢谢分享 nb

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-26 20:51:00 | 显示全部楼层
0xAA66 发表于 2016-1-26 14:23
我发现了一个函数  GetVertexShaderConstantF
pDevice.GetVertexShaderConstantF 0, world.m11, 4
好像这 ...

是的,但是你得自己判断这个矩阵是干什么用的。一个判断的方法是用SetVertexShaderConstantF来把自己的矩阵写进去,然后看它显示成什么样,另一个方法就是自己去逆向顶点着色器的指令。

SetVertexShaderConstantF的作用是把一个常量传递给顶点着色器的“常量寄存器”,这样的话顶点着色器的指令就可以把这个矩阵拿去计算了(用原模型的顶点坐标乘以提供的矩阵,得到变换后的坐标。而将变换后的坐标算成屏幕坐标的,是显卡的流水线的“栅格化”的过程。)

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-1-28 14:28:52 | 显示全部楼层
大神,这段是拿到视窗坐标吗?GetVertexShaderConstantF 据说要根据游戏修改这个里不理解。
D3DXMatrixIdentity 是转换到单位矩阵吗?我发现用DXD9_39.DLL 没导出这个函数。
手动是不是写成
m11 =1  m22=1   m33=1   m44 = 1?


void AddModel(IDirect3DDevice9* Device,char* oName,int oTeam)
{
D3DVIEWPORT9 Viewport;
D3DXMATRIX ViewProjectionMatrix,LocalToWorld,WorldToLocal;
D3DXVECTOR3 Vector3D(0,0,0),Vector2D;
Device->GetVertexShaderConstantF(7,ViewProjectionMatrix,1);        //change this to match your game matrix
Device->GetVertexShaderConstantF(8,LocalToWorld,1);             //change this to match your game matrix
Device->GetViewport(&Viewport);
D3DXMatrixIdentity(&WorldToLocal);
D3DXVec3Project(&Vector2D,&Vector3D,&Viewport,&ViewProjectionMatrix,&LocalToWorld,&WorldToLocal);
if(Vector2D.z < 1.0f)
{
  ModelInfo_t pModelInfo = {static_cast<int>(Vector2D.x),static_cast<int>(Vector2D.y),oTeam,oName};
  ModelInfo.push_back(pModelInfo);
}
}

1028

主题

2283

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17526 个
贡献
35250 次
宅之契约
0 份
在线时间
1677 小时
注册时间
2014-1-26
 楼主| 发表于 2016-1-29 00:22:29 | 显示全部楼层
手动写是先把矩阵的所有数值清零,再设置对角线这四个。
m11 =1  m22=1   m33=1   m44 = 1

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 2016-2-1 08:38:11 | 显示全部楼层
GetVertexShaderConstantF 据说要根据游戏修改这个里不理解。

0

主题

8

帖子

14

积分

用户组: 初·技术宅

UID
1482
精华
0
威望
1 点
宅币
4 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-2-13
发表于 2016-2-13 22:48:50 | 显示全部楼层

学习一下
回复

使用道具 举报

0

主题

1

帖子

8

积分

用户组: 初·技术宅

UID
1490
精华
0
威望
1 点
宅币
5 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2016-2-17
发表于 2016-2-17 13:53:20 | 显示全部楼层
谢谢分享好资料!

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-4-23 06:57 , Processed in 0.111100 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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