|
You last visited: Today at 23:05
Advertisement
DrawIndexedPrimitive
Discussion on DrawIndexedPrimitive within the C/C++ forum part of the Coders Den category.
08/07/2014, 22:55
|
#1
|
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
|
DrawIndexedPrimitive
Guten Abend,
ich habe mich Gestern zum ersten mal mit dem Thema D3D Hooking befasst, und nach etwas googeln auch die richtigen Ansätze gefunden und verwirklicht.
Code:
#define Jute ((NumVertices == 261) && (primCount == 232) && (uiStride == 36))
#define Ahornholz ((NumVertices == 792) && (primCount == 816) && (uiStride == 36))
HRESULT WINAPI hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount)
{
if (DIPInit)
{
GenerateShader(pDevice, &RedShader, 1.0f, 0.0f, 0.0f);
GenerateShader(pDevice, &GreenShader, 0.0f, 1.0f, 0.0f);
DIPInit = false;
}
LPDIRECT3DVERTEXBUFFER9 Stream_Data;
UINT uiOffset = 0;
UINT uiStride = 0;
pDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
if (pDevice->GetStreamSource(0, &Stream_Data, &uiOffset, &uiStride) == D3D_OK)
Stream_Data->Release();
if (Jute)
{
pDevice->SetRenderState(D3DRS_ZENABLE, false);
pDevice->SetPixelShader(RedShader);
oDrawIndexedPrimitive(pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
pDevice->SetRenderState(D3DRS_ZENABLE, true);
pDevice->SetPixelShader(RedShader);
}
if (Ahornholz)
{
pDevice->SetRenderState(D3DRS_ZENABLE, false);
pDevice->SetPixelShader(GreenShader);
oDrawIndexedPrimitive(pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
pDevice->SetRenderState(D3DRS_ZENABLE, true);
pDevice->SetPixelShader(GreenShader);
}
return oDrawIndexedPrimitive(pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
}
Mein Problem ist wenn ich nur Ahornholz abfrage, wird in manchen Blickwinkeln Ingame Jute auch mit gefärbt.
was auch merkwürdig ist wenn ich nur
Code:
if (Ahornholz)
{
pDevice->SetRenderState(D3DRS_ZENABLE, false);
pDevice->SetPixelShader(GreenShader);
oDrawIndexedPrimitive(pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
}
mache ohne es auf true zu setzen wieder, wird die ganze Welt durchsichtig ( nicht spielbar also ) wenn ich in richtung von Ahornholz gucke,dass dürfe doch eigentlich nicht passieren da ich ja nicht nur die Stride abfrage sondern alle 3 Werte ?
|
|
|
08/08/2014, 07:14
|
#2
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Quote:
Originally Posted by bloodx
was auch merkwürdig ist wenn ich nur
Code:
if (Ahornholz)
{
pDevice->SetRenderState(D3DRS_ZENABLE, false);
pDevice->SetPixelShader(GreenShader);
oDrawIndexedPrimitive(pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
}
mache ohne es auf true zu setzen wieder, wird die ganze Welt durchsichtig ( nicht spielbar also ) wenn ich in richtung von Ahornholz gucke,dass dürfe doch eigentlich nicht passieren da ich ja nicht nur die Stride abfrage sondern alle 3 Werte ?
|
Quote:
D3DRS_ZENABLE
Depth-buffering state as one member of the D3DZBUFFERTYPE enumerated type. Set this state to D3DZB_TRUE to enable z-buffering, D3DZB_USEW to enable w-buffering, or D3DZB_FALSE to disable depth buffering.
The default value for this render state is D3DZB_TRUE if a depth stencil was created along with the swap chain by setting the EnableAutoDepthStencil member of the D3DPRESENT_PARAMETERS structure to TRUE, and D3DZB_FALSE otherwise.
|
Das Problem ist vermutlich, das sich im FoV ein (oder mehrere) Ahornhölzer befinden (was auch immer das sein soll) und demnach das State auf false gesetzt wird. Da du kein else im Code verwendest um den State wieder zu restoren (= true) wird beim nächsten Renderdurchgang das State auch nicht wieder hergestellt.
|
|
|
All times are GMT +1. The time now is 23:05.
|
|