⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderd3dwnd.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        {
            continue;
        }

        break;
    }

    if(i == 7)
	{
		MessageBox("Could not find suitable framebuffer/z buffer format!", "ERROR", MB_OK);
		return E_FAIL;
	}

	m_d3dpp.AutoDepthStencilFormat = pZS[i];

    m_d3dpp.SwapEffect             = D3DSWAPEFFECT_COPY;
	m_d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

	m_devBhv &=~(D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_HARDWARE_VERTEXPROCESSING);
    if((m_devBhv & D3DCREATE_PUREDEVICE) == 0)
    {
        D3DCAPS8 caps;
        // Query caps
        hr = pEnum->GetDeviceCaps(D3DADAPTER_DEFAULT, m_devType, &caps);
        if((caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) != 0)
        {
			if(D3DSHADER_VERSION_MAJOR(caps.VertexShaderVersion) < 1)
			{
				m_devBhv |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
				m_bUseSWVP = true;

			}
			else
			{
				if (theApp.GetForceSoftwareVP())
				{
					m_bUseSWVP = true;
					m_devBhv |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
				}
				else
				{
					m_bUseSWVP = false;
					m_devBhv |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
				}
			}
        }
        else
        {
            m_devBhv |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
            m_bUseSWVP = true;
        }
    }
    else
    {
        m_devBhv |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
    }

	assert(GetSafeHwnd());
    hr = pEnum->CreateDevice(
            D3DADAPTER_DEFAULT,     // iAdapter
            m_devType,              // device type
            GetSafeHwnd(),          // focus
            m_devBhv,               // dwBehaviorFlags
            &m_d3dpp,                 // presentation parameters
            &m_pD3DDev);

	if (FAILED(hr))
	{
		InterpretError(hr);
		MessageBox("Failed to create device!", "ERROR", MB_OK);
		return E_FAIL;
	}
	m_pD3DDev->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, m_bUseSWVP);
    SAFE_RELEASE(pEnum);

	hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0xAA, 0xAA, 0xAA ), 1.0, 0);

	hr = InitLogo();
	if (FAILED(hr))
		return hr;

	if (FAILED(SetupTextImage()))
	{
		InterpretError(hr);
		MessageBox("Failed to create font", "ERROR", MB_OK);

		return E_FAIL;
	}

	if (FAILED(SetupTextBuffer()))
	{
		InterpretError(hr);
		MessageBox("Failed to create text VB", "ERROR", MB_OK);

		return E_FAIL;
	}

	m_bValid = true;
	
    return S_OK;
}

HRESULT CRenderD3DWnd::ReleaseD3D()
{
	// Logo stuff
    SAFE_RELEASE(m_pLogoTexture);
	SAFE_RELEASE(m_pLogoVB);

	// Text stuff
	FreeTextImage();
	FreeTextBuffer();
    
	SAFE_RELEASE(m_pD3DDev);
    return S_OK;
}

