DrawIndexedPrimitive

08/07/2014 22:55 bloodx#1
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 Mostey#2
Quote:
Originally Posted by bloodx View Post
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 ?
[Only registered and activated users can see links. Click Here To Register...]

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.