d3d9 render

r0den

Участник
Автор темы
24
10
Всем посанам привет а остальным соболезную
Пытался значит я вывести на чистом аси при помощи хуков d3d9 квадратики и кружочки
Всё работает идеально но... Всё что пытаюсь выводить через DrawPrimitive(Up) идёт по *****
Мб я что-то не так делаю, пиздил я и с других форумов код для рендера и пытался брать код с этого ответа но игре **х** всё равно экран чист но если через pDevice->Clear то всё видно и тож через D3DXCreateLine всё видно так что подразумеваю что проблема где то в DrawPrimitive а не в хуке
Подскажите знатоки пж как заставить всё это дело работать


C++:
void Line(float x1, float y1, float x2, float y2, float width, bool antialias, DWORD color)
{
    ID3DXLine* m_Line;

    D3DXCreateLine(pDevice, &m_Line);
    D3DXVECTOR2 line[] = { D3DXVECTOR2(x1, y1), D3DXVECTOR2(x2, y2) };
    m_Line->SetWidth(width);
    if (antialias) m_Line->SetAntialias(1);
    m_Line->Begin();
    m_Line->Draw(line, 2, color);
    m_Line->End();
    m_Line->Release();
}
C++:
D3DRECT rect = { X, Y, X + L, Y + H };
m_pDevice->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0);
C++:
void Circle(float x, float y, float radius, int rotate, int type, bool smoothing, int resolution, DWORD color)
{
    std::vector<vertex> circle(resolution + 2);
    float angle = rotate * D3DX_PI / 180;
    float pi;

    if (type == circle_type::full) pi = D3DX_PI;        // Full circle
    if (type == circle_type::half) pi = D3DX_PI / 2;      // 1/2 circle
    if (type == circle_type::quarter) pi = D3DX_PI / 4;   // 1/4 circle

    for (int i = 0; i < resolution + 2; i++)
    {
        circle[i].x = (float)(x - radius * cos(i * (2 * pi / resolution)));
        circle[i].y = (float)(y - radius * sin(i * (2 * pi / resolution)));
        circle[i].z = 0;
        circle[i].rhw = 1;
        circle[i].color = color;
    }

    // Rotate matrix
    int _res = resolution + 2;
    for (int i = 0; i < _res; i++)
    {
        circle[i].x = x + cos(angle) * (circle[i].x - x) - sin(angle) * (circle[i].y - y);
        circle[i].y = y + sin(angle) * (circle[i].x - x) + cos(angle) * (circle[i].y - y);
    }

    pDevice->CreateVertexBuffer((resolution + 2) * sizeof(vertex), D3DUSAGE_WRITEONLY, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_pVB, NULL);

    VOID* pVertices;
    g_pVB->Lock(0, (resolution + 2) * sizeof(vertex), (void**)&pVertices, 0);
    memcpy(pVertices, &circle[0], (resolution + 2) * sizeof(vertex));
    g_pVB->Unlock();


    pDevice->SetTexture(0, NULL);
    pDevice->SetPixelShader(NULL);
    if (smoothing)
    {
        pDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
        pDevice->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, TRUE);
    }
    pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    pDevice->SetStreamSource(0, g_pVB, 0, sizeof(vertex));
    pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);

    pDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, resolution);
    if (g_pVB != NULL) g_pVB->Release();
}
C++:
void CRender::Line(int sX, int sY, int eX, int eY, D3DCOLOR D3DCOLOR)
{
    vertex pVertex[2] = { { sX, sY, 0.0f, 1.0f, D3DCOLOR }, { eX, eY, 0.0f, 1.0f, D3DCOLOR } };
    MyDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    MyDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
    MyDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
    MyDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    MyDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    MyDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    MyDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    MyDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    MyDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
    MyDevice->SetTexture(0, NULL);
    MyDevice->SetPixelShader(NULL);
    MyDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
    MyDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, &pVertex, sizeof(vertex));
}
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,262
1,752
Всем посанам привет а остальным соболезную
Пытался значит я вывести на чистом аси при помощи хуков d3d9 квадратики и кружочки
Всё работает идеально но... Всё что пытаюсь выводить через DrawPrimitive(Up) идёт по *****
Мб я что-то не так делаю, пиздил я и с других форумов код для рендера и пытался брать код с этого ответа но игре **х** всё равно экран чист но если через pDevice->Clear то всё видно и тож через D3DXCreateLine всё видно так что подразумеваю что проблема где то в DrawPrimitive а не в хуке
Подскажите знатоки пж как заставить всё это дело работать


C++:
void Line(float x1, float y1, float x2, float y2, float width, bool antialias, DWORD color)
{
    ID3DXLine* m_Line;

    D3DXCreateLine(pDevice, &m_Line);
    D3DXVECTOR2 line[] = { D3DXVECTOR2(x1, y1), D3DXVECTOR2(x2, y2) };
    m_Line->SetWidth(width);
    if (antialias) m_Line->SetAntialias(1);
    m_Line->Begin();
    m_Line->Draw(line, 2, color);
    m_Line->End();
    m_Line->Release();
}
C++:
D3DRECT rect = { X, Y, X + L, Y + H };
m_pDevice->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0);
C++:
void Circle(float x, float y, float radius, int rotate, int type, bool smoothing, int resolution, DWORD color)
{
    std::vector<vertex> circle(resolution + 2);
    float angle = rotate * D3DX_PI / 180;
    float pi;

    if (type == circle_type::full) pi = D3DX_PI;        // Full circle
    if (type == circle_type::half) pi = D3DX_PI / 2;      // 1/2 circle
    if (type == circle_type::quarter) pi = D3DX_PI / 4;   // 1/4 circle

    for (int i = 0; i < resolution + 2; i++)
    {
        circle[i].x = (float)(x - radius * cos(i * (2 * pi / resolution)));
        circle[i].y = (float)(y - radius * sin(i * (2 * pi / resolution)));
        circle[i].z = 0;
        circle[i].rhw = 1;
        circle[i].color = color;
    }

    // Rotate matrix
    int _res = resolution + 2;
    for (int i = 0; i < _res; i++)
    {
        circle[i].x = x + cos(angle) * (circle[i].x - x) - sin(angle) * (circle[i].y - y);
        circle[i].y = y + sin(angle) * (circle[i].x - x) + cos(angle) * (circle[i].y - y);
    }

    pDevice->CreateVertexBuffer((resolution + 2) * sizeof(vertex), D3DUSAGE_WRITEONLY, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_pVB, NULL);

    VOID* pVertices;
    g_pVB->Lock(0, (resolution + 2) * sizeof(vertex), (void**)&pVertices, 0);
    memcpy(pVertices, &circle[0], (resolution + 2) * sizeof(vertex));
    g_pVB->Unlock();


    pDevice->SetTexture(0, NULL);
    pDevice->SetPixelShader(NULL);
    if (smoothing)
    {
        pDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
        pDevice->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, TRUE);
    }
    pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    pDevice->SetStreamSource(0, g_pVB, 0, sizeof(vertex));
    pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);

    pDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, resolution);
    if (g_pVB != NULL) g_pVB->Release();
}
C++:
void CRender::Line(int sX, int sY, int eX, int eY, D3DCOLOR D3DCOLOR)
{
    vertex pVertex[2] = { { sX, sY, 0.0f, 1.0f, D3DCOLOR }, { eX, eY, 0.0f, 1.0f, D3DCOLOR } };
    MyDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    MyDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
    MyDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
    MyDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    MyDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    MyDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    MyDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    MyDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    MyDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
    MyDevice->SetTexture(0, NULL);
    MyDevice->SetPixelShader(NULL);
    MyDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
    MyDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, &pVertex, sizeof(vertex));
}
а почему ты рендерстейты, которые изменил, обратно не восстанавливаешь
 

r0den

Участник
Автор темы
24
10
а почему ты рендерстейты, которые изменил, обратно не восстанавливаешь

Восстановил обратно всё что изменил, ни### не изменилось, ни### не рисуется на экране
C++:
vertex pVertex[2] = { { 100, 100, 0.0f, 1.0f, 0xffff0000 }, { 100, 200, 0.0f, 1.0f, 0xffff0000 } };

DWORD oRenderState[9];
pDevice->GetRenderState(D3DRS_LIGHTING, &oRenderState[0]);
pDevice->GetRenderState(D3DRS_ZENABLE, &oRenderState[1]);
pDevice->GetRenderState(D3DRS_FOGENABLE, &oRenderState[2]);
pDevice->GetRenderState(D3DRS_CULLMODE, &oRenderState[3]);
pDevice->GetRenderState(D3DRS_ALPHABLENDENABLE, &oRenderState[4]);
pDevice->GetRenderState(D3DRS_SRCBLEND, &oRenderState[5]);
pDevice->GetRenderState(D3DRS_DESTBLEND, &oRenderState[6]);
pDevice->GetRenderState(D3DRS_LIGHTING, &oRenderState[7]);
pDevice->GetRenderState(D3DRS_STENCILENABLE, &oRenderState[8]);
IDirect3DBaseTexture9* oTexture;
pDevice->GetTexture(0, &oTexture);
IDirect3DPixelShader9* oPixelShader;
pDevice->GetPixelShader(&oPixelShader);
DWORD oFVF;
pDevice->GetFVF(&oFVF);

pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
pDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
pDevice->SetTexture(0, NULL);
pDevice->SetPixelShader(NULL);
pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
pDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, &pVertex, sizeof(vertex));

pDevice->SetRenderState(D3DRS_LIGHTING, oRenderState[0]);
pDevice->SetRenderState(D3DRS_ZENABLE, oRenderState[1]);
pDevice->SetRenderState(D3DRS_FOGENABLE, oRenderState[2]);
pDevice->SetRenderState(D3DRS_CULLMODE, oRenderState[3]);
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, oRenderState[4]);
pDevice->SetRenderState(D3DRS_SRCBLEND, oRenderState[5]);
pDevice->SetRenderState(D3DRS_DESTBLEND, oRenderState[6]);
pDevice->SetRenderState(D3DRS_LIGHTING, oRenderState[7]);
pDevice->SetRenderState(D3DRS_STENCILENABLE, oRenderState[8]);
pDevice->SetTexture(0, oTexture);
pDevice->SetPixelShader(oPixelShader);
pDevice->SetFVF(oFVF);
Заметил ещё что если рисовать линии через CreateLine все 3д надписи в игре пропадают, скорее всего тут уже я что-то делаю не так и возможно чего-то не восстанавливаю.
Пытался поискать в гугле как правильно работать с d3d9 но ничего нормального не нашёл.
Буду благодарен если подскажете как всё это дело делать правильно
 
Последнее редактирование:

deropleat

Известный
105
56
По моему, что-то ты очень сильно намудрил. У тебя круг рисуется одним методом, а линия - другим. Честно говоря я не знаю в чем у тебя проблема, поскольку не имею всего кода и прочего. Если проблема все еще актуальна, то скинь мне целиком проект - попробую тебе подправить.

Попробуй отрисовывать также, как описывал это я: https://www.blast.hk/threads/32712/#post-500147