PasiastyWiewiór Posted June 21, 2011 Report Share Posted June 21, 2011 Witam. Od niedawna zacząłem swoją przygodę z OpenGL i już w pierwszym rozdziale książki ,,Grafika, Fizyka, Metody numeryczne. Symulacje fizyczne związane z wizualizacją 3D napotkałem problem. Problemem tym jest to, że zamiast białego trójkąta na czarnym tle uzyskuję samo czarne tło. W OpenGL jestem kompletnie zielony. Jedyne co znam to C++ i dzięki temu z klasami i pętlami w tym kodzie nie miałem problemu, ale mam problem z renderingiem plik .cpp C++ #include "OknoGL.h" LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return okno.WndProc(hWnd, message, wParam,lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { POINT polozenieOkna={100,100}; POINT rozmiarOkna={150,100}; if(!okno.Init(hInstance,polozenieOkna,rozmiarOkna)) { MessageBox(NULL,"Inicjacja okna nie powiodła się","Aplikacja OpenGL",MB_OK | MB_ICONERROR); return EXIT_FAILURE; } else return okno.Run(); } bool COkno::Init(HINSTANCE uchwytAplikacji,POINT polozenieOkna,POINT rozmiarOkna) { char nazwaOkna[]="Aplikacja windows, okno widmo"; WNDCLASSEX wc; wc.cbSize=sizeof(wc); wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC; //styl okna wc.lpfnWndProc= (WNDPROC)::WndProc; // procedura okna wc.cbClsExtra= 0; // dodatkowe bajty zarezerwoana za klasą okna wc.cbWndExtra= 0; // dodatkowe bajty zarezerwowane za instancją okna wc.hInstance= uchwytAplikacji; // instancja aplikacji wc.hIcon= NULL; //uchwyt ikony wc.hIconSm= NULL; //uchwyt ikony wc.hCursor= LoadCursor(NULL, IDC_ARROW); // uchwyt kursora wc.hbrBackground= NULL; // uchwyt pędzla tła wc.lpszMenuName= NULL; // nazwa menu wc.lpszClassName= nazwaOkna; // nazwa klasy okna //Rejstracja klasy okna if(RegisterClassEx(&wc)==0) return false; //Tworzenie okna uchwytOkna = CreateWindow( nazwaOkna, nazwaOkna, WS_OVERLAPPEDWINDOW, polozenieOkna.x, polozenieOkna.y, rozmiarOkna.x,rozmiarOkna.y, NULL, NULL, uchwytAplikacji, NULL); if(uchwytOkna==NULL) return false; //Pokazanie i aktualizacja okna ShowWindow(uchwytOkna,SW_SHOW); UpdateWindow(uchwytOkna); return true; }; WPARAM COkno::Run() { //Pętla główna - obsługa komunikatów MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } bool COknoGL::UstalFormatPikseli (HDC uchwytDC) const { PIXELFORMATDESCRIPTOR opis; //opisFormatuPixeli ZeroMemory(&opis, sizeof(opis)); //w oknie podwojne buforowanie opis.dwFlags=PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; opis.iPixelType=PFD_TYPE_RGBA; opis.cColorBits=32; opis.cDepthBits=16; opis.iLayerType=PFD_MAIN_PLANE; int formatPikseli=ChoosePixelFormat(uchwytDC,&opis); if (formatPikseli ==0) return false; if (!SetPixelFormat(uchwytDC, formatPikseli, &opis)) return false; return true; } bool COknoGL::InitWGL(HWND uchwytOkna) { uchwytDC = ::GetDC(uchwytOkna); //Utworzenie kontekstu rederowania i uczynienie go aktywnym if (!UstalFormatPikseli(uchwytDC)) return false; uchwytRC = wglCreateContext(uchwytDC); if (uchwytRC==NULL) return false; if (!wglMakeCurrent(uchwytDC, uchwytRC)) return false; return true; } void COknoGL::UsunWGL() { wglMakeCurrent(NULL,NULL); wglDeleteContext(uchwytRC); ::ReleaseDC(uchwytOkna,uchwytDC); } bool COknoGL::UstawienieSceny(bool rzutowanieIzometryczne) //wartość domyślna =false { //okno OpenGL = wewnętrzne formy (domyślnie) glViewport(0,0,szerokoscObszaruUzytkownika,wysokoscObszaruUzytkownika); //ustawienie punktu projekcji glMatrixMode(GL_PROJECTION);//przełączenie na macierz projekcji glLoadIdentity(); //left,right,bottom,top,znear,zfar (clipping) float wsp=wysokoscObszaruUzytkownika/(float)szerokoscObszaruUzytkownika; if(!rzutowanieIzometryczne) //left,right,bottom,top,znear,zfar (clipping) //mnożenie macierzy rzutowanie przez macierz perspektywy - ustalenie frustum glFrustum(-0.1, 0.1, wsp*-0.1, wsp*0.1, 0.0, 100.0); else glOrtho(-3, 3, wsp*-3, wsp*3, 0.3, 100.0); glMatrixMode(GL_MODELVIEW); //powrót do macierzy widoku modelu glEnable(GL_DEPTH_TEST); //z-buffer aktywny = ukrywanie niewidocznych powierzchni return true; } void COknoGL::RysujScene() { const float x0=1.0; const float y0=1.0; const float z0=1.0; //Przygotowanie bufora glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // czyści bufory glLoadIdentity(); //macierzy model-widok = macierz jednostkowa glTranslatef(0.0, 0.0, -10.0); // odsunięcie sceny o 10 //Rysowanie trójkąta glBegin(GL_TRIANGLES); //ustalenie trzech wierzchołków (werteksów (x,y,z)) //(0,0,z) jest mniej więcej na środku ekranu glColor3f(1,1,0); glVertex3f(-x0, -y0, 0); //dolny lewy glColor3f(1,1,1); glVertex3f(x0, -y0, 0); //dolny prawy glColor3f(0,1,0); glVertex3f(0, y0, 0); //górny //koniec rysowania figury glEnd(); //Z bufora na ekran SwapBuffers(uchwytDC); } Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.