Yritän tehdä pientä opengl "editoria" jolla vois piirrellä yksinkertaisia modelleja. No kuitenkin, teen windows apilla ikkunan ja haluaisin että noin 2/3 sen koosta olisi openGL:än käytössä, eli tuolle alueelle piirtyisi kuva, ja sitten lopussa 1/3 ikkunasta olisi normaaleja winApi controlleja yms. Mutta kuinka saan openGL:än käyttämän alueen rajattua silleen jotenkin?
Kenties tässä pitäis muuttaa jotain:
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 );
}
Tuo on suoraan dev-c :n mukana tulleesta openGL esimerkistä kopioitu, koska käytän sitä pohjana ohjelmalleni..
Kenties tässä pitäis muuttaa jotain:
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 );
}
Tuo on suoraan dev-c :n mukana tulleesta openGL esimerkistä kopioitu, koska käytän sitä pohjana ohjelmalleni..
Vastaukset 1
Vanhimmat
Siitä on niin pitkä aika kun olen käyttänyt OpenGL suoraan että en enää muista miten se oikein meni. Jos ymmärsin oikein olit huolissasi kuvan rajoituksista. Jos avaat kuvan oman pane:niin (ikkunaan tms (CView, CWindow, CDialog..) sinun ei tarvitse välittää rajoituksista (turhaa niitä pikselejä tarkistaa kahteen kertaan).
Ellet tee jotain erittäin nopeaa tietokonepeliä niin OpenGL (tai DirectX) käyttö suoraan on aika työlästä. OpenGL:ille löytyy kirjastoja (esim. OpenInventor, myös nimellä Coin, yms) joka helpottaa ja nopeuttaa koodaamisen.
Jos teet 3-D editoria tarvitset ainakin kaksi ikkunaa (monesti käytetään kolme tarkkuuden takia, tai neljä jossa viimeisessä esitetään 3D-kappale vapaasti valittavasta kulmasta). Yhdessä ikkunassa pystyt ainoastaan esittämään kaksi koordinaattia (ulottuvuutta) esim x ja y. Jos haluat editoida kolmatta ulottuvuutta (syvyys, z-suunta) tarvitset toisen ikkunan. (nyt puhun tavallaan palturia, jos kierrät 3D-projektion 2D-ikkunassa niin toki yksi ikkuna riittää, tämä voi kuitenkin olla melko hidasta puuhaa).
Ongelma tulee kun editori pitäisi 2D-projektion avulla löytää vastaava piste 3D-avaruudesta. Varsinkin jos käytät pyöriä käyriä (NURBS, Non-Uniform Bezier Splines (käyriä) tai Non-Uniform Bezier Surfaces (pintoja)). Extrapolointi käyrän kontrollipisteisiin (siis 2-D ulottavuudessa) voi olla tuskastuttavan hidasta!
Yksi "poppaskonsti" on tämä: Älä välitä (alkuvaiheessa) tarkuudesta. Tee taulukko mihen etukäteen lasket sini- ja cosini-arvot asteen tms. tarkkuudella (kuvaputken resoluutio on niin pieni että tätä ei huomata. Operaatio x=taulukko[(int)aste]; on paljon nopeampi kuin x=cos(aste);
Sinä kysyit minulta jotain, nyt minä kysyn sinulta jotain: Miksi sinä teet tällaista? Raskasta matematiikkaa, tetrapakin esittämistä 3-D-muodossa ei tuo rahaa? 3-D-grafiikkaa on ainoastaan järkevä kun sitä tehdään tyhmille ihmisille (nuoriso= "peli", liikejohto="visualisointi"). Ihan kuin omat aivot eivät toimisi!
Työn iloa!