Forum » Programiranje » OpenGL problem
OpenGL problem
fx ::
#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; 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 = "OpenGL"; RegisterClass (&wc); hWnd = CreateWindow ( "OpenGL", "OpenGL 3D3kotnik", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 640, 640, NULL, NULL, hInstance, NULL); EnableOpenGL (hWnd, &hDC, &hRC); while (!bQuit) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { bQuit = TRUE; } else { TranslateMessage (&msg); DispatchMessage (&msg); } } else { glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glRotatef (theta, 0.0f, 1.0f, 1.0f); glBegin (GL_TRIANGLES); glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f); //B glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f); //B glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); // glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //D glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 1.48f, 0.25f); //D glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f); //B glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C glEnd (); glPopMatrix (); SwapBuffers (hDC); theta += 0.1f; Sleep (1); } } DisableOpenGL (hWnd, hDC, hRC); 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; *hDC = GetDC (hWnd); 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); *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }Koda lepo deluje in sem , samo nevem kaj je narobe, ker ko se mi 3D 3kotnik vrti se mi naredi še en trikotnik, potem to ven izgleda tako, kot da bi bil trikotnik zgoraj odrezan, tega ne želim imeti. Sem mogoče naredil začetniško napako v OpenGL.
lp
Senitel ::
Moraš spucat še Z-buffer...
glClearDepth (1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth (1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Nerdor ::
Kako pa ta program prevedem pod Visual Studio.Net 2003 !? Se da ta program prevesti pod konzolo!? Sem googlal, pa nikakor nisem dobil pravega odgovora kako prevesti ta program, ki uporablja gl.h. Tako pod VS.Net kot Konzolo! Prevede mi, samo mi ne zgradi opengl1.exe. Kako se pripravi tak program, da se prevede!?
PS: lastnik sem ATi Radeon-a 8500. Ali moram kakšen ATi OpenGL SDK inštalirati!?=
PS: lastnik sem ATi Radeon-a 8500. Ali moram kakšen ATi OpenGL SDK inštalirati!?=
... for lifetime!
Vesoljc ::
ccc...
glej, ena cela sticky tema je o c++ povezavah, notri je tudi grafika zajeta...
glej, ena cela sticky tema je o c++ povezavah, notri je tudi grafika zajeta...
Abnormal behavior of abnormal brain makes me normal...
fx ::
Senitel kdaj moram z-buffer spucat, pred ali po izvedmi ali vmes med izvajanjem programa?
Link do mojega programa
lp
Link do mojega programa
lp
Senitel ::
Ja za vsak frame moraš spucat Z-buffer...
zamenjaš z:
In ker nisem čisto ziher ali OpenGL že sam od sebe vklopi Z-buffer, dodaj še
v del kode, ki inicializira OpenGL
glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT);
zamenjaš z:
glClearDepth (1.0); glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
In ker nisem čisto ziher ali OpenGL že sam od sebe vklopi Z-buffer, dodaj še
glEnable(GL_DEPTH_TEST);
v del kode, ki inicializira OpenGL
Nerdor ::
Za vse tiste, ki tole spremljate in se sprašujete, kako za se tole prevede, sem izvohal po 1h googlanja tole spletno stran http://www.students.uwosh.edu/~bradfj23/visualstudio/.
Ja koda se prevede. Vendar nisem čisto upošteval nasvete iz omenjenega linka. Ubistvu sem sam dodal : "Project" -> "ImePrograma Properties" -> "Linker -> Input" in tam pri prvi postavki "Additional Dependencies" vpisal "opengl32.lib glu32.lib". Tako da ni bilo potrebno downloadat GLUT 3.7.6 in vse nastavljati po tistem tutorialu.
Ja koda se prevede. Vendar nisem čisto upošteval nasvete iz omenjenega linka. Ubistvu sem sam dodal : "Project" -> "ImePrograma Properties" -> "Linker -> Input" in tam pri prvi postavki "Additional Dependencies" vpisal "opengl32.lib glu32.lib". Tako da ni bilo potrebno downloadat GLUT 3.7.6 in vse nastavljati po tistem tutorialu.
... for lifetime!
fx ::
Senitel nič se ne spremeni, razen če dodam glEnable(GL_DEPTH_TEST); potem se mi pojavijo deke črne črte.
lp
lp
Gundolf ::
Matrika je tabela 16 doublov ali floatov. V njej so elementi napisani po stolpcih. Potem pa jo loadaš z ukazom tipa glLoadMatrixd (to govorim totalno na pamet). Nimam pa pojma kaj misliš z deljlenjem matrike na delce.
A ti je že kdo predlagal da si poglej tutoriale na NeHe?
A ti je že kdo predlagal da si poglej tutoriale na NeHe?
fx ::
Ker če pogledaš ta del kode:
Kar je med -1 in 1 je vidno na monitroju, kar je nad ena se ne vidi, to se vidi lepo takoj ko zaženem program in jaz želim, da bi se v celoti to videlo?
> A ti je že kdo predlagal da si poglej tutoriale na NeHe?
Ni, ker sem si jo sam prej poiska, samo kako naj med 114 ukazi vem kateri je pravi?
glColor3f (1.0f, 0.0f, 0.0f); glVertex3f (-0.87f, 0.0f, -0.5f); //A glColor3f (0.0f, 1.0f, 0.0f); glVertex3f (0.87f, 0.0f, -0.5f); //B glColor3f (0.0f, 0.0f, 1.0f); glVertex3f (0.0f, 0.0f, 1.5f); //C
Kar je med -1 in 1 je vidno na monitroju, kar je nad ena se ne vidi, to se vidi lepo takoj ko zaženem program in jaz želim, da bi se v celoti to videlo?
> A ti je že kdo predlagal da si poglej tutoriale na NeHe?
Ni, ker sem si jo sam prej poiska, samo kako naj med 114 ukazi vem kateri je pravi?
Senitel ::
V tistem tvojem programu niti ne nastavljaš kamere... V bistvu imaš tudi nekaj clipinga z near cliping planeom... Nevem glih točno kako ima OpenGL to po defaultu urejeno...
Zdej to da je od -1 in 1 vidno na monitorju drastično zavisi od tega kolk daleč imaš ti objekt. Če ga imaš zelo blizu, bo morda že -1 do 1 izven zaslona, če imaš objekt zelo daleč še -1000, 1000 ne bo izven zaslona.
Koliko imaš znanja o linearni algebri (matrike & stuff)?
Zdej to da je od -1 in 1 vidno na monitorju drastično zavisi od tega kolk daleč imaš ti objekt. Če ga imaš zelo blizu, bo morda že -1 do 1 izven zaslona, če imaš objekt zelo daleč še -1000, 1000 ne bo izven zaslona.
Koliko imaš znanja o linearni algebri (matrike & stuff)?
Gundolf ::
Zato si pa poglej NeHe tutoriale (na levi imaš menujček z dostopom do 48 kratkih tutorialov). Ker samo poznavanje ukazov ne bodo nič pomagalo. Rabiš poznati principe (npr. 'kamera').
Nerdor ::
Stari recept, za screen saver je bil takšen. Napraviš program, ki bo uporabil celoten zaslon, pri tem bo deloval pri isti resoluciji in frekvenci, kot je prej. (torej tvoj program ne sme spremeniti nič v zvezi monitorja. Sicer lahko napraviš, samo boš uporabnika "prestrašil" ko bo začel menjavati resolucijo.)
Ubistvu navaden *.exe, ki se fizično preimenuje v *.src in se ga skopira v c:\windows\tam-kjer-so-ostrali-scr\*.scr
No možno se je še pozanimati, katero okno v Control Panel prikazuje screensaverje in kako med seboj komunicirajo (kako izmenjujejo msg). In to je to!
Ubistvu navaden *.exe, ki se fizično preimenuje v *.src in se ga skopira v c:\windows\tam-kjer-so-ostrali-scr\*.scr
No možno se je še pozanimati, katero okno v Control Panel prikazuje screensaverje in kako med seboj komunicirajo (kako izmenjujejo msg). In to je to!
... for lifetime!
user4683 ::
AAAaaaaaaaa!!
Že 526212x so te usmerili k NeHejevim tutorialom... Noben tukaj ni plačan, da bi bil tvoj osebni tutor, glede na tvoje spraševanje pa zgleda kot da hočeš ravno to.
Brat NeHejeve tutoriale, ko pa prideš do vsaj 10., se pa ponovno oglasi z vprašanji.
Že 526212x so te usmerili k NeHejevim tutorialom... Noben tukaj ni plačan, da bi bil tvoj osebni tutor, glede na tvoje spraševanje pa zgleda kot da hočeš ravno to.
Brat NeHejeve tutoriale, ko pa prideš do vsaj 10., se pa ponovno oglasi z vprašanji.
fx ::
Samo nekaj me zanima, kako pa OpenGL dela z miško, ker bi rad naredil ko premakneš miško greš ven iz programa. Tega pa ni na NeHe, ker sem gledal.
Lp
Lp
Gundolf ::
Tudi to je na NeHe. Čeprav OpenGL nima nobene povezave z miško. OpenGL ti le skrbi za grafiko. Tako da za miško moraš poskrbet sam in sicer v okolju v katerem delaš (Win, X, GLut, SDL, ...)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | tekstura [c++ opengl]Oddelek: Programiranje | 911 (696) | matej94 |
» | [c++]OpenGL izris kvadrataOddelek: Programiranje | 1270 (1130) | Mavrik |
» | C++ programirane v Open GL oz. Direct xOddelek: Programiranje | 2976 (2247) | Vesoljc |
» | OpenGL orr v ansi cOddelek: Programiranje | 1637 (1425) | igor12 |