//-------------------------------------------------------------------------------------- // Name: Downsample4x4Texture() // Desc: Scale down pSrcTexture by 1/4 x 1/4 and place the result in pDstTexture //-------------------------------------------------------------------------------------- VOID PostProcess::Downsample4x4Texture( LPDIRECT3DTEXTURE9 pSrcTexture, LPDIRECT3DTEXTURE9 pDstTexture ) { // Make sure that the required shaders and objects exist assert( m_pDownScale4x4PS ); assert( pSrcTexture && pDstTexture ); XGTEXTURE_DESC SrcDesc; XGGetTextureDesc( pSrcTexture, 0, &SrcDesc ); // Create and set a render target PushRenderTarget( 0L, CreateRenderTarget( pDstTexture ) ); // Get the sample offsets used within the pixel shader XMVECTOR avSampleOffsets[MAX_SAMPLES]; GetSampleOffsets_DownScale4x4( SrcDesc.Width, SrcDesc.Height, avSampleOffsets ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); g_pd3dDevice->SetPixelShader( m_pDownScale4x4PS ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); // Draw a fullscreen quad DrawFullScreenQuad(); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
HRESULT CreateDeviceD3D(HWND hWnd) { // Setup swap chain DXGI_SWAP_CHAIN_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.BufferCount = 2; sd.BufferDesc.Width = 0; sd.BufferDesc.Height = 0; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; UINT createDeviceFlags = 0; //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK) return E_FAIL; CreateRenderTarget(); return S_OK; }
//-------------------------------------------------------------------------------------- // Create any D3D10 resources that depend on the back buffer //-------------------------------------------------------------------------------------- HRESULT CALLBACK OnD3D10SwapChainResized( ID3D10Device* pd3dDevice, IDXGISwapChain* pSwapChain, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) { HRESULT hr = S_OK; V_RETURN( g_DialogResourceManager.OnD3D10ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) ); V_RETURN( g_D3DSettingsDlg.OnD3D10ResizedSwapChain( pd3dDevice, pBackBufferSurfaceDesc ) ); // Setup the camera's projection parameters float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height; g_Camera.SetProjParams( 60.0f * ( D3DX_PI / 180.0f ), fAspectRatio, 0.1f, 100.0f ); g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height ); g_Camera.SetButtonMasks( MOUSE_LEFT_BUTTON, MOUSE_WHEEL, MOUSE_MIDDLE_BUTTON ); g_HUD.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 ); g_HUD.SetSize( 170, 170 ); g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width - 170, pBackBufferSurfaceDesc->Height - 300 ); g_SampleUI.SetSize( 170, 300 ); // Update the sample count UpdateMSAASampleCounts( pd3dDevice, pBackBufferSurfaceDesc->Format ); // Create a render target g_BackBufferWidth = pBackBufferSurfaceDesc->Width; g_BackBufferHeight = pBackBufferSurfaceDesc->Height; V_RETURN( CreateRenderTarget( pd3dDevice, g_BackBufferWidth, g_BackBufferHeight, g_MSAASampleCount, 0 ) ); return hr; }
bool GSDevice10::CopyOffscreen(Texture& src, const GSVector4& sr, Texture& dst, int w, int h, int format) { dst = Texture(); if(format == 0) { format = DXGI_FORMAT_R8G8B8A8_UNORM; } if(format != DXGI_FORMAT_R8G8B8A8_UNORM && format != DXGI_FORMAT_R16_UINT) { ASSERT(0); return false; } Texture rt; if(CreateRenderTarget(rt, w, h, format)) { GSVector4 dr(0, 0, w, h); StretchRect(src, sr, rt, dr, m_convert.ps[format == DXGI_FORMAT_R16_UINT ? 1 : 0], NULL); if(CreateOffscreen(dst, w, h, format)) { m_dev->CopyResource(dst, rt); } } Recycle(rt); return !!dst; }
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) return true; switch (msg) { case WM_SIZE: if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) { ImGui_ImplDX10_InvalidateDeviceObjects(); CleanupRenderTarget(); g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); CreateRenderTarget(); ImGui_ImplDX10_CreateDeviceObjects(); } return 0; case WM_SYSCOMMAND: if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu return 0; break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); }
//------------------------------------------------------------------------------------------ bool CGraphicDevice::Reset(int i_nWidth, int i_nHeight ) { HRESULT hr; // サーフェースの破棄 SAFE_RELEASE( m_pd3dSurface9 ); // デバイスのリセット // Presentation Parameter の初期化 m_d3dpp.BackBufferWidth = i_nWidth; m_d3dpp.BackBufferHeight = i_nHeight; hr = m_pd3dDevice9->Reset( &m_d3dpp ); MY_ASSERT( SUCCEEDED(hr) ); // サーフェースを新しいサイズで再作成 bool ret = CreateRenderTarget( i_nWidth, i_nHeight ); MY_ASSERT( ret ); m_nWidth = i_nWidth; m_nHeight = i_nHeight; // ビューポートの設定 m_viewport.X = 0; m_viewport.Y = 0; m_viewport.Width = i_nWidth; m_viewport.Height = i_nHeight; m_viewport.MinZ = 0.0f; m_viewport.MaxZ = 1.0f; return ret; }
void Render() { if (!m_renderTarget) { auto d3dDevice = CreateD3D11Device(); m_renderTarget = CreateRenderTarget(m_d2dFactory, d3dDevice); m_swapChain = CreateSwapChainForHwnd(d3dDevice, __super::m_hWnd); CreateDeviceSwapChainBitmap(m_swapChain, m_renderTarget); static_cast<T *>(this)->CreateDeviceResources(); static_cast<T *>(this)->CreateDeviceSizeResources(); } m_renderTarget->BeginDraw(); // NOTE: no fallback is provided in this base class so all derived classes must implement this static_cast<T *>(this)->Draw(); m_renderTarget->EndDraw(); auto const hr = m_swapChain->Present(1, 0); if (S_OK != hr && DXGI_STATUS_OCCLUDED != hr) { ReleaseDevices(); } }
//-------------------------------------------------------------------------------------- // Handles the GUI events //-------------------------------------------------------------------------------------- void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext ) { switch( nControlID ) { case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break; case IDC_TOGGLEREF: DXUTToggleREF(); break; case IDC_CHANGEDEVICE: g_D3DSettingsDlg.SetActive( !g_D3DSettingsDlg.IsActive() ); break; case IDC_TOGGLEWARP: DXUTToggleWARP(); break; case IDC_TOGGLE_BLUR: g_bUseMotionBlur = !g_bUseMotionBlur; break; case IDC_RENDER_OGRE: g_bRenderOgre = !g_bRenderOgre; break; case IDC_SAMPLE_COUNT: { CDXUTComboBox* pComboBox = ( CDXUTComboBox* )pControl; g_MSAASampleCount = ( UINT )PtrToInt( pComboBox->GetSelectedData() ); HRESULT hr = S_OK; ID3D10Device* pd3dDevice = DXUTGetD3D10Device(); if( pd3dDevice ) V( CreateRenderTarget( pd3dDevice, g_BackBufferWidth, g_BackBufferHeight, g_MSAASampleCount, 0 ) ); } break; } }
already_AddRefed<CompositingRenderTarget> BasicCompositor::CreateRenderTargetForWindow(const IntRect& aRect, SurfaceInitMode aInit, BufferMode aBufferMode) { if (aBufferMode != BufferMode::BUFFER_NONE) { return CreateRenderTarget(aRect, aInit); } MOZ_ASSERT(aRect.width != 0 && aRect.height != 0, "Trying to create a render target of invalid size"); if (aRect.width * aRect.height == 0) { return nullptr; } MOZ_ASSERT(mDrawTarget); // Adjust bounds rect to account for new origin at (0, 0). IntRect rect(0, 0, aRect.XMost(), aRect.YMost()); RefPtr<BasicCompositingRenderTarget> rt = new BasicCompositingRenderTarget(mDrawTarget, rect); if (aInit == INIT_MODE_CLEAR) { mDrawTarget->ClearRect(gfx::Rect(aRect)); } return rt.forget(); }
void VScaleformTexture::OnLeaveBackground() { if (IsLoaded()) CreateRenderTarget(); if (m_spContext != NULL) m_spContext->SetRenderTarget(0, m_spRenderTarget); }
void GSDevice::Interlace(const GSVector2i& ds, int field, int mode, float yoffset) { if(m_weavebob == NULL || m_weavebob->GetSize() != ds) { delete m_weavebob; m_weavebob = CreateRenderTarget(ds.x, ds.y, false); } if(mode == 0 || mode == 2) // weave or blend { // weave first DoInterlace(m_merge, m_weavebob, field, false, 0); if(mode == 2) { // blend if(m_blend == NULL || m_blend->GetSize() != ds) { delete m_blend; m_blend = CreateRenderTarget(ds.x, ds.y, false); } DoInterlace(m_weavebob, m_blend, 2, false, 0); m_current = m_blend; } else { m_current = m_weavebob; } } else if(mode == 1) // bob { DoInterlace(m_merge, m_weavebob, 3, true, yoffset * field); m_current = m_weavebob; } else { m_current = m_merge; } }
void GraphicsDevice::Initialize(void) { CreateDeviceAndSwapChain(); CreateRenderTarget(); SetViewPort(); m_pD3DDevice->OMSetRenderTargets(1, &m_pRenderTarget->GetRenderTargetView(), m_pRenderTarget->GetDepthStencilView() ); }
HRESULT BaseButton::CreateD2DResources() { HRESULT hr=S_OK; //const wchar_t uriOpen[]=L"D:\play4.jpg"; if(!m_pRenderTarget) hr=CreateRenderTarget(); return hr; }
//-------------------------------------------------------------------------------------- // Name: SampleLuminance() // Desc: Measure the average log luminance in the scene. //-------------------------------------------------------------------------------------- VOID PostProcess::SampleLuminance( LPDIRECT3DTEXTURE9 pSrcTexture, BOOL bInitial, LPDIRECT3DTEXTURE9 pDstTexture ) { // Make sure that the required shaders and objects exist assert( m_pSampleLumInitialPS ); assert( m_pSampleLumFinalPS ); assert( pSrcTexture && pDstTexture ); XGTEXTURE_DESC SrcDesc; XGGetTextureDesc( pSrcTexture, 0, &SrcDesc ); // Create and set a render target PushRenderTarget( 0L, CreateRenderTarget( pDstTexture ) ); // Sample initial luminance if( bInitial ) { // Initialize the sample offsets for the initial luminance pass. XMVECTOR avSampleOffsets[MAX_SAMPLES]; GetSampleOffsets_DownScale3x3( SrcDesc.Width, SrcDesc.Height, avSampleOffsets ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); g_pd3dDevice->SetPixelShader( m_pSampleLumInitialPS ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); } else // ( bIntial == FALSE ) { // Perform the final pass of the average luminance calculation. This pass // performs an exp() operation to return a single texel cooresponding to the // average luminance of the scene in m_pToneMapTexture. XMVECTOR avSampleOffsets[MAX_SAMPLES]; GetSampleOffsets_DownScale4x4( SrcDesc.Width, SrcDesc.Height, avSampleOffsets ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); g_pd3dDevice->SetPixelShader( m_pSampleLumFinalPS ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); } // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
//------------------------------------------------------------------------------------------ bool CGraphicDevice::Initialize(int i_nWidth, int i_nHeight) { HRESULT hr = S_OK; // D3Dオブジェクトの作成 m_pd3d9 = Direct3DCreate9(D3D_SDK_VERSION); if( !m_pd3d9 ) { return false; } // ダミーウィンドウを作成 if( CreateDummyWindow() == false ) { return false; } // デバイスを作成 if( CreateDevice(i_nWidth, i_nHeight) == false ) { return false; } // レンダーターゲットの作成 if( CreateRenderTarget(i_nWidth, i_nHeight) == false ) { return false; } /// 全てに成功 /// m_nWidth = i_nWidth; m_nHeight = i_nHeight; // ビューポートの設定 m_viewport.X = 0; m_viewport.Y = 0; m_viewport.Width = i_nWidth; m_viewport.Height = i_nHeight; m_viewport.MinZ = 0.0f; m_viewport.MaxZ = 1.0f; // トランスフォームの初期化(単位行列化) for(int i = 0; i < TransformType_Max; ++i) { D3DXMatrixIdentity( &m_mTransform[i] ); } // シェーダ管理の初期化 shader::CShaderMan::CreateInstance(); shader::CShaderMan::GetInstance()->Initialize(); m_bValid = true; return true; }
HRESULT CreateDeviceD3D(HWND hWnd) { // Setup swap chain DXGI_SWAP_CHAIN_DESC sd; { ZeroMemory(&sd, sizeof(sd)); sd.BufferCount = 2; sd.BufferDesc.Width = 0; sd.BufferDesc.Height = 0; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; } UINT createDeviceFlags = 0; #ifdef _DEBUG createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif D3D_FEATURE_LEVEL featureLevel; const D3D_FEATURE_LEVEL featureLevelArray[1] = { D3D_FEATURE_LEVEL_11_0, }; if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 1, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK) return E_FAIL; // Setup rasterizer { D3D11_RASTERIZER_DESC RSDesc; memset(&RSDesc, 0, sizeof(D3D11_RASTERIZER_DESC)); RSDesc.FillMode = D3D11_FILL_SOLID; RSDesc.CullMode = D3D11_CULL_NONE; RSDesc.FrontCounterClockwise = FALSE; RSDesc.DepthBias = 0; RSDesc.SlopeScaledDepthBias = 0.0f; RSDesc.DepthBiasClamp = 0; RSDesc.DepthClipEnable = TRUE; RSDesc.ScissorEnable = TRUE; RSDesc.AntialiasedLineEnable = FALSE; RSDesc.MultisampleEnable = (sd.SampleDesc.Count > 1) ? TRUE : FALSE; ID3D11RasterizerState* pRState = NULL; g_pd3dDevice->CreateRasterizerState(&RSDesc, &pRState); g_pd3dDeviceContext->RSSetState(pRState); pRState->Release(); } CreateRenderTarget(); return S_OK; }
//-------------------------------------------------------------------------------------- // Name: RenderStarLine() // Desc: Merge the ppSrcTextures and place the result in pDstTexture //-------------------------------------------------------------------------------------- VOID PostProcess::RenderStarLine( LPDIRECT3DTEXTURE9 pSrcTexture, DWORD dwNumSamples, FLOAT fAttenuation, FLOAT fAttnPowScale, XMVECTOR* colors, DWORD pass, FLOAT fStepU, FLOAT fStepV, LPDIRECT3DTEXTURE9 pDstTexture ) { // Make sure that the required shaders and objects exist assert( m_pStarPS ); assert( pSrcTexture && pDstTexture ); // Create and set a render target PushRenderTarget( 0L, CreateRenderTarget( pDstTexture ) ); XMVECTOR avSampleOffsets[MAX_SAMPLES]; XMVECTOR avSampleWeights[MAX_SAMPLES]; // Sampling configration for each stage for( DWORD i = 0; i < dwNumSamples; i++ ) { FLOAT lum = powf( fAttenuation, fAttnPowScale * i ); avSampleWeights[i] = colors[i] * lum * ( pass + 1.0f ) * 0.5f; // Offset of sampling coordinate avSampleOffsets[i].x = fStepU * i; avSampleOffsets[i].y = fStepV * i; if( fabs( avSampleOffsets[i].x ) >= 0.9f || fabs( avSampleOffsets[i].y ) >= 0.9f ) { avSampleOffsets[i].x = 0.0f; avSampleOffsets[i].y = 0.0f; avSampleWeights[i] *= 0.0f; } } g_pd3dDevice->SetPixelShader( m_pStarPS ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleWeights, ( FLOAT* )avSampleWeights, MAX_SAMPLES ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
void RiftSetup() { ovr_Initialize(); s_hmd = ovrHmd_Create(0); if (!s_hmd) { s_hmd = ovrHmd_CreateDebug(ovrHmd_DK1); } ovrHmd_GetDesc(s_hmd, &s_hmdDesc); DumpHMDInfo(s_hmdDesc); uint32_t supportedSensorCaps = ovrSensorCap_Orientation; uint32_t requiredSensorCaps = ovrSensorCap_Orientation; ovrBool success = ovrHmd_StartSensor(s_hmd, supportedSensorCaps, requiredSensorCaps); if (!success) { fprintf(stderr, "ERROR: HMD does not have required capabilities!\n"); exit(2); } // Figure out dimensions of render target ovrSizei recommenedTex0Size = ovrHmd_GetFovTextureSize(s_hmd, ovrEye_Left, s_hmdDesc.DefaultEyeFov[0], 1.0f); ovrSizei recommenedTex1Size = ovrHmd_GetFovTextureSize(s_hmd, ovrEye_Right, s_hmdDesc.DefaultEyeFov[1], 1.0f); s_renderTargetSize.w = recommenedTex0Size.w + recommenedTex1Size.w; s_renderTargetSize.h = std::max(recommenedTex0Size.h, recommenedTex1Size.h); CreateRenderTarget(s_renderTargetSize.w, s_renderTargetSize.h); s_eyeTexture[0].Header.API = ovrRenderAPI_OpenGL; s_eyeTexture[0].Header.TextureSize = s_renderTargetSize; s_eyeTexture[0].Header.RenderViewport.Pos = {0, 0}; s_eyeTexture[0].Header.RenderViewport.Size = {s_renderTargetSize.w / 2, s_renderTargetSize.h}; ((ovrGLTexture*)(&s_eyeTexture[0]))->OGL.TexId = s_fboTex; s_eyeTexture[1].Header.API = ovrRenderAPI_OpenGL; s_eyeTexture[1].Header.TextureSize = s_renderTargetSize; s_eyeTexture[1].Header.RenderViewport.Pos = {s_renderTargetSize.w / 2, 0}; s_eyeTexture[1].Header.RenderViewport.Size = {s_renderTargetSize.w / 2, s_renderTargetSize.h}; ((ovrGLTexture*)(&s_eyeTexture[1]))->OGL.TexId = s_fboTex; // Configure ovr SDK Rendering ovrGLConfig cfg; memset(&cfg, 0, sizeof(ovrGLConfig)); cfg.OGL.Header.API = ovrRenderAPI_OpenGL; cfg.OGL.Header.RTSize = {s_config->width, s_config->height}; cfg.OGL.Header.Multisample = 0; // TODO: on windows need to set HWND, on Linux need to set other parameters if (!ovrHmd_ConfigureRendering(s_hmd, &cfg.Config, s_hmdDesc.DistortionCaps, s_hmdDesc.DefaultEyeFov, s_eyeRenderDesc)) { fprintf(stderr, "ERROR: HMD configure rendering failed!\n"); exit(3); } }
void GSDevice11::SetupDATE(GSTexture* rt, GSTexture* ds, const GSVertexPT1 (&iaVertices)[4], bool datm) { const GSVector2i& size = rt->GetSize(); if(GSTexture* t = CreateRenderTarget(size.x, size.y, rt->IsMSAA())) { // sfex3 (after the capcom logo), vf4 (first menu fading in), ffxii shadows, rumble roses shadows, persona4 shadows BeginScene(); ClearStencil(ds, 0); // om OMSetDepthStencilState(m_date.dss, 1); OMSetBlendState(m_date.bs, 0); OMSetRenderTargets(t, ds); // ia IASetVertexBuffer(iaVertices, sizeof(iaVertices[0]), countof(iaVertices)); IASetInputLayout(m_convert.il); IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); // vs VSSetShader(m_convert.vs, NULL); // gs GSSetShader(NULL); // ps GSTexture* rt2 = rt->IsMSAA() ? Resolve(rt) : rt; PSSetShaderResources(rt2, NULL); PSSetSamplerState(m_convert.pt, NULL); PSSetShader(m_convert.ps[datm ? 2 : 3], NULL); // DrawPrimitive(); // EndScene(); Recycle(t); if(rt2 != rt) Recycle(rt2); } }
//-------------------------------------------------------------------------------------- // Name: CopyTexture() // Desc: Copy the src texture to the dst texture. The scale can (and should) be changed. //-------------------------------------------------------------------------------------- VOID PostProcess::CopyTexture( LPDIRECT3DTEXTURE9 pSrcTexture, LPDIRECT3DTEXTURE9 pDstTexture, LPDIRECT3DPIXELSHADER9 pPixelShader, DWORD dwEdramOffset ) { if( NULL == pPixelShader ) pPixelShader = m_pCopyTexturePS; // Make sure that the required shaders and objects exist assert( pPixelShader ); assert( pSrcTexture && pDstTexture ); XGTEXTURE_DESC SrcDesc; XGGetTextureDesc( pSrcTexture, 0, &SrcDesc ); // Create and set a render target D3DSURFACE_PARAMETERS surfaceParams = { 0 }; surfaceParams.Base = dwEdramOffset; PushRenderTarget( 0L, CreateRenderTarget( pDstTexture, &surfaceParams ) ); // Scale and copy the src texture g_pd3dDevice->SetPixelShader( pPixelShader ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); XGTEXTURE_DESC DstDesc; XGGetTextureDesc( pDstTexture, 0, &DstDesc ); DWORD ColorExpBias = 0; if( DstDesc.Format == D3DFMT_G16R16_SIGNED_INTEGER ) ColorExpBias = ( DWORD ) D3DRESOLVE_EXPONENTBIAS( 10 ); else if( DstDesc.Format == D3DFMT_A16B16G16R16_SIGNED_INTEGER ) ColorExpBias = ( DWORD ) D3DRESOLVE_EXPONENTBIAS( 10 ); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0 | ColorExpBias, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
/** * * Restores the Radial Menu's IDirect3DDevice9 resources. * * @author Jade Abbott * @return Void. * */ void CRadialMenu::OnDeviceReset() { if (m_pLine) { m_pLine->OnResetDevice(); } assert(m_uiStencilID == Utility::INVALID_ID); assert(m_uiRenderTargetID == Utility::INVALID_ID); CreateStencil(); CreateRenderTarget(); }
void Camera::SetRendermode(RenderMode mode) { int w = m_nScreenW; int h = m_nScreenH; Destroy(); if (mode == COLOR_DEPTH) CreateRenderTarget(w, h); CreateDepthTarget(w, h); CreateFramebuffer(); CreateRenderVBO(); UpdateRenderVBO(); m_eRenderMode = mode; }
//-------------------------------------------------------------------------------------- // Name: BuildMipMaps() // Desc: Generate mip maps from the base texture //-------------------------------------------------------------------------------------- VOID PostProcess::BuildMipMaps( LPDIRECT3DTEXTURE9 pTexture ) { // Make sure that the required shaders and objects exist assert( m_pCopyTexturePS ); assert( pTexture ); DWORD dwNumMipLevels = pTexture->GetLevelCount(); // Create and set a render target PushRenderTarget( 0L, CreateRenderTarget( pTexture ) ); // Scale and copy the src texture g_pd3dDevice->SetPixelShader( m_pCopyTexturePS ); g_pd3dDevice->SetTexture( 0, pTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); D3DVIEWPORT9 vp; g_pd3dDevice->GetViewport( &vp ); for( DWORD i = 1; i < dwNumMipLevels; i++ ) { XGTEXTURE_DESC Desc; XGGetTextureDesc( pTexture, i, &Desc ); vp.Width = Desc.Width; vp.Height = Desc.Height; g_pd3dDevice->SetViewport( &vp ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINMIPLEVEL, i - 1 ); // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); DWORD ColorExpBias = 0; if( Desc.Format == D3DFMT_G16R16_SIGNED_INTEGER ) ColorExpBias = (DWORD) D3DRESOLVE_EXPONENTBIAS(10); else if( Desc.Format == D3DFMT_A16B16G16R16_SIGNED_INTEGER ) ColorExpBias = (DWORD) D3DRESOLVE_EXPONENTBIAS(10); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0 | ColorExpBias, NULL, pTexture, NULL, i, 0, NULL, 1.0f, 0L, NULL ); } // Cleanup and return g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINMIPLEVEL, 13 ); PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
/** * * Resizes the Radial Menu for when the resolution changes. * * @author Jade Abbott * */ bool CRadialMenu::OnResolutionChange(unsigned int _uiMaximumDiameter, float _fDrawPositionX, float _fDrawPositionY) { m_uiDiameter = _uiMaximumDiameter < 512 ? _uiMaximumDiameter : 512; // Max diameter is >= 512 pixels. m_fDrawPositionX = _fDrawPositionX; m_fDrawPositionY = _fDrawPositionY; bool bSuccess = CreateStencil(); bSuccess = CreateRenderTarget() ? bSuccess : false; bSuccess = CreateFinalTexture() ? bSuccess : false; return CreateRadiance() ? bSuccess : false; }
GSTexture* GSDevice11::Resolve(GSTexture* t) { ASSERT(t != NULL && t->IsMSAA()); if(GSTexture* dst = CreateRenderTarget(t->GetWidth(), t->GetHeight(), false, t->GetFormat())) { dst->SetScale(t->GetScale()); m_ctx->ResolveSubresource(*(GSTexture11*)dst, 0, *(GSTexture11*)t, 0, (DXGI_FORMAT)t->GetFormat()); return dst; } return NULL; }
void PezInitialize() { const PezConfig cfg = PezGetConfig(); // Assign the vertex attributes to integer slots: GLuint* pAttr = (GLuint*) &Attr; for (int a = 0; a < sizeof(Attr) / sizeof(GLuint); a++) { *pAttr++ = a; } // Compile shaders Globals.SimpleProgram = LoadProgram("Simple.VS", 0, "Simple.FS"); Globals.QuadProgram = LoadProgram("Quad.VS", 0, "Quad.FS"); Globals.GridProgram = LoadProgram("Grid.VS", 0, "Grid.FS"); Globals.LitProgram = LoadProgram("Lit.VS", "Lit.GS", "Lit.FS"); // Set up viewport float fovy = 16 * TwoPi / 180; float aspect = (float) cfg.Width / cfg.Height; float zNear = 0.1, zFar = 300; Globals.Projection = M4MakePerspective(fovy, aspect, zNear, zFar); Point3 eye = {0, 1, 4}; Point3 target = {0, 0, 0}; Vector3 up = {0, 1, 0}; Globals.View = M4MakeLookAt(eye, target, up); // Create offscreen buffer: Globals.FboHandle = CreateRenderTarget(&Globals.FboTexture); glUseProgram(Globals.QuadProgram); Globals.QuadVao = CreateQuad(); Globals.Grid = CreateGrid(GridRows, GridCols); // Create geometry Globals.Cylinder = CreateCylinder(); // Misc Initialization Globals.Theta = 0; glClearColor(0.9, 0.9, 1.0, 1); glLineWidth(1.5); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1,1); }
//-------------------------------------------------------------------------------------- // Name: BloomTexture() // Desc: Bloom the pSrcTexture and place the result in pDstTexture //-------------------------------------------------------------------------------------- VOID PostProcess::BloomTexture( LPDIRECT3DTEXTURE9 pSrcTexture, BOOL bBloomAcrossWidth, LPDIRECT3DTEXTURE9 pDstTexture, FLOAT fSize, FLOAT fBrightness ) { // Make sure that the required shaders and objects exist assert( m_pBloomPS ); assert( pSrcTexture && pDstTexture ); XGTEXTURE_DESC SrcDesc; XGGetTextureDesc( pSrcTexture, 0, &SrcDesc ); // Create and set a render target PushRenderTarget( 0L, CreateRenderTarget( pDstTexture ) ); XMVECTOR avSampleOffsets[MAX_SAMPLES]; XMVECTOR avSampleWeights[MAX_SAMPLES]; if( bBloomAcrossWidth ) GetSampleOffsets_Bloom( SrcDesc.Width, SrcDesc.Height, 0.0f * XM_PIDIV2, avSampleOffsets, avSampleWeights, fSize, fBrightness ); else GetSampleOffsets_Bloom( SrcDesc.Width, SrcDesc.Height, 1.0f * XM_PIDIV2, avSampleOffsets, avSampleWeights, fSize, fBrightness ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleWeights, ( FLOAT* )avSampleWeights, MAX_SAMPLES ); g_pd3dDevice->SetPixelShader( m_pBloomPS ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
Camera::Camera(int w, int h, RenderMode mode, float fov, float aspect, float _near, float _far) { m_nScreenW = w; m_nScreenH = h; int u2 = 1; int v2 = 1; while(u2 < w) u2 *= 2; while(v2 < h) v2 *= 2; w = u2; h = v2; m_nNearPlane = _near; m_nFarPlane = _far; m_nIsDepthUniform = 0; m_nClipPlanesUniform = 0; m_nBlitShader = 0; m_nUvAttrib = 0; m_nMVPUniform = 0; m_nPositionAttrib = 0; m_nTextureUniform = 0; m_nScaleUniform = 0; m_nScreenSpaceVBO = 0; InitBlitShader(); m_pRenderTarget = 0; m_pDepthTarget = 0; m_nFramebufferId = 0; m_nVBO = 0; m_eRenderMode = mode; if (mode == COLOR_DEPTH) CreateRenderTarget(w, h); CreateDepthTarget(w, h); CreateFramebuffer(); CreateRenderVBO(); m_vecPosition = glm::vec3(0.0f, 0.0f, 0.0f); m_quatRotation = glm::quat(); m_matView = glm::mat4(); m_matProj = glm::perspective(fov, aspect, _near, _far); UpdateRenderVBO(); }
//-------------------------------------------------------------------------------------- // Name: Downsample2x2Texture() // Desc: Scale down pSrcTexture by 1/2 x 1/2 and place the result in pDstTexture //-------------------------------------------------------------------------------------- VOID PostProcess::Downsample2x2Texture( LPDIRECT3DTEXTURE9 pSrcTexture, LPDIRECT3DTEXTURE9 pDstTexture, DWORD dwEdramOffset ) { // Make sure that the required shaders and objects exist assert( m_pDownScale2x2PS ); assert( pSrcTexture && pDstTexture ); XGTEXTURE_DESC SrcDesc; XGGetTextureDesc( pSrcTexture, 0, &SrcDesc ); // Create and set a render target D3DSURFACE_PARAMETERS surfaceParams = { 0 }; surfaceParams.Base = dwEdramOffset; PushRenderTarget( 0L, CreateRenderTarget( pDstTexture, &surfaceParams ) ); XMVECTOR avSampleOffsets[MAX_SAMPLES]; GetSampleOffsets_DownScale2x2( SrcDesc.Width, SrcDesc.Height, avSampleOffsets ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); // Create an exact 1/2 x 1/2 copy of the source texture g_pd3dDevice->SetPixelShader( m_pDownScale2x2PS ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); // TODO: This should use border addressing with a black border! //m_pStarSourceTexture->Format.ClampX = GPUCLAMP_CLAMP_TO_BORDER; //m_pStarSourceTexture->Format.ClampY = GPUCLAMP_CLAMP_TO_BORDER; //m_pStarSourceTexture->Format.BorderColor = GPUBORDERCOLOR_ABGR_BLACK; //g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER ); //g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER ); // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }
//-------------------------------------------------------------------------------------- // Name: BrightPassFilterTexture() // Desc: Run the bright-pass filter on m_pScaledSceneTexture and place the result // in m_pBrightPassTexture //-------------------------------------------------------------------------------------- VOID PostProcess::BrightPassFilterTexture( LPDIRECT3DTEXTURE9 pSrcTexture, LPDIRECT3DTEXTURE9 pAdaptedLuminanceTexture, FLOAT fMiddleGrayKeyValue, LPDIRECT3DTEXTURE9 pDstTexture ) { // Make sure that the required shaders and objects exist assert( m_pBrightPassFilterPS ); assert( pSrcTexture && pDstTexture ); XGTEXTURE_DESC SrcDesc; XGGetTextureDesc( pSrcTexture, 0, &SrcDesc ); // Create and set a render target PushRenderTarget( 0L, CreateRenderTarget( pDstTexture ) ); // Get the offsets to be used within the GaussBlur5x5 pixel shader XMVECTOR avSampleOffsets[MAX_SAMPLES]; XMVECTOR avSampleWeights[MAX_SAMPLES]; GetSampleOffsets_GaussBlur5x5( SrcDesc.Width, SrcDesc.Height, avSampleOffsets, avSampleWeights ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleOffsets, ( FLOAT* )avSampleOffsets, MAX_SAMPLES ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_avSampleWeights, ( FLOAT* )avSampleWeights, MAX_SAMPLES ); g_pd3dDevice->SetPixelShaderConstantF( PSCONST_fMiddleGray, &fMiddleGrayKeyValue, 1 ); g_pd3dDevice->SetPixelShader( m_pBrightPassFilterPS ); g_pd3dDevice->SetTexture( 0, pSrcTexture ); g_pd3dDevice->SetTexture( 1, pAdaptedLuminanceTexture ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); g_pd3dDevice->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_POINT ); g_pd3dDevice->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); // Draw a fullscreen quad to sample the RT DrawFullScreenQuad(); g_pd3dDevice->Resolve( D3DRESOLVE_RENDERTARGET0, NULL, pDstTexture, NULL, 0, 0, NULL, 1.0f, 0L, NULL ); // Cleanup and return PopRenderTarget( 0L )->Release(); g_pd3dDevice->SetPixelShader( NULL ); }