19,464
社区成员
发帖
与我相关
我的任务
分享






HRESULT ENd3d::LHxxINIT_D3DCOM(LPDIRECT3DDEVICE9 &m_pd3dDevice,int D3DFMT,
CRITICAL_SECTION &cs,int w,int h,bool Fullscreen)
{
// Create the D3D object.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
// Get the current desktop display mode, so we can set up a back
// buffer of the same format
D3DDISPLAYMODE d3ddm;
//得到计算机显示卡当前的显示模式信息;P16
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return E_FAIL;
//全屏模式的参数设置(后缓存的图形格式设置)(测试主显示设备)
bool m_bFullScreen=Fullscreen;
const D3DFORMAT fmtFullscreenArray[] =
{
D3DFMT_A8R8G8B8,
D3DFMT_X8R8G8B8,
D3DFMT_X1R5G5B5,
D3DFMT_A1R5G5B5,
D3DFMT_R5G6B5,
};
const INT numFullscreenFmts = sizeof(fmtFullscreenArray) / sizeof(fmtFullscreenArray[0]);
INT iFmt;
// Find a pixel format that will be good for fullscreen back buffers
for( iFmt = 0; iFmt < numFullscreenFmts; iFmt++ )
{
//这个方法可以快速的检测出device是否支持你将要使用的格式
if( SUCCEEDED( g_pD3D->CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
fmtFullscreenArray[iFmt], fmtFullscreenArray[iFmt], FALSE ) ) )
{
m_d3dfmtFullscreen = fmtFullscreenArray[iFmt];
break;
}
}
//创建纹理设置参数
const D3DFORMAT fmtTextureArray[] =
{
D3DFMT_A8R8G8B8,
D3DFMT_A4R4G4B4,
D3DFMT_A1R5G5B5,
};
const INT numTextureFmts = sizeof(fmtTextureArray) / sizeof(fmtTextureArray[0]);
// Find a format that is supported as a texture map for the current mode
for( iFmt = 0; iFmt < numTextureFmts; iFmt++ )
{
//查询当前设备是否支持DXT纹理压缩;P141
if( SUCCEEDED( g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
d3ddm.Format, 0, D3DRTYPE_TEXTURE, fmtTextureArray[iFmt] ) ) )
{
m_d3dfmtTexture = fmtTextureArray[iFmt];
break;
}
}
// Set up presentation parameters for the display
D3DPRESENT_PARAMETERS m_d3dpp; //创建显示设置对象
ZeroMemory( &m_d3dpp, sizeof(m_d3dpp) );
m_d3dpp.Windowed = !m_bFullScreen;//false=!0即为1(不是全屏);
m_d3dpp.BackBufferCount = 1;//后备缓冲的数量
//指定系统如何将后台缓冲区的内容COPY TO前台显示
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.EnableAutoDepthStencil = TRUE;//创建深度缓冲区P157
if(D3DFMT==0){m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;}//深度缓冲区中的每一个像素为16位整数存放
else if(D3DFMT==1){m_d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8;}//创建32位深度/模版缓冲 24位深度缓冲,其余8位什么都不干
else if(D3DFMT==2){m_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;}//将深度缓冲区一部分作为模板缓冲区使用(default)
m_d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;//多重采样()8.6
//后台缓冲到前台缓冲区的交换频率
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
if( Fullscreen )//全屏方式(当为0时不执行,负数和正数执行)
{
//获取显示器的像素
// m_d3dpp.BackBufferWidth =d3ddm.Width;// 0X400;
// m_d3dpp.BackBufferHeight =d3ddm.Height;// 0X300;
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.BackBufferWidth = w;//屏幕大小
m_d3dpp.BackBufferHeight = h;
//使后缓存的图形格式设置
m_d3dpp.BackBufferFormat = m_d3dfmtFullscreen;
//图形在全屏时的刷新率
m_d3dpp.FullScreen_RefreshRateInHz=d3ddm.RefreshRate;
//D3DFMT_D32 D3DFMT_D15S1 D3DFMT_D24S8 D3DFMT_D24X8 D3DFMT_D24X4S4 D3DFMT_D24FS8
//D3DFMT_UNKNOWN D3DFMT_A8R8G8B8 X8R8G8B8 R5G6B5 A1R5G5B5 X1R5G5B5 A4R4G4B4 d3ddm.Format
//D3DCREATE_HARDWARE_VERTEXPROCESSING
}
else//窗口方式
{
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.BackBufferWidth = w;
m_d3dpp.BackBufferHeight = h;
//使后缓存的图形格式与前图形显示卡的显示像素格式相等
m_d3dpp.BackBufferFormat = d3ddm.Format;
}
// Create the device
g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pd3dDevice );
//存放渲染目标缓冲区(后缓冲区)
// Store render target surface desc
LPDIRECT3DSURFACE9 pBackBuffer = NULL;
m_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
pBackBuffer->Release();
return S_OK;
}
void ENd3d::LHxxCREATE_FONT(LPD3DXFONT &m_pFont_china,int fsize,char *name)
{
HDC hDC = GetDC( NULL );
ReleaseDC( NULL, hDC );
D3DXCreateFont( m_pd3dDevice, // D3D device
fsize, // Height
0, // Width
0, // Weight 0 FW_BOLD
0, // MipLevels, 0 = autogen mipmaps
FALSE, // Italic
DEFAULT_CHARSET, // CharSet
OUT_DEFAULT_PRECIS, // OutputPrecision
DEFAULT_QUALITY, // Quality
DEFAULT_PITCH | FF_SWISS, // PitchAndFamily FF_SWISS FF_DONTCARE
TEXT(name), // pFaceName TEXT("Arial")黑体
&m_pFont_china); // ppFont
// Restore the fonts
m_pFont_china->OnResetDevice();
}
void ENd3d::LHxxFREE_FONT(LPD3DXFONT &m_pFont_china)
{
if(m_pFont_china)
{SAFE_DELETE( m_pFont_china );}
}
//GDI
void ENd3d::LHxxSHOW_GDITEXT(char *text,int x,int y,COLORREF color,HFONT &font)
{
//isalnum(window_char_message);
HDC hdc;
// get the dc
hdc = GetDC(hWnd);
// set the color
SetBkMode(hdc,OPAQUE);
SelectObject( hdc, font );//选择字体
SetTextColor(hdc,color);
SetBkColor(hdc,RGB(0,0,0));
// print the message
TextOut(hdc,x,y,text,strlen(text));
// release the dc
ReleaseDC(hWnd,hdc);
}
void ENd3d::LHxxSHOW_CHINATEXT(char *buf,int x,int y,LPD3DXFONT &m_pFont_china,float r,float g,float b)
{
RECT rc;SetRect( &rc, x, y, 0, 0 );
m_pFont_china->DrawText( NULL,buf, -1, &rc, DT_NOCLIP, D3DXCOLOR( r, g, b, 1.0f ));
}
全屏有固定格式,GDI显示字体,还行,不过一般少用.
