AlphaBlending hilfe gesucht

06/19/2012 16:03 Jopsi332#1
ich komm nich weiter und mein schlaues buch sagt mir auch nicht viel drüber. Ich brauhc hilfe bei AlphaBlending mit der MiniMap :C

irgendwie sieht es ingame bei mir jetz so aus

[Only registered and activated users can see links. Click Here To Register...]

das is mein code in

Cwndnavigator::onreasebkgn

nach


Code:
//	pd3dDevice->SetVertexShader(D3DFVF_LVERTEX);

	pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
	pd3dDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
	pd3dDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
	pd3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);
	pd3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
	pd3dDevice->SetRenderState(D3DRS_STENCILREF, 0x1);
	pd3dDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff);
	pd3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);

	pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
	pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 50);
	pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);

	pd3dDevice->BeginScene();

	//pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2,&m_billBlend , D3DFMT_INDEX16, &m_billBlend, sizeof(D3DLVERTEX));

	pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
	pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
	pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
	pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
///
	//pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &m_billBlend , D3DFMT_INDEX16, &m_billBlend, sizeof(D3DLVERTEX));
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

	///


pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

m_billBlend.Render(pd3dDevice);

pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
pd3dDevice->EndScene();
wenn jemand mehr ahnung von directx hat und hilfbereit ist würd ich mich freun :)

wenn gewünscht kann ich auch mal die Seiten ausm buch hier mit reinstellen wo ich das ganze her hab.
06/22/2012 15:29 Ende!#2
Ich kenne dieses Spiel nicht, daher kann ich nur vermuten, dass du damit sagen willst, dass das Spiel nach der Aktivierung deines Hooks nicht mehr korrekt rendert? Welche DirectX Version wird verwendet?
06/22/2012 17:21 Jopsi332#3
Quote:
Originally Posted by Ende! View Post
Ich kenne dieses Spiel nicht, daher kann ich nur vermuten, dass du damit sagen willst, dass das Spiel nach der Aktivierung deines Hooks nicht mehr korrekt rendert? Welche DirectX Version wird verwendet?
dx 9

ich will oben die kleine karte anstatt eckig rund render. hab das jetz mit alphablending aufgegeben und wollte es mit einer anzahl an vertexen rund rendern lassen.
aber das klappt jetz auch nicht irgendwie..

code is

Code:
//sturct
struct TEXTUREVERTEX
{
	D3DXVECTOR3 vec;//
	//FLOAT x, y, z, 
	FLOAT rhw, u, v;
};


//eine eckige textur rund rendern
BOOL C2DRender::RenderTextureCircle( int iVertices, float iRadius, CTexture* pTexture, DWORD dwBlendFactorAlhpa, FLOAT fScaleX , FLOAT fScaleY)
{

	if(!pTexture) return FALSE;

	int nVertex = iVertices + 1;

	TEXTUREVERTEX * pVertices;

    pVertices = new TEXTUREVERTEX [nVertex];


	
 float fComplete;
 FLOAT x;
 FLOAT y;

for ( int iVertex = 0; iVertex < nVertex; iVertex ++)
 {
fComplete = (float)iVertex / nVertex;
		x = (float)((fScaleX) + (float)iRadius * cos(6.2831f*fComplete));
		y = (float)((fScaleY) + (float)iRadius * sin(6.2831f*fComplete));

  SetTextureVertex( pVertices, x, y, pTexture->m_fuRB, pTexture->m_fvRB);
  
  pVertices++;
 }
	
	m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, 1 );
	m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, 1 );
	m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );		
	m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );		

	m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );	
	m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );

	m_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_ARGB( dwBlendFactorAlhpa, 0, 0, 0 ) );
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR  );

    m_pd3dDevice->SetVertexShader( NULL );
	m_pd3dDevice->SetTexture( 0, pTexture->m_pTexture );
	m_pd3dDevice->SetFVF( D3DFVF_TEXTUREVERTEX );
	m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof( TEXTUREVERTEX ) );
	m_pd3dDevice->SetTexture( 0, NULL );

	return TRUE;
};

mit dem kommt ingame nur noch ein flackern und nicht eine runde textur ( die eigentlich eckig ist)

habe mal nen radius von 10 angeben, x center und y center 10 und 10 vertices aber iwas muss ich wohl im algorythmus falsch gemacht haben
06/22/2012 17:51 Ende!#4
Code:
m_pDevice->SetRenderState(D3DRS_CULLMODE,          D3DCULL_NONE);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
m_pDevice->SetRenderState(D3DRS_SRCBLEND,          D3DBLEND_SRCALPHA);
m_pDevice->SetRenderState(D3DRS_DESTBLEND,         D3DBLEND_INVSRCALPHA);
m_pDevice->SetRenderState(D3DRS_LIGHTING,          FALSE);
m_pDevice->SetRenderState(D3DRS_STENCILENABLE,     FALSE);
Versuch's mal damit.
06/22/2012 18:18 Sedrika#5
Wieso setzt du noch den Renderstate, nach dem die Navigation bereits gerendert wurde ?
Das ergibt doch keinen Sinn.

Die Navigation wird im Source bereits leicht abgerundet, musst nur das etwas umschreiben.
06/22/2012 23:39 Jopsi332#6
Quote:
Originally Posted by Sedrika View Post
Wieso setzt du noch den Renderstate, nach dem die Navigation bereits gerendert wurde ?
Das ergibt doch keinen Sinn.

Die Navigation wird im Source bereits leicht abgerundet, musst nur das etwas umschreiben.
ich mach ne ganz neue funktion die ne textur rund rendern soll anhand von einer anzahl an vertices & radius
06/25/2012 15:59 Jopsi332#7
jemand ne idee wo jetz der fehler liegt?
06/25/2012 16:01 Omdi#8
Was meinst du mit flackern?
Kann man die Karte denn sehen?
06/25/2012 17:03 Jopsi332#9
Quote:
Originally Posted by Neeya Nanaa View Post
Was meinst du mit flackern?
Kann man die Karte denn sehen?
nein es ist ein flackern mit einer farbe meistens grün oder braun.
ich meine mit flackern

also wen man die maus schnell drüber zieht dann kommt für ein paar millisekunden ein 5 eck das so aussieht ( ein viereck und unten links ist eine kante)
06/25/2012 17:55 Omdi#10
Versuchs mal so

Code:
    pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
06/25/2012 18:26 Jopsi332#11
Quote:
Originally Posted by Neeya Nanaa View Post
Versuchs mal so

Code:
    pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
komplett ersetzen oder ein teil oder hinzufügen? ( bei c2drender::rendertexturecircle)
06/25/2012 18:49 Omdi#12
Quote:
Originally Posted by Jopsi332 View Post
komplett ersetzen oder ein teil oder hinzufügen? ( bei c2drender::rendertexturecircle)
Ersetzen.
Du ersetzt z.B :
Code:
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
mit
Code:
pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
06/25/2012 20:10 Jopsi332#13
Quote:
Originally Posted by Neeya Nanaa View Post
Ersetzen.
Du ersetzt z.B :
Code:
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
mit
Code:
pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
damit kackt mein client ab


so mit deineer veärnderung flackert es einfahc weiß xD

ich wieß jetz warscheinlich wo der fehler ist, aber weiß nich genau wie ich den behebe

also mein algorythmus zum errechnen von x und y hab ich u und v koordinaten vergessen. ich gebe dem vertex immer rechts unten uv koordinaten.. weiß jemand wie ich für ienen kreis die uv koordinaten berrechne?