OpenGL in WinAPI einbinden?
-
Ich habe die Vorlage für OpenGL in Dev-C++ benutzt um OpenGL zu programmieren. Das ist ganz anders wie ich vorher mit OpenGL progrmamiert habe, aber ich möchte so programmieren, da man dort auch mit Win32 programmieren kann. Aber ich würde gedrne wissen was da die einzelnen Zeilen Code bedeuten hauptsächlich, die für die Funktionen EnableOpenGL und DisableOpenGL.
Kan mir jemand sagen was die einzelnen Anweisungen bedeuten?#include <windows.h> #include <gl/gl.h> LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f; /* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample"; RegisterClass (&wc); /* create main window */ hWnd = CreateWindow ( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 256, 256, NULL, NULL, hInstance, NULL); /* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC); /* program main loop */ while (!bQuit) { /* check for messages */ if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; } else { TranslateMessage (&msg); DispatchMessage (&msg); } } else { /* OpenGL animation code goes here */ glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glRotatef (theta, 0.0f, 0.0f, 1.0f); glBegin (GL_TRIANGLES); glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f); glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.5f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f); glEnd (); glPopMatrix (); SwapBuffers (hDC); theta += 1.0f; Sleep (1); } } /* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC); /* destroy the window explicitly */ DestroyWindow (hWnd); return msg.wParam; } LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; case WM_CLOSE: PostQuitMessage (0); return 0; case WM_DESTROY: return 0; case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: PostQuitMessage(0); return 0; } return 0; default: return DefWindowProc (hWnd, message, wParam, lParam); } } void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat; /* get the device context (DC) */ *hDC = GetDC (hWnd); /* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd); /* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }wenn ich weiss wie man das macht das da so ne scrollbar neben dem code ist damit er niocht so viel platz einnimmt mache ich das.
-
Hast du die Funktionen und Strukturen schon in der msdn nachgeschlagen?
-
ich hab es versucht aber ich chek des da nicht, wo ich suchen muss. ich hab da unter suchen einige sachen eingegeben, aber er hat sie nicht gefundne.
-
http://nehe.gamedev.net/
ist zwar schon etwas in die tage gekommen, aber immer noch der perfekte start
für angehende opengl freakz
deine frage sollte schon in den ersten 2 tutorials beantwortet werden
-
http://msdn2.microsoft.com/en-us/library/ms537556(VS.85).aspx
http://msdn2.microsoft.com/en-us/library/ms537559(VS.85).aspxVia PIXELFORMATDESCRIPTOR legt man fest, welche Eigenschaften man denn gerne haben möchte.
Jedes Device hat nun eine Liste von unterstützen Pixel-Formaten.
Mit ChoosePixelFormat() versucht Windows anhand deines PIXELFORMATDESCRIPTOR aus der Liste das passendste Format rauszusuchen. Zurück wird dir der Index aus der Liste gegeben.Mittels SetPixelFormat() setzt du dann für ein Device das Pixelformat anhand des Indexes, welches dir ChoosePixelFormat() gegeben hat.
wglCreateContext() erzeugt einen OpenGL-Rendering Context (quasi sowas wie ein HDC nur eben für OpenGL) für ein bestimmtes Device.
Mit wglMakeCurrent() sagst du quasi: Alle OpenGL-Befehle die in dem aktuellen Thread aufgerufen werden beziehen sich auf den bei dieser Funktion angegebenen OpenGL-Rendering-Context.
-
@ sothis_: ja dort habe ich angefangen aber ich wollte ohne glut programmieren und muit win32 und opengl.
@ geeky: danke. jetzt habe ich wenigstens ne Vorstellung davon was der da macht. ist es möglich, das programm etwas anders zu schreiben. ich arbeite daran aber es macht nnicht so wie ich will.
-
tweenki schrieb:
@ sothis_: ja dort habe ich angefangen aber ich wollte ohne glut programmieren und muit win32 und opengl.
also meines erachtens sind sämtliche tutorials glut frei. der einzigste
nachteil wäre, dass sie manchmal noch glaux benutzen. aber dieser code
lässt sich auch leicht ersetzen (was im übrigen auch beschrieben ist).
-
was ist glaux?
ich fang jetzt dann einfach mal an und probier das ganze aus.