Resultat 1 till 2 av 2

Ämne: Minimal c++ kod för att experimentera i OpenGL

  1. #1
    Administrator Hildenborgs avatar
    Reg.datum
    maj 2012
    Ort
    Göteborg
    Inlägg
    59
    Blog Entries
    21

    C++ Minimal c++ kod för att experimentera i OpenGL

    Jag måste erkänna att det är rätt sällan som jag skriver några större projekt på min fritid.
    För det allra mesta, så testar jag bara några enklare ide'er.
    Vanligtvis så behöver jag då bara ett fönster med OpenGL i sig, och jag bryr mig inte ett dugg om all den här felhanteringen eller all kompabillitet etc. etc. som man måste tänka på när man utvecklar en faktisk produkt. All den koden är egentligen bara i vägen för mig när jag experimenterar.
    Så jag har skrivit en lite minimalistisk kodsnutt som slänger upp ett fönster i Windows, och ser till att OpenGL kommer igång i det.
    För att demonstrera så ritar jag även ut en färgad triangel i det.
    Utifall någon annan har nytta utav en enkel experimentkod, så har ni den här nedan.



    Kod:
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <GL/GL.H>
    
    // Microsoft hack to link to libraries from code. Don't do this in your final projects...
    #pragma comment(lib, "OpenGL32")
    
    // Size of window. Observe that this is not the size of the client area.
    #define WINDOW_WIDTH    800
    #define WINDOW_HEIGHT   600
    
    // Window name. We will also use it as window class name.
    WCHAR windowName[] = L"Minimal Win32 Hello Triangle";
    
    // WIndows message callback, we just use it to post the quit message
    LRESULT CALLBACK MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	if((short)message == (short)WM_DESTROY)
    	{
    		PostQuitMessage(0);
    	}
    	else
    	{
    		return(DefWindowProc(hWnd, message, wParam, lParam));
    	}
    	return(0);
    }
    
    // main function
    int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
    {
    	// Local variables
    	WNDCLASSEX wc;
    	HDC hdc; 
    	MSG msg;
    	HWND hwnd;
    	PIXELFORMATDESCRIPTOR pfd;
    
    	// Init windows class
    	memset(&wc, 0, sizeof(wc));
    	wc.lpfnWndProc = MsgProc;
    	wc.style = CS_CLASSDC;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.hInstance = GetModuleHandle(NULL);
    	wc.lpszClassName = windowName;
    
    	// Register windows class
    	RegisterClassEx(&wc);
    
    	// Create window
    	hwnd = CreateWindow(
    		windowName,
    		windowName,
    		WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE,
    		CW_USEDEFAULT, CW_USEDEFAULT,
    		WINDOW_WIDTH, WINDOW_HEIGHT,
    		NULL,
    		NULL,
    		wc.hInstance,
    		NULL
    		);
    
    	// Get device context
    	hdc = GetDC(hwnd);
    
    	// Init pixel format descriptor (describes what kind of frame buffer we want)
    	memset(&pfd, 0, sizeof(pfd));
    	pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    	pfd.nVersion = 1;
    	pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    	pfd.iPixelType = PFD_TYPE_RGBA;
    	pfd.cColorBits = 32;
    	pfd.cDepthBits = 24;
    	pfd.cStencilBits = 8;
    	pfd.iLayerType = PFD_MAIN_PLANE;
    
    	// Ask for a buffer of the format we described, and set it to the device context
    	SetPixelFormat(hdc, ChoosePixelFormat(hdc, &pfd), &pfd);
    
    	// Create OpenGL context and make it the current one.
    	wglMakeCurrent(hdc, wglCreateContext(hdc));
    
    	// Init the projection.
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    
    	// Main loop
    	while(true)
    	{
    		if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
    		{
    			if (msg.message == WM_QUIT)
    			{
    				break;
    			}
    			DispatchMessage(&msg);
    		}
    		else
    		{
    			// OpenGL Hello triangle code
    			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    			glBegin(GL_TRIANGLES);
    			glColor3f(1.0f, 0.0f, 0.0f);
    			glVertex2f(0.0f, 0.5f);
    			glColor3f(0.0f, 1.0f, 0.0f);
    			glVertex2f(0.5f, -0.5f);
    			glColor3f(0.0f, 0.0f, 1.0f);
    			glVertex2f(-0.5f, -0.5f);
    			glEnd();
    			SwapBuffers(hdc);
    		}
    	}
    
    	// Cleanup
    	wglMakeCurrent(NULL, NULL);
    	ReleaseDC(hwnd, hdc);
    
    	return(0);
    }
    Kan posta upp lite varianter senare också. Om man t.ex. vill ha en exakt storlek på klientarean eller om man vill rita pixlar till en bitmap... Det är just sådana vanliga situationer jag använder det till.
    Senast redigerat av Mattias Gustavsson den 2012-05-28 klockan 22:32.

  2. #2
    Borde inte denna trad fungera battre som artikel?

Taggar för det här ämnet

Bokmärken

Behörigheter för att posta

  • Du får inte posta nya ämnen
  • Du får inte posta svar
  • Du får inte posta bifogade filer
  • Du får inte redigera dina inlägg
  •