ModelScene* ModelImporter_Impl::Load(const char* path) { Assimp::Importer importer; const aiScene* scene = importer.ReadFile(path, aiProcess_CalcTangentSpace | aiProcess_Triangulate | aiProcess_JoinIdenticalVertices | aiProcess_SortByPType); if (!scene) { std::string error = importer.GetErrorString(); return NULL; } std::string strPath = std::string(path); std::stringstream fileName; char ch; for (uint32_t i = 0; i < strPath.length(); ++i) { ch = strPath.at(i); if (ch == '/' || ch == '\\') fileName.str(""); else if (ch == '.') break; else fileName << ch; } ModelScene* myScene = _LoadScene(fileName.str().c_str(), scene); _CalculateModelCenter(myScene); return myScene; }
bool scRenderSystem::Initialize( HWND hwnd, int width, int height ) { mHwnd = hwnd; mWindowWidth = width; mWindowHeight = height; HRESULT hr; // 创建设备 D3D_DRIVER_TYPE driverTypes[] = { D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_SOFTWARE }; unsigned int totalDriverTypes = ARRAYSIZE( driverTypes ); D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0 }; unsigned int totalFeatureLevels = ARRAYSIZE( featureLevels ); DXGI_SWAP_CHAIN_DESC swapChainDesc; ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) ); swapChainDesc.BufferCount = 1; swapChainDesc.BufferDesc.Width = width; swapChainDesc.BufferDesc.Height = height; swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.OutputWindow = hwnd; swapChainDesc.Windowed = true; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; for (unsigned int i = 0; i < totalDriverTypes; ++i) { // 尝试创建 hr = D3D11CreateDeviceAndSwapChain(0, driverTypes[i], 0, 0, featureLevels, totalFeatureLevels, D3D11_SDK_VERSION, &swapChainDesc, &mSwapChain, &mDevice, &mFeatureLevel, &mContext); if(SUCCEEDED(hr)) { mDriverType = driverTypes[i]; break; } } if(FAILED(hr)) { scErrMsg("Failed to create the Direct3D device!"); return false; } // 创建backbuffer ID3D11Texture2D* backBufferTexture; hr = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferTexture); if(FAILED(hr)) { scErrMsg("Failed to get the swap chain back buffer!"); return false; } hr = mDevice->CreateRenderTargetView(backBufferTexture, 0, &mBackBuffer); if(backBufferTexture) backBufferTexture->Release(); if(FAILED(hr)) { scErrMsg("Failed to create back buffer!"); return false; } // 创建depthbuffer D3D11_TEXTURE2D_DESC depthTexDesc; ZeroMemory(&depthTexDesc, sizeof(depthTexDesc)); depthTexDesc.Width = width; depthTexDesc.Height = height; depthTexDesc.MipLevels = 1; depthTexDesc.ArraySize = 1; depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; depthTexDesc.SampleDesc.Count = 1; depthTexDesc.SampleDesc.Quality = 0; depthTexDesc.Usage = D3D11_USAGE_DEFAULT; depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthTexDesc.CPUAccessFlags = 0; depthTexDesc.MiscFlags = 0; ID3D11Texture2D* depthTexture; hr = mDevice->CreateTexture2D(&depthTexDesc, NULL, &depthTexture); if(FAILED(hr)) { scErrMsg("Failed to create the depth texture!"); return false; } D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; ZeroMemory(&descDSV, sizeof(descDSV)); descDSV.Format = depthTexDesc.Format; descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; descDSV.Texture2D.MipSlice = 0; hr = mDevice->CreateDepthStencilView(depthTexture, &descDSV, &mDepthBuffer); if(FAILED(hr)) { scErrMsg("Failed to create the depth stencil target view!"); return false; } // 设置render target mContext->OMSetRenderTargets(1, &mBackBuffer, mDepthBuffer); // 设置viewport /*D3D11_VIEWPORT viewport; viewport.Width = static_cast<float>(width); viewport.Height = static_cast<float>(height); viewport.MinDepth = 0.0f; viewport.MaxDepth = 1.0f; viewport.TopLeftX = 0.0f; viewport.TopLeftY = 0.0f; mContext->RSSetViewports(1, &viewport);*/ // 初始化各种manager mTextureManager.Initialize(mDevice); mTextureManager.LoadArchive("../../res/texture.txt"); mTextureManager.LoadAll(); mMeshManager.Initialize(mDevice); mMeshManager.LoadArchive("../../res/mesh.txt"); mMeshManager.LoadAll(); mVertexShaderManager.Initialize(mDevice); mVertexShaderManager.LoadArchive("../../res/vshader.txt"); //mVertexShaderManager.LoadAll(); mVertexShaderManager.CreateDefaultShader(); mPixelShaderManager.Initialize(mDevice); mPixelShaderManager.LoadArchive("../../res/vshader.txt"); //mPixelShaderManager.LoadAll(); mPixelShaderManager.CreateDefaultShader(); // sampler D3D11_SAMPLER_DESC samplerDesc; ZeroMemory(&samplerDesc, sizeof(samplerDesc)); samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; hr = mDevice->CreateSamplerState(&samplerDesc, &mSampler); if (FAILED(hr)) { scErrMsg("Faileed to create color map sampler state!"); return false; } // 初始化完成 mInitialized = true; return _LoadScene(); }