Sign in to follow this  
monkeyboi

DX9 Wired Texture Effect

Recommended Posts

monkeyboi    188

All I am trying to do is creating a quad in world coordinate and put a 64*64 texture on. I disable the lighting and enable the alpha.

Here is part of the codes, really have no idea what the problem is. 

float Rot = 0.0f;
struct QUAD 
{
	D3DXVECTOR4	 Pos;
	//D3DXVECTOR4	 Nor;
	D3DXVECTOR2  TexCoord;

	static const DWORD  FVF;
};
const DWORD QUAD::FVF = D3DFVF_XYZ | D3DFVF_TEX1;//RHW D3DFVF_NORMAL

IDirect3DVertexBuffer9*	g_pVB;
IDirect3DIndexBuffer9* g_pIB;
void LoadTexture(IDirect3DDevice9* pd3dDevice)
{
	hr = D3DXCreateTextureFromFile(pd3dDevice,L"LidTexTest.png",&WholeTex);
	WholeTex->GetSurfaceLevel(0,&WholeTexSur);

}
void CreateQuad(IDirect3DDevice9* pd3dDevice)
{
	hr = pd3dDevice->CreateVertexBuffer(
		4 * sizeof(QUAD),
		D3DUSAGE_WRITEONLY,
		QUAD::FVF,
		D3DPOOL_MANAGED, 
		&g_pVB,
		0);

	QUAD temp[4];
	temp[0].Pos = D3DXVECTOR4(-0.5,0.5,0,1);
	temp[1].Pos = D3DXVECTOR4( 0.5,0.5,0,1);
	temp[2].Pos = D3DXVECTOR4(-0.5,-0.5,0,1);
	temp[3].Pos = D3DXVECTOR4( 0.5,-0.5,0,1);

	temp[0].TexCoord = D3DXVECTOR2(0.0f,0.0f);
	temp[1].TexCoord = D3DXVECTOR2(1.0f,0.0f);
	temp[2].TexCoord = D3DXVECTOR2(0.0f,1.0f);
	temp[3].TexCoord = D3DXVECTOR2(1.0f,1.0f);
	
	VOID* lpVertices;
	g_pVB->Lock( 0, sizeof(temp), (void**)&lpVertices, 0 );
	memcpy( lpVertices, temp, sizeof(temp) );
	g_pVB->Unlock();

	int iIQuantity = 6;
	int Index[6];

	Index[0] = 0;
	Index[1] = 1;
	Index[2] = 2;
	Index[3] = 2;
	Index[4] = 1;
	Index[5] = 3;
	
	unsigned int uiBufferLength = (unsigned int)(iIQuantity*sizeof(int));
	pd3dDevice->CreateIndexBuffer(uiBufferLength,
		0,D3DFMT_INDEX32,D3DPOOL_MANAGED,&g_pIB,0);

	void* pbIndices;
	g_pIB->Lock(0,uiBufferLength,&pbIndices,0);

	memcpy( pbIndices, Index, iIQuantity*sizeof(int) );	

	g_pIB->Unlock();
}
HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                     void* pUserContext )
{
	SetupCamera(pd3dDevice);
	LoadTexture(pd3dDevice);
	CreateQuad(pd3dDevice);
    return S_OK;
}

void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;

    // Clear the render target and the zbuffer 
    V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 170 ), 1.0f, 0 ) );
	pd3dDevice->SetRenderState( D3DRS_LIGHTING, false );
	pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
	pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
	pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
	pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
	
    // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
		Rot = Rot + 0.00;
		D3DXMATRIX matTemp;
		D3DXMATRIX m_matWorld;
		D3DXMatrixIdentity(&matTemp);
		D3DXMatrixIdentity(&m_matWorld);

		D3DXMatrixRotationY(&matTemp, Rot);
		D3DXMatrixMultiply(&m_matWorld,&m_matWorld,&matTemp);

		D3DXMatrixMultiply(&m_matWorld,&m_matWorld,&matTemp);

		pd3dDevice->SetTransform( D3DTS_WORLD, &m_matWorld);

		pd3dDevice->SetFVF(QUAD::FVF);
		pd3dDevice->SetTexture(0,WholeTex);
		pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(QUAD));
		hr = pd3dDevice->SetIndices(g_pIB);
		hr = pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);
		pd3dDevice->SetTexture(0,NULL);

        V( pd3dDevice->EndScene() );
    }
}

 

Many thanks 

Share this post


Link to post
Share on other sites
monkeyboi    188

oh the texture is fine, because I can render it with a quad on screen coordinate, just when I use world coordinate to describe the quad, the texture go crazy. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this