Hook DirectX的Present方法,在其中使用DrawPrimitive画图无效

风之空 2019-08-28 04:46:41
目标:注入DirectX,利用DrawPrimitive,在游戏中画一个矩形
问题:DrawPrimitive未生效
过程:利用Detour Hook掉Present方法,在MyPresent中绘制矩形,主要绘制过程代码如下:

HRESULT hr = pDevice->CreateVertexBuffer(6 * sizeof(Vector), 0, D3D_FVF_VECTOR, D3DPOOL_SYSTEMMEM, &vectex_buffer9, NULL);
if (FAILED(hr)) {
OutputDebugString(L"Return 1\n");
return false;
}
Vector *vectors;
vectex_buffer9->Lock(0, 0, (void**)&vectors, 0);
//创建Rectangle
vectors[0] = Vector(220, 340, 0, D3DCOLOR_ARGB(127, 0, 200, 255));
vectors[1] = Vector(220, 140, 0, D3DCOLOR_ARGB(127, 0, 200, 255));
vectors[2] = Vector(420, 140, 0, D3DCOLOR_ARGB(127, 0, 200, 255));
vectors[3] = Vector(220, 340, 0, D3DCOLOR_ARGB(127, 0, 200, 255));
vectors[4] = Vector(420, 140, 0, D3DCOLOR_ARGB(127, 0, 200, 255));
vectors[5] = Vector(420, 340, 0, D3DCOLOR_ARGB(127, 0, 200, 255));

vectex_buffer9->Unlock();
hr = pDevice->SetStreamSource(0, vectex_buffer9, 0, sizeof(Vector));
hr = pDevice->SetFVF(D3D_FVF_VECTOR);
hr = pDevice->BeginScene();
OutputDebugString(L"Start DrawPrimitive");
hr = pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
//hr = pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
if (FAILED(hr)) {
OutputDebugString(L"DrawPrimitive failed");
}
hr = pDevice->EndScene();

...全文
970 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
狐狸小十 2019-09-10
  • 打赏
  • 举报
回复
dx结构就是一种状态机,但不同于GDI的使用习惯,为了兼顾效率一般不需要还原
但是Hook的话,你的某项设置可能是游戏开发时意料之外的,主要看设置之后是否对游戏原本功能产生影响
你存在一些理解误区,也没办法逐一纠正,最好还是看看教材
也可以尝试下effect效果框架,它会完成一部分设置还原的工作
风之空 2019-09-09
  • 打赏
  • 举报
回复
引用 5 楼 狐狸小十 的回复:
你的vector应该没什么问题
draw XLine和XFont的时候,dx会设置渲染状态,绘制完再还原回去,也就是游戏最后一次渲染时的状态
所谓绘制状态就是指Rasterizer,Blend,DepthStencil,渲染目标,着色器等等
所以你要重新设置这些,如果是单通道游戏的话,你画完最好也得还原回去


上周有事出门了,感谢你的回复,我给这个帖子加到了100分,没有及时回帖,抱歉。
因为我对DX这块是完全没有接触过的,所以可能疑问会比较多点。关于你说的,画完之后,还原渲染状态,我有点疑问。
渲染状态是否应该在绘制前获取并保存下来,然后在画完后再还原回去?
使用的方法是 GetRenderState 和 SetRenderState? 这2个方法的第一个参数设置的内容太多了,感觉不大像呢
狐狸小十 2019-08-30
  • 打赏
  • 举报
回复
你的vector应该没什么问题
draw XLine和XFont的时候,dx会设置渲染状态,绘制完再还原回去,也就是游戏最后一次渲染时的状态
所谓绘制状态就是指Rasterizer,Blend,DepthStencil,渲染目标,着色器等等
所以你要重新设置这些,如果是单通道游戏的话,你画完最好也得还原回去
风之空 2019-08-30
  • 打赏
  • 举报
回复
引用 3 楼 狐狸小十 的回复:
不知道你的VECTOR是怎么定义的,看你添的光栅坐标
如果FVF是XYZRHW的话少了一位,如果是XYZ还需要设置矩阵
而且游戏一般很少用固定管线,可能需要还原默认着色器
可能性太多了

//从0,0到100,100画一条线
ID3DXLine *m_Line;

D3DXCreateLine(pDevice, &m_Line);
D3DXVECTOR2 line[] = { D3DXVECTOR2(0, 0), D3DXVECTOR2(100, 100) };
m_Line->SetWidth(2);
//if (antialias) m_Line->SetAntialias(1);
m_Line->Begin();
m_Line->Draw(line, 2, 0xffff0000);
m_Line->End();
m_Line->Release();
我在MyPresent中庸ID3DXLine画线是能够画出来的,请问这里的绘制过程与使用DrawPrimitive来绘制的过程有什么区别吗。

另外
struct Vector {
Vector(float v_x, float v_y, float v_z, DWORD c) : x(v_x), y(v_y), z(v_z), color(c) {
rhw = 1.0f;
}
float x, y, z, rhw;
DWORD color;
};

这是Vector的定义
狐狸小十 2019-08-29
  • 打赏
  • 举报
回复
不知道你的VECTOR是怎么定义的,看你添的光栅坐标
如果FVF是XYZRHW的话少了一位,如果是XYZ还需要设置矩阵
而且游戏一般很少用固定管线,可能需要还原默认着色器
可能性太多了
风之空 2019-08-29
  • 打赏
  • 举报
回复
引用 1 楼 gouyanfen 的回复:
先确认你的pDevice设备获取指针没有问题

确认没有问题,写文字可以,但使用DrawPrimitive画图无效
gouyanfen 2019-08-28
  • 打赏
  • 举报
回复
先确认你的pDevice设备获取指针没有问题

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