I saw Lazy Foo using OpenGL & GLSL in SDL, but I want to use DirectX 11 & HLSL in SDL.
Is there a way to do this, and how?
I saw Lazy Foo using OpenGL & GLSL in SDL, but I want to use DirectX 11 & HLSL in SDL.
Is there a way to do this, and how?
This old post but might help others.
After you initialize and create window with SDL successfully, get the HWND from SDL_SysWMinfo as shown below,
SDL_SysWMinfo wmInfo; SDL_VERSION(&wmInfo.version); SDL_GetWindowWMInfo(window, &wmInfo); HWND hwnd = wmInfo.info.win.window; After this you can proceed normally and on how you would create and initialize a D3D11 device and swap chain. When you fill in the DXGI_SWAP_CHAIN_DESC you can set the OutputWindow field to the HWND obtained above.
swapChainDesc.OutputWindow = hwnd; Below is a sample code that will create D3D11 device, swap chain and clears the background to a color.
//Using SDL and standard IO #include <SDL.h> #include <stdio.h> #include <SDL_syswm.h> #include<dxgi.h> #include<d3d11.h> #include<d3dcompiler.h> #pragma comment(lib, "dxgi") #pragma comment(lib, "d3d11") #pragma comment(lib, "D3DCompiler") //Screen dimension constants const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; int main(int argc, char* args[]) { //The window we'll be rendering to SDL_Window* window = NULL; //The surface contained by the window SDL_Surface* screenSurface = NULL; //D3D11 Stuff..... D3D_FEATURE_LEVEL featureLevelsRequested = D3D_FEATURE_LEVEL_11_0; D3D_FEATURE_LEVEL featureLevelsSupported; ID3D11Device* pD3D11Dev = NULL; ID3D11DeviceContext* pD3D11DevContext = NULL; IDXGISwapChain *pSwapChain = NULL; ID3D11Texture2D *pRenderTargetResource = NULL; ID3D11RenderTargetView *pBackBuffer = NULL; //Initialize SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); } else { //Create window window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (window == NULL) { printf("Window could not be created! SDL_Error: %s\n", SDL_GetError()); } else { // Get Window HWND SDL_SysWMinfo wmInfo; SDL_VERSION(&wmInfo.version); SDL_GetWindowWMInfo(window, &wmInfo); HWND hwnd = wmInfo.info.win.window; //Swap Chain Desc DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; swapChainDesc.BufferCount = 1; swapChainDesc.BufferDesc.Width = SCREEN_WIDTH; swapChainDesc.BufferDesc.Height = SCREEN_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.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.Windowed = TRUE; //Create device and swap chain HRESULT d3dHR = D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, &featureLevelsRequested, 1, D3D11_SDK_VERSION, &swapChainDesc, &pSwapChain, &pD3D11Dev, &featureLevelsSupported, &pD3D11DevContext ); if (d3dHR != S_OK) { return 0; } // Create ID3D11Texture2D resource as a buffer to draw stuff on pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pRenderTargetResource); if (pRenderTargetResource != NULL) { pD3D11Dev->CreateRenderTargetView(pRenderTargetResource, NULL, &pBackBuffer); pRenderTargetResource->Release(); pD3D11DevContext->OMSetRenderTargets(1, &pBackBuffer, NULL); } //Viewport setup D3D11_VIEWPORT viewPort = {}; viewPort.TopLeftX = 0; viewPort.TopLeftY = 0; viewPort.Width = SCREEN_WIDTH; viewPort.Height = SCREEN_HEIGHT; pD3D11DevContext->RSSetViewports(1, &viewPort); //Get window surface screenSurface = SDL_GetWindowSurface(window); //Fill the surface white SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); //Update the surface SDL_UpdateWindowSurface(window); //Hack to get window to stay up SDL_Event e; bool quit = false; while (quit == false) { //D3D Render stuff FLOAT backgroundColor[4] = { 0.0f, 0.2f, 0.2f, 1.0f }; pD3D11DevContext->ClearRenderTargetView(pBackBuffer, backgroundColor); pSwapChain->Present(1, 0); // Flip/Swap the back and front buffer while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } } } } } //D3D Cleanup pSwapChain->Release(); pBackBuffer->Release(); pD3D11Dev->Release(); pD3D11DevContext->Release(); //Destroy window SDL_DestroyWindow(window); //Quit SDL subsystems SDL_Quit(); return 0; }