// Sets up a default set of renderstates
HRESULT CRenderD3DWnd::SetDefaultRenderstatesD3D()
{
	if (!m_bValid)
		return NVEFF_ERR_NOTINITIALIZED;

	m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
	m_pD3DDev->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
	m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
	m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
	m_pD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE);
	m_pD3DDev->SetRenderState(D3DRS_FOGCOLOR, 0xFF0000);
	m_pD3DDev->SetRenderState(D3DRS_FOGTABLEMODE,   D3DFOG_NONE );
	m_pD3DDev->SetRenderState(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR );
	m_pD3DDev->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE );
	m_pD3DDev->SetRenderState(D3DRS_ZENABLE, TRUE);
	m_pD3DDev->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL);
	m_pD3DDev->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
	m_pD3DDev->SetRenderState(D3DRS_DITHERENABLE, TRUE);
	m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
	m_pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
	m_pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
	m_pD3DDev->SetRenderState(D3DRS_CLIPPING, TRUE);
	m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
	m_pD3DDev->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
	m_pD3DDev->SetRenderState(D3DRS_COLORVERTEX, FALSE);

	m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

	m_pD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(4, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(5, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(6, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(7, D3DTSS_COLOROP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_COLORARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

	m_pD3DDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_TEXCOORDINDEX, 2);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_TEXCOORDINDEX, 3);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_TEXCOORDINDEX, 4);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_TEXCOORDINDEX, 5);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_TEXCOORDINDEX, 6);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_TEXCOORDINDEX, 7);
	
	m_pD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(3, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(4, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(5, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(6, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(7, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);

	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);

	m_pD3DDev->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(4, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(5, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(6, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
	m_pD3DDev->SetTextureStageState(7, D3DTSS_TEXTURETRANSFORMFLAGS, 0);

	m_pD3DDev->SetRenderState( D3DRS_WRAP0, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP1, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP2, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP3, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP4, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP5, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP6, 0);
	m_pD3DDev->SetRenderState( D3DRS_WRAP7, 0);

	m_pD3DDev->SetTexture(0, NULL);
	m_pD3DDev->SetTexture(1, NULL);
	m_pD3DDev->SetTexture(2, NULL);
	m_pD3DDev->SetTexture(3, NULL);
	m_pD3DDev->SetTexture(4, NULL);
	m_pD3DDev->SetTexture(5, NULL);
	m_pD3DDev->SetTexture(6, NULL);
	m_pD3DDev->SetTexture(7, NULL);
	
	m_pD3DDev->SetPixelShader(0);

	return S_OK;
}

HRESULT CRenderD3DWnd::InitLogo()
{
	// Get the shared logo bits
	HRESULT hr;
	BYTE *lpImg;
	UINT w, h, w2, h2;

	hr = GetRenderView()->GetSharedLogoBits(&lpImg, &w, &h, &w2, &h2);
	if (FAILED(hr) || !lpImg)
		return E_FAIL;

	// Create the logo view
	hr = D3DXCreateTexture(m_pD3DDev, w2, h2, 1, 0, D3DFMT_A8R8G8B8,
						   D3DPOOL_MANAGED, &m_pLogoTexture);
	if (FAILED(hr)) {
		InterpretError(hr);
		MessageBox("Failed to create logo texture!", "ERROR", MB_OK);
		return E_FAIL;
	}

	// Lock the texture bits
	D3DLOCKED_RECT lockedRect;
	hr = m_pLogoTexture->LockRect(0, &lockedRect, NULL, 0x0);
	if (FAILED(hr)) {
		InterpretError(hr);
		MessageBox("Failed to create logo texture!", "ERROR", MB_OK);
		return E_FAIL;
	}

	// Copy the shared bits into the texture
	ASSERT(lockedRect.pBits);
	memcpy(lockedRect.pBits, lpImg, w2*h2*4);

	// Release the texture bits
	hr = m_pLogoTexture->UnlockRect(0);
	if (FAILED(hr)) {
		InterpretError(hr);
		MessageBox("Failed to create logo texture!", "ERROR", MB_OK);
		return E_FAIL;
	}

	// Create a big square for rendering the Logo mask
    hr = m_pD3DDev->CreateVertexBuffer( 4*sizeof(TLVertex),
                                                 D3DUSAGE_WRITEONLY, D3DFVF_TLVERTEX, 
                                                  D3DPOOL_MANAGED, &m_pLogoVB );
	if (FAILED(hr)) {
		InterpretError(hr);
		MessageBox("Failed to create logo vertex buffer!", "ERROR", MB_OK);
		return E_FAIL;
	}

	if (FAILED(ResizeLogo())) {
		InterpretError(hr);
		MessageBox("Failed to create logo vertex buffer!", "ERROR", MB_OK);
		return E_FAIL;
	}

	return S_OK;
}

HRESULT CRenderD3DWnd::DrawLogo()
{
	DWORD dwVertexShader;
	DWORD dwPixelShader;
	UINT VBStride;
	LPDIRECT3DVERTEXBUFFER8 pVB;
	LPDIRECT3DBASETEXTURE8 pTexture0;
	DWORD i;

	if (!m_bValid)
		return NVEFF_ERR_NOTINITIALIZED;

	typedef struct tagRenderStates
	{
		D3DRENDERSTATETYPE Type;
		DWORD dwValue;
		DWORD dwDesiredValue;
	} tRenderStates;

	typedef struct tagTextureStageStates
	{
		D3DTEXTURESTAGESTATETYPE Type;
		DWORD dwValue;
		DWORD dwDesiredValue;
	} tTextureStates;


	tRenderStates SavedRender[] = 
	{
		{ D3DRS_ZENABLE, 0, FALSE}, 
		{ D3DRS_ALPHATESTENABLE, 0, TRUE },
		{ D3DRS_ALPHAREF, 0, 0x80 },
		{ D3DRS_ALPHAFUNC, 0, D3DCMP_GREATER},
		{ D3DRS_ALPHABLENDENABLE, 0, TRUE},
		{ D3DRS_SRCBLEND, 0, D3DBLEND_SRCALPHA },
		{ D3DRS_DESTBLEND, 0, D3DBLEND_INVSRCALPHA },
		{ D3DRS_FOGENABLE, 0, FALSE },
		{ D3DRS_CULLMODE, 0, D3DCULL_NONE },
		{ D3DRS_FILLMODE, 0, D3DFILL_SOLID},
		{ D3DRS_WRAP0, 0, 0}
	};

	tTextureStates SavedTextureStage0[] = 
	{
		{ D3DTSS_COLOROP, 0, D3DTOP_SELECTARG1 }, 
		{ D3DTSS_COLORARG1, 0, D3DTA_TEXTURE },
		{ D3DTSS_ALPHAOP, 0, D3DTOP_SELECTARG1 },
		{ D3DTSS_ALPHAARG1, 0, D3DTA_TEXTURE },
		{ D3DTSS_TEXCOORDINDEX, 0, 0 },
		{ D3DTSS_MINFILTER, 0, D3DTEXF_LINEAR },
		{ D3DTSS_MAGFILTER, 0, D3DTEXF_LINEAR },
	};

	tTextureStates SavedTextureStage1[] = 
	{
		{ D3DTSS_COLOROP, 0, D3DTOP_DISABLE }, 
		{ D3DTSS_ALPHAOP, 0, D3DTOP_DISABLE },
		{ D3DTSS_TEXCOORDINDEX, 0, 1 }
	};

	// Save state.
	// Note that a 'real' app should never do this.  The effects browser has to contend with all the seperate 
	// plugins which may have their own state management code.  To stop everyone having to coexist with the 
	// same state manager, we do gets and sets.  This means that the EBrowser can't run on the pure device because
	// of the logo.
	m_pD3DDev->GetVertexShader(&dwVertexShader);
	m_pD3DDev->GetPixelShader(&dwPixelShader);
	m_pD3DDev->GetStreamSource(0, &pVB, &VBStride);
	m_pD3DDev->GetTexture(0, &pTexture0);
	for (i = 0; i < sizeof(SavedRender) / sizeof(tRenderStates); i++)
	{
		m_pD3DDev->GetRenderState(SavedRender[i].Type, &SavedRender[i].dwValue);
	}
	for (i = 0; i < sizeof(SavedTextureStage0) / sizeof(tTextureStates); i++)
	{
		m_pD3DDev->GetTextureStageState(0, SavedTextureStage0[i].Type, &SavedTextureStage0[i].dwValue);
	}
	for (i = 0; i < sizeof(SavedTextureStage1) / sizeof(tTextureStates); i++)
	{
		m_pD3DDev->GetTextureStageState(1, SavedTextureStage1[i].Type, &SavedTextureStage1[i].dwValue);
	}
	
	// Set state
	if (dwVertexShader != D3DFVF_TLVERTEX)
		m_pD3DDev->SetVertexShader(D3DFVF_TLVERTEX);

	if (dwPixelShader != 0)
		m_pD3DDev->SetPixelShader(0);

	if (pVB != m_pLogoVB)
		m_pD3DDev->SetStreamSource(0, m_pLogoVB, sizeof(TLVertex));

	if (pTexture0 != m_pLogoTexture)
		m_pD3DDev->SetTexture(0, m_pLogoTexture);

	for (i = 0; i < sizeof(SavedRender) / sizeof(tRenderStates); i++)
	{
		if (SavedRender[i].dwDesiredValue != SavedRender[i].dwValue)
			m_pD3DDev->SetRenderState(SavedRender[i].Type, SavedRender[i].dwDesiredValue);
	}
	for (i = 0; i < sizeof(SavedTextureStage0) / sizeof(tTextureStates); i++)
	{
		if (SavedTextureStage0[i].dwDesiredValue != SavedTextureStage0[i].dwValue)
			m_pD3DDev->SetTextureStageState(0, SavedTextureStage0[i].Type, SavedTextureStage0[i].dwDesiredValue);
	}
	for (i = 0; i < sizeof(SavedTextureStage1) / sizeof(tTextureStates); i++)
	{
		if (SavedTextureStage1[i].dwDesiredValue != SavedTextureStage1[i].dwValue)
			m_pD3DDev->SetTextureStageState(1, SavedTextureStage1[i].Type, SavedTextureStage1[i].dwDesiredValue);
	}

	// Draw the Logo
	m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2 );

	// Restore state
	m_pD3DDev->SetVertexShader(dwVertexShader);
	m_pD3DDev->SetStreamSource(0, pVB, VBStride);
	m_pD3DDev->SetTexture(0, pTexture0);
	m_pD3DDev->SetPixelShader(dwPixelShader);

	SAFE_RELEASE(pTexture0);
	SAFE_RELEASE(pVB);

	for (i = 0; i < sizeof(SavedRender) / sizeof(tRenderStates); i++)
	{
		if (SavedRender[i].dwDesiredValue != SavedRender[i].dwValue)
			m_pD3DDev->SetRenderState(SavedRender[i].Type, SavedRender[i].dwValue);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -