Ik ben net een beetje aan het knutselen met OpenGL, een beetje uitzoeken hoe alles werkt voor een iets groter project, zegmaar. Nu heb ik een vrij simpel ding geschreven dat een quad laat zien met een texture (die ik met GDI+ maak):
Het venster wordt als volgt opgezet:
Dit lijkt allemaal goed te gaan. Dan worden er wat OpenGL-dingen ingesteld en wordt de texture geladen:
(de GLPainter-class zorgt voor wglMakeCurrent). Ook dit gaat allemaal goed en het plaatje wordt ook daadwerkelijk geladen. Dan de paint-functie:
Nou is het hele translate/rotate-gebeuren misschien niet zo interessant (werkt prima), maar het probleem is dat als ik textures helemaal uitschakel (geen glBindTexture of glEnable) het vierkantje snel genoeg roteert. Schakel ik de texture in (die ongeveer 16x16 pixels is, maar de quad op het scherm is ongeveer 200x200) dan wordt het zo traag dat ik nog net aan de 1 FPS kom. Dat lijkt me erg traag, zelfs met een Radeon X1400 Mobility in deze laptop... de CPU-usage stijgt naar 50% (een hele core) dus dat lijkt me niet helemaal goed... iemand enig idee waarom OpenGL zo traag gaat (hij lijkt wel software rendering te doen ofzo?) Ik kom er met geen mogelijkheid (geen profiler hier, maar met de debugger zie ik niks en alle overige instellingen lijken prima) achter waar de tijd in gaat zitten...
Het verschil in snelheid tussen de 16x16 texture en een texture van 400x300 is trouwens niet zo heel groot...
Het venster wordt als volgt opgezet:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| HDC dc = GetDC(_wnd); // set pixel format PIXELFORMATDESCRIPTOR pfd; ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_GENERIC_ACCELERATED; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; int iFormat = ChoosePixelFormat(dc,&pfd); SetPixelFormat(dc,iFormat,&pfd); _rc = wglCreateContext(dc); ReleaseDC(_wnd, dc); |
Dit lijkt allemaal goed te gaan. Dan worden er wat OpenGL-dingen ingesteld en wordt de texture geladen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| GLPainter p(_rc, _wnd); glMatrixMode(GL_PROJECTION); //changes the current matrix to the projection matrix gluPerspective(90.0f,1.0f, 1.0,100.0f); glMatrixMode(GL_MODELVIEW_MATRIX); // make a nice, large texture Gdiplus::Bitmap bmp(L"D:\\Projecten\\tjshow\\Release\\icons\\run.png", TRUE); glGenTextures(32,&(_textures[0])); glBindTexture(GL_TEXTURE_2D, _textures[0]); Gdiplus::BitmapData data; Gdiplus::Rect rc(0,0,bmp.GetWidth(), bmp.GetHeight()); if(bmp.LockBits(&rc, Gdiplus::ImageLockModeRead, PixelFormat32bppRGB, &data)!=Gdiplus::Ok) { MessageBox(0L, L"Texture error", L"", MB_OK); } glTexImage2D(GL_TEXTURE_2D, 0, 3, bmp.GetWidth(), bmp.GetHeight(), 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, data.Scan0); bmp.UnlockBits(&data); // texture settings glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering glPushMatrix(); glScalef(1.0f, -1.0f, 1.0f); // so the origin is left-top glTranslatef(-1.0f, -1.0f, -1.0f); glScalef(2.0f, 2.0f, 1.0f); |
(de GLPainter-class zorgt voor wglMakeCurrent). Ook dit gaat allemaal goed en het plaatje wordt ook daadwerkelijk geladen. Dan de paint-functie:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| static float theta = 0.1f; glPushMatrix(); theta += 0.1f; float x = 0.5f; float y = 0.5f; float w = 0.5f; float h = 0.5f; glTranslatef(1.5f*x, 1.5f*y, 0.0f); glRotatef( theta, 0.0f, 0.0f, 1.0f ); glTranslatef(-0.5f*x, -0.5f*y, 0.0f); glScalef(w,h,1.0f); glEnable(GL_TEXTURE_2D); glBegin( GL_QUADS ); glTexCoord2f(0.0f, 0.0f); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); glVertex3f( 0.1f, 0.1f, 0.0f ); glTexCoord2f(1.0f, 0.0f); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); glVertex3f( 0.9f, 0.1f, 0.0f ); glTexCoord2f(1.0f, 1.0f); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f); glVertex3f( 0.9f, 0.9f, 0.0f ); glTexCoord2f(0.0f, 1.0f); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); glVertex3f( 0.1f, 0.9f, 0.0f ); glEnd(); glDisable(GL_TEXTURE_2D); glPopMatrix(); |
Nou is het hele translate/rotate-gebeuren misschien niet zo interessant (werkt prima), maar het probleem is dat als ik textures helemaal uitschakel (geen glBindTexture of glEnable) het vierkantje snel genoeg roteert. Schakel ik de texture in (die ongeveer 16x16 pixels is, maar de quad op het scherm is ongeveer 200x200) dan wordt het zo traag dat ik nog net aan de 1 FPS kom. Dat lijkt me erg traag, zelfs met een Radeon X1400 Mobility in deze laptop... de CPU-usage stijgt naar 50% (een hele core) dus dat lijkt me niet helemaal goed... iemand enig idee waarom OpenGL zo traag gaat (hij lijkt wel software rendering te doen ofzo?) Ik kom er met geen mogelijkheid (geen profiler hier, maar met de debugger zie ik niks en alle overige instellingen lijken prima) achter waar de tijd in gaat zitten...
Het verschil in snelheid tussen de 16x16 texture en een texture van 400x300 is trouwens niet zo heel groot...