BOOL FindDepthStencilFormat(UINT iAdapter, D3DDEVTYPE DeviceType, D3DFORMAT TargetFormat, D3DFORMAT *pDepthStencilFormat) { // prima lo cerco a 32bit, poi a 24 e infine a 16...e se non // c'è vaffanculo alla tua scheda grafica. if (SUCCEEDED(g_pD3D->CheckDeviceFormat(iAdapter, DeviceType, TargetFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32))) { if (SUCCEEDED(g_pD3D->CheckDepthStencilMatch(iAdapter, DeviceType, TargetFormat, TargetFormat, D3DFMT_D32))) { *pDepthStencilFormat = D3DFMT_D32; return TRUE; } } if (SUCCEEDED(g_pD3D->CheckDeviceFormat( iAdapter, DeviceType, TargetFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24X8))) { if (SUCCEEDED(g_pD3D->CheckDepthStencilMatch(iAdapter, DeviceType, TargetFormat, TargetFormat, D3DFMT_D24X8 ))) { *pDepthStencilFormat = D3DFMT_D24X8; return TRUE; } } if(SUCCEEDED(g_pD3D->CheckDeviceFormat(iAdapter, DeviceType, TargetFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8))) { if(SUCCEEDED(g_pD3D->CheckDepthStencilMatch(iAdapter, DeviceType, TargetFormat, TargetFormat, D3DFMT_D24S8))) { *pDepthStencilFormat = D3DFMT_D24S8; return TRUE; } } if (SUCCEEDED(g_pD3D->CheckDeviceFormat(iAdapter, DeviceType, TargetFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16))) { if (SUCCEEDED(g_pD3D->CheckDepthStencilMatch( iAdapter, DeviceType, TargetFormat, TargetFormat, D3DFMT_D16))) { *pDepthStencilFormat = D3DFMT_D16; return TRUE; } } return FALSE; }
HRESULT HookIDirect3D9::CheckDepthStencilMatch(LPVOID _this, UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) { LOG_API(); return pD3D->CheckDepthStencilMatch(Adapter, DeviceType, AdapterFormat, RenderTargetFormat, DepthStencilFormat); }
HRESULT KGraphicsEngine::InitializeWindowed(HWND hBaseWindow, HWND hRenderWindow) { // Create the D3D object. if ( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) { MessageBox(hBaseWindow,"Failed Create the D3D object!.","Failed Create the D3D object!",0); return E_FAIL; } // Get the current desktop display mode, so we can set up a back // buffer of the same format g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&g_D3DCaps); if ( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &m_DisplayMode ) ) ) { MessageBox(hBaseWindow,"Failed GetAdapterDisplayMode !.","Failed Create the D3D object!",0); return E_FAIL; } // Set up the structure used to create the D3DDevice D3DFORMAT DepFormat; if (SUCCEEDED(g_pD3D->CheckDepthStencilMatch(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_DisplayMode.Format, m_DisplayMode.Format, D3DFMT_D24S8))) { DepFormat = D3DFMT_D24S8; } else { DepFormat = D3DFMT_D16; } memset( &m_PresentParam, 0, sizeof(D3DPRESENT_PARAMETERS) ); memset(&m_RenderWindowRect, 0, sizeof(m_RenderWindowRect)); if(hRenderWindow) ::GetWindowRect(hRenderWindow,&m_RenderWindowRect); else { ::GetWindowRect(hBaseWindow,&m_RenderWindowRect); hRenderWindow = hBaseWindow; } //m_PresentParam.BackBufferWidth = m_RenderWindowRect.right-m_RenderWindowRect.left ; //m_PresentParam.BackBufferHeight= m_RenderWindowRect.bottom - m_RenderWindowRect.top; m_PresentParam.BackBufferWidth = m_DisplayMode.Width ; m_PresentParam.BackBufferHeight= m_DisplayMode.Height; m_PresentParam.Windowed = TRUE ; m_PresentParam.SwapEffect = D3DSWAPEFFECT_DISCARD; m_PresentParam.BackBufferFormat = m_DisplayMode.Format; m_PresentParam.EnableAutoDepthStencil = TRUE; m_PresentParam.AutoDepthStencilFormat = DepFormat; m_PresentParam.MultiSampleType = D3DMULTISAMPLE_NONE; m_PresentParam.hDeviceWindow = hBaseWindow; m_PresentParam.Flags = 0; m_PresentParam.FullScreen_RefreshRateInHz = 0; m_PresentParam.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //just set camera's aspect m_cCamera.Aspect = m_PresentParam.BackBufferWidth*1.0f/m_PresentParam.BackBufferHeight; HRESULT hr; // Set default settings UINT AdapterToUse=D3DADAPTER_DEFAULT; D3DDEVTYPE DeviceType=D3DDEVTYPE_HAL; //#if SHIPPING_VERSION // When building a shipping version, disable NVPerfHUD (opt-out) //#else // Look for 'NVIDIA NVPerfHUD' adapter // If it is present, override default settings for (UINT Adapter=0;Adapter<g_pD3D->GetAdapterCount();Adapter++) { D3DADAPTER_IDENTIFIER9 Identifier; HRESULT Res=g_pD3D->GetAdapterIdentifier(Adapter,0,&Identifier); if (strcmp(Identifier.Description,"NVIDIA NVPerfHUD")==0) { AdapterToUse=Adapter; DeviceType=D3DDEVTYPE_REF; break; } } //#endif // Create the D3DDevice /*if ( FAILED(hr = g_pD3D->CreateDevice( AdapterToUse, DeviceType, hBaseWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_PresentParam, &g_pd3dDevice ) ) ) {*/ if ( FAILED(hr = g_pD3D->CreateDevice( AdapterToUse, DeviceType, hBaseWindow, D3DCREATE_MIXED_VERTEXPROCESSING, &m_PresentParam, &g_pd3dDevice ) ) ) { if ( FAILED(hr = g_pD3D->CreateDevice( AdapterToUse, DeviceType, hBaseWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_PresentParam, &g_pd3dDevice ) ) ) { if (hr == D3DERR_INVALIDCALL) MessageBox(hBaseWindow,"The method call is invalid. For example, a method's parameter may have an invalid value.","Failed Create Device!",0); else if (hr == E_OUTOFMEMORY ) MessageBox(hBaseWindow,"Direct3D could not allocate sufficient memory to complete the call.","Failed Create Device!",0); else if (hr == D3DERR_OUTOFVIDEOMEMORY) MessageBox(hBaseWindow,"Direct3D does not have enough display memory to perform the operation. ","Failed Create Device!",0); return E_FAIL; } } /* }*/ // D3DMULTISAMPLE_TYPE Mul = D3DMULTISAMPLE_4_SAMPLES; // // if( FAILED(g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, // D3DDEVTYPE_HAL, m_PresentParam.BackBufferFormat, // FALSE, Mul, NULL ) ) && // SUCCEEDED(g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, // D3DDEVTYPE_HAL, m_PresentParam.AutoDepthStencilFormat, // FALSE, Mul, NULL ) ) ) // { // Mul = D3DMULTISAMPLE_3_SAMPLES; // // if( FAILED(g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, // D3DDEVTYPE_HAL, m_PresentParam.BackBufferFormat, // FALSE, Mul, NULL ) ) && // SUCCEEDED(g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, // D3DDEVTYPE_HAL, m_PresentParam.AutoDepthStencilFormat, // FALSE, Mul, NULL ) ) ) // { // Mul = D3DMULTISAMPLE_2_SAMPLES; // // if( FAILED(g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, // D3DDEVTYPE_HAL, m_PresentParam.BackBufferFormat, // FALSE, Mul, NULL ) ) && // SUCCEEDED(g_pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, // D3DDEVTYPE_HAL, m_PresentParam.AutoDepthStencilFormat, // FALSE, Mul, NULL ) ) ) // { // Mul = D3DMULTISAMPLE_NONE; // } // } // } // if (Mul != D3DMULTISAMPLE_NONE) // { // m_PresentParam.MultiSampleType = Mul; // g_pd3dDevice->Reset( &m_PresentParam ); // } // Device state would normally be set here // Turn off culling, so we see the front and back of the triangle g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ); // Turn off D3D lighting, since we are providing our own vertex colors // Turn on the zbuffer g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); //g_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE , TRUE ); g_pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL ); g_cGraphicsTool.SetCurCamera(&m_cCamera); PreRender(); m_bWindowed = TRUE; if (m_bUseMotionBlur) { BackBufferCreate(); g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, 0xff666666, 1.0f, 0 ); } return S_OK; }
HRESULT KGraphicsEngine::Toggle2Windowed() { if (m_lpCurScene) { g_cMeshTable.InvalidateDeviceObjects(); g_SceneTable.InvalidateDeviceObjects(); } g_EffectMgr.InvalidateDeviceObjects(); if (m_bUseMotionBlur) { BackBufferRelease(); } HRESULT hr = S_OK; GetWindowRect(m_LastRenderWindow,&m_RenderWindowRect); //m_PresentParam.BackBufferWidth = m_RenderWindowRect.right-m_RenderWindowRect.left ; //m_PresentParam.BackBufferHeight= m_RenderWindowRect.bottom - m_RenderWindowRect.top; m_PresentParam.BackBufferWidth = m_DisplayMode.Width; m_PresentParam.BackBufferHeight= m_DisplayMode.Height; D3DFORMAT DepFormat; if (SUCCEEDED(g_pD3D->CheckDepthStencilMatch(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_DisplayMode.Format, m_DisplayMode.Format, D3DFMT_D24S8))) { DepFormat = D3DFMT_D24S8; } else { DepFormat = D3DFMT_D16; } m_PresentParam.Windowed = TRUE ; m_PresentParam.SwapEffect = D3DSWAPEFFECT_DISCARD; m_PresentParam.BackBufferFormat = m_DisplayMode.Format; m_PresentParam.EnableAutoDepthStencil = TRUE; m_PresentParam.AutoDepthStencilFormat = DepFormat; m_PresentParam.MultiSampleType = D3DMULTISAMPLE_NONE; m_PresentParam.hDeviceWindow = g_hBaseWnd; m_PresentParam.Flags = 0; m_PresentParam.FullScreen_RefreshRateInHz = 0; m_PresentParam.BackBufferCount = 0; m_PresentParam.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; //just set camera's aspect m_cCamera.Aspect = m_PresentParam.BackBufferWidth*1.0f/m_PresentParam.BackBufferHeight; g_pd3dDevice->SetDialogBoxMode( FALSE ); if ( FAILED(hr = g_pd3dDevice->Reset( &m_PresentParam ))) { //fprintf(Note,"Create D3D Device Failed.\n"); if (hr == D3DERR_INVALIDCALL) MessageBox(g_hBaseWnd,"Toggle to Windowed Failed!","Failed in Toggling",0); else if (hr == E_OUTOFMEMORY ) MessageBox(g_hBaseWnd,"Direct3D could not allocate sufficient memory to complete the call.","Failed Create Device!",0); else if (hr == D3DERR_OUTOFVIDEOMEMORY) MessageBox(g_hBaseWnd,"Direct3D does not have enough display memory to perform the operation. ","Failed Create Device!",0); return E_FAIL; } SetWindowLong( g_hBaseWnd , GWL_STYLE, m_BaseWinStyle ); SetRenderWindow(m_LastRenderWindow); m_bWindowed = TRUE; if (m_lpCurScene) { g_cMeshTable.RestoreDeviceObjects(); g_SceneTable.RestoreDeviceObjects(); } g_EffectMgr.RestoreDeviceObjects(); if (m_bUseMotionBlur) { BackBufferCreate(); } return S_OK; }
HRESULT InitScene() { HRESULT hr; D3DDISPLAYMODE mode; if( FAILED(hr = direct3d->GetAdapterDisplayMode(0, &mode)) ) { MYERROR("Could not get adapter mode"); return hr; } if( FAILED(hr = direct3d->CheckDeviceFormat( 0, D3DDEVTYPE_HAL, mode.Format, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, D3DFMT_A16B16G16R16F)) ) { MYERROR("No floating point rendertarget support"); return hr; } // más depth/stencil-el még müködhet if( FAILED(hr = direct3d->CheckDepthStencilMatch( 0, D3DDEVTYPE_HAL, mode.Format, D3DFMT_A16B16G16R16F, D3DFMT_D24S8)) ) { MYERROR("D3DFMT_A16B16G16R16F does not support D3DFMT_D24S8"); return hr; } D3DVERTEXELEMENT9 elem[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 }, { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; SetWindowText(hwnd, TITLE); MYVALID(D3DXLoadMeshFromX("../media/meshes/skullocc3.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh1)); MYVALID(D3DXLoadMeshFromX("../media/meshes//knot.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh2)); MYVALID(D3DXLoadMeshFromX("../media/meshes//teapot.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh3)); MYVALID(D3DXLoadMeshFromX("../media/meshes/sky.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &skymesh)); mesh = mesh1; //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/altar.dds", &skytexture)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/altar_rough.dds", &roughspecular)); MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/grace.dds", &skytexture)); MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/grace_rough.dds", &roughspecular)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/beach.dds", &skytexture)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/beach_rough.dds", &roughspecular)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/stpeters.dds", &skytexture)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/stpeters_rough.dds", &roughspecular)); MYVALID(D3DXCreateTextureFromFile(device, "../media/textures/gold.jpg", &texture)); MYVALID(D3DXCreateTextureFromFile(device, "../media/textures/fresnel.png", &fresneltexture)); // downsample & blur textures for( int i = 0; i < 5; ++i ) { MYVALID(device->CreateTexture(screenwidth / (2 << i), screenheight / (2 << i), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &dstargets[i], NULL)); MYVALID(device->CreateTexture(screenwidth / (2 << i), screenheight / (2 << i), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &blurtargets[i], NULL)); MYVALID(blurtargets[i]->GetSurfaceLevel(0, &blursurfaces[i])); MYVALID(dstargets[i]->GetSurfaceLevel(0, &dssurfaces[i])); } // star textures (8x 1 MB @ 1080p) for( int i = 0; i < 4; ++i ) { for( int j = 0; j < 2; ++j ) { MYVALID(device->CreateTexture(screenwidth / 4, screenheight / 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &startargets[i][j], NULL)); MYVALID(startargets[i][j]->GetSurfaceLevel(0, &starsurfaces[i][j])); } } // lens flare textures (2x 4 MB @ 1080p) for( int i = 0; i < 2; ++i ) { MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &ghosttargets[i], NULL)); MYVALID(ghosttargets[i]->GetSurfaceLevel(0, &ghostsurfaces[i])); } // luminance textures for( int i = 0; i < 4; ++i ) { UINT j = 256 / (4 << (2 * i)); MYVALID(device->CreateTexture(j, j, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, &avglumtargets[i], NULL)); MYVALID(avglumtargets[i]->GetSurfaceLevel(0, &avglumsurfaces[i])); } // adapted luminance textures MYVALID(device->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, &avglumtargets[4], NULL)); MYVALID(device->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, &avglumtargets[5], NULL)); MYVALID(avglumtargets[4]->GetSurfaceLevel(0, &avglumsurfaces[4])); MYVALID(avglumtargets[5]->GetSurfaceLevel(0, &avglumsurfaces[5])); // afterimage textures (2x 4 MB @ 1080p) MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &afterimages[0], NULL)); MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &afterimages[1], NULL)); MYVALID(afterimages[0]->GetSurfaceLevel(0, &aftersurfaces[0])); MYVALID(afterimages[1]->GetSurfaceLevel(0, &aftersurfaces[1])); // other MYVALID(device->CreateTexture(512, 512, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &text, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &scenetarget, NULL)); MYVALID(device->CreateVertexDeclaration(elem, &vertexdecl)); // other MYVALID(scenetarget->GetSurfaceLevel(0, &scenesurface)); MYVALID(DXCreateEffect("../media/shaders/hdreffects.fx", device, &hdreffect)); MYVALID(DXCreateEffect("../media/shaders/hdrfresnel.fx", device, &fresnel)); MYVALID(DXCreateEffect("../media/shaders/sky.fx", device, &skyeffect)); device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); device->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); device->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); device->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(2, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); device->SetSamplerState(2, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); device->SetSamplerState(3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(3, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(4, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(4, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(4, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(5, D3DSAMP_MINFILTER, D3DTEXF_POINT); device->SetSamplerState(5, D3DSAMP_MAGFILTER, D3DTEXF_POINT); device->SetSamplerState(5, D3DSAMP_MIPFILTER, D3DTEXF_NONE); DXRenderText(HELP_TEXT, text, 512, 512); // setup camera D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI / 3, (float)screenwidth / (float)screenheight, 1, 50); D3DXMatrixIdentity(&world); cameraangle = D3DXVECTOR2(0.6f, 0.1f); objectangle = D3DXVECTOR2(0, 0); exposurevelocity = 0; destexposurevelocity = 0; exposure = 0.05f; targetluminance = 0.03f; UpdateText(); return S_OK; }