On tämmöinen koodi ja haluaisin tietää mihin tässä nämä funktiot pistetään.
// Includes #include <windows.h> #include <gl/gl.h> // Function Declarations 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 ); // WinMain 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 { } } // shutdown OpenGL DisableOpenGL( hWnd, hDC, hRC ); // destroy the window explicitly DestroyWindow( hWnd ); return msg.wParam; } // Window Procedure LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch ( message ) { case WM_CREATE: void gluBeginCurve(nobj); void gluNurbsCurve(nobj, . . ., GL_MAP1_TEXTURE_COORD_2); gluNurbsCurve(nobj, . . ., GL_MAP1_NORMAL); gluNurbsCurve(nobj, . . ., GL_MAP1_VERTEX_4); void gluEndCurve(nobj); 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 ); } } // Enable OpenGL 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 ); } // Disable OpenGL VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC ) { wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); }
Kiitos jo etukäteen :).
Siis mitkä funktiot? Oma päälooppisi? Tuolla näkyy WM_CREATE:ssa olevan jotain turhaa NURBS hommaa joten ne nyt varmaan voit ainakin ottaa heti pois.
// 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 { // GL funktiokutsusi tulevat ilmeisesti tänne // muista myös swapata bufferit etc } }
OK. Ja sitten niitä funktioita :).
1. Mikä funktio piirtää viivan kohdasta x kohtaa y ja esimerkkiä.
2. Mikä funktio tyhjentää ruudun takaisin mustaksi ja siitä esimerkki.
Kun nuo saan tietooni niin koodivinkkeihin pitäisi lisääntyä yksi vinkki :). Kiitos jo etukäteen.
Ps. Olen OpenGL aloittelia, mutta perusteet ovat kutakuinkin hallussa.
No nyt löytyi näitä funktioita, mutta miksi
GL_LINES(-1, -3);
antaa virheilmoituksen
71 kokeilutc++p.cpp `1' cannot be used as a function
GL_LINES ei ole funktio vaan vakio, jolla voidaan määrittää käytettävä primitiivi:
glBegin(GL_LINES); glVertex2s(-1,-3); glVertex2s( 0, 0); glEnd();
Ja silleen.
Jaajaa. Vai niin se asia on. No täytyypä totutella hieman tähän OpenGl:ään :).
Muokkausaika on näyttänyt menevän umpeen, joten uusi viesti. Miksi seuraava vakio (:D) ei tee mitään?
glBegin(GL_LINES); glVertex2s(-1,-3); glVertex2s( 0, 0); glEnd();
Vastauksia kiitos.
toi piirtoalue on ikkunan ulkopuolella? viiva alkaa paikasta -1, -3 ja päättyy 0, 0 eli sitä ei näy. Säätele nollapisteen paikkaa niin viiva alkaa näkyä.
Ehkäpä olisi aiheellista opetella ensin hieman 3D:n perusteita, ja sitten viakka ihan sitä C:tä / C++:aa. En todellakaan suosittele lisäämään OpenGL vinkkejä parin päivän koodauskokemuksen jälkeen.
Ääh. Älä viitti fawkz. Tuota C++ console applicationia olen vääntänyt ja säätänyt noin 2-3 vuotta jaihan hyvin se menee.
Lisäät koodiisi tän funktion:
void RenderScene(void) { // Ei laitekonteksia! if (!hDC) return; // Putsataan tausta glClear(GL_COLOR_BUFFER_BIT); // Piirretään viiva renderöintikonteksiin glBegin(GL_LINES); glVertex2s( 0, 0); glVertex2s(100,100); glEnd(); // Piirretään se näytölle SwapBuffers(hDC); }
Ja ohjelman ihan alkuun globaali muuttuja
HDC hDC;
(voit sitten poistaa sen HDC - muuttujan WinMain():ista). Sitten tohon fawkzin esittelemään "GL-funktiokutsusi tulevat tänne" kohtaan kirjoitat että
RenderScene();
WndProc():iin lisäät vielä:
case WM_ERASEBKGND: RenderScene(); return 0;
Niin tyhjennyskäskyn tullessa (esimerkiksi kun ikkuna viedään näytön 'ulkopuolelle') se piirtää scenen uudestaan eikä tyhjennä vaan ikkunaa rumasti.
Nurbsit hiiteen sieltä WM_CREATE:n alta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.