0xAA66
发表于 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 = 原点位置(这里不是很理解原点的意思。)
0xAA55
发表于 2016-1-22 17:15:10
wawzymu 发表于 2016-1-22 10:48
这样是不是获取到 世界、视角、投影矩阵 的坐标呢?
.GetTransform D3DTS_WORLD, world(真实的世界矩阵坐 ...
“原点”就是坐标轴的位置偏移。
0xAA66
发表于 2016-1-22 21:29:48
0xAA55 发表于 2016-1-22 17:15
“原点”就是坐标轴的位置偏移。
请问大大,HOOK DrawIndexedPrimitive 该如何拿到矩阵坐标呢?
GetTransform获取的矩阵坐标都是 1 和 0
0xAA55
发表于 2016-1-22 23:03:08
wawzymu 发表于 2016-1-22 21:29
请问大大,HOOK DrawIndexedPrimitive 该如何拿到矩阵坐标呢?
GetTransform获取的矩阵坐标都是 1 和 0 ...
如果游戏用了VertexShader或者GeometryShader,你就不能用GetTransform取得矩阵了。
0xAA66
发表于 2016-1-23 08:25:17
0xAA55 发表于 2016-1-22 23:03
如果游戏用了VertexShader或者GeometryShader,你就不能用GetTransform取得矩阵了。
游戏是用D3D的,难道用了 VertexShader ?那还有办法获取矩阵吗?
0xAA55
发表于 2016-1-23 14:34:36
0xAA66 发表于 2016-1-23 08:25
游戏是用D3D的,难道用了 VertexShader ?那还有办法获取矩阵吗?
有,把它的Shader逆了,判断它用作矩阵的寄存器号,然后用GetVertexShaderConstant取得
0xAA66
发表于 2016-1-23 21:59:15
0xAA55 发表于 2016-1-23 14:34
有,把它的Shader逆了,判断它用作矩阵的寄存器号,然后用GetVertexShaderConstant取得 ...
意思是去HOOK SetVertexShader 吗?
0xAA55
发表于 2016-1-23 22:50:56
0xAA66 发表于 2016-1-23 21:59
意思是去HOOK SetVertexShader 吗?
并不是。
freedying
发表于 2016-1-24 20:12:46
怎么是VB的.我
0xAA66
发表于 2016-1-25 09:52:51
0xAA55 发表于 2016-1-23 22:50
并不是。
请教大神,那我该如何逆向它的 Shader 呢?
SetVertexShader 是设置顶点着色通道吗?
0xAA55
发表于 2016-1-26 11:25:51
0xAA66 发表于 2016-1-25 09:52
请教大神,那我该如何逆向它的 Shader 呢?
SetVertexShader 是设置顶点着色通道吗? ...
着色器,是运行于显卡中的一系列指令啊。
0xAA66
发表于 2016-1-26 14:23:49
0xAA55 发表于 2016-1-26 11:25
着色器,是运行于显卡中的一系列指令啊。
我发现了一个函数GetVertexShaderConstantF
pDevice.GetVertexShaderConstantF 0, world.m11, 4
好像这样能拿到一个矩阵,但不清楚 GetVertexShaderConstantF拿到的究竟是什么东西
查到的解释如下
start 参数指示第一个寄存器的序号,count指示四维向量值的数目,value指向一个值的数组
但我这样拿到的矩阵是否是有用的呢?
779825427
发表于 2016-1-26 16:28:34
谢谢分享 nb
0xAA55
发表于 2016-1-26 20:51:00
0xAA66 发表于 2016-1-26 14:23
我发现了一个函数GetVertexShaderConstantF
pDevice.GetVertexShaderConstantF 0, world.m11, 4
好像这 ...
是的,但是你得自己判断这个矩阵是干什么用的。一个判断的方法是用SetVertexShaderConstantF来把自己的矩阵写进去,然后看它显示成什么样,另一个方法就是自己去逆向顶点着色器的指令。
SetVertexShaderConstantF的作用是把一个常量传递给顶点着色器的“常量寄存器”,这样的话顶点着色器的指令就可以把这个矩阵拿去计算了(用原模型的顶点坐标乘以提供的矩阵,得到变换后的坐标。而将变换后的坐标算成屏幕坐标的,是显卡的流水线的“栅格化”的过程。)
0xAA66
发表于 2016-1-28 14:28:52
大神,这段是拿到视窗坐标吗?GetVertexShaderConstantF 据说要根据游戏修改这个里不理解。
D3DXMatrixIdentity 是转换到单位矩阵吗?我发现用DXD9_39.DLL 没导出这个函数。
手动是不是写成
m11 =1m22=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);
}
}
0xAA55
发表于 2016-1-29 00:22:29
手动写是先把矩阵的所有数值清零,再设置对角线这四个。
m11 =1m22=1 m33=1 m44 = 1
0xAA66
发表于 2016-2-1 08:38:11
GetVertexShaderConstantF 据说要根据游戏修改这个里不理解。
as3852711
发表于 2016-2-13 22:48:50
学习一下
ymgptc
发表于 2016-2-17 13:53:20
谢谢分享好资料!
whm630987633
发表于 2016-3-1 16:10:05
学习一下