tommy8 Temat założony przez niniejszego użytkownika |
[OpenGL] Wyświetlanie brył przestrzennych » 2012-07-12 13:17:56 Mam poniższy kod (lekko przerobiony z szablonu projektu w Code::Blocks): #include <windows.h> #include <gl/glu.h>
LRESULT CALLBACK WindowProc( HWND, UINT, WPARAM, LPARAM ); void EnableOpenGL( HWND hwnd, HDC *, HGLRC * ); void DisableOpenGL( HWND, HDC, HGLRC );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; HWND hwnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f; wcex.cbSize = sizeof( WNDCLASSEX ); wcex.style = CS_OWNDC; wcex.lpfnWndProc = WindowProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wcex.hCursor = LoadCursor( NULL, IDC_ARROW ); wcex.hbrBackground =( HBRUSH ) GetStockObject( BLACK_BRUSH ); wcex.lpszMenuName = NULL; wcex.lpszClassName = "GLSample"; wcex.hIconSm = LoadIcon( NULL, IDI_APPLICATION );; if( !RegisterClassEx( & wcex ) ) return 0; hwnd = CreateWindowEx( 0, "GLSample", "OpenGL Sample", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL ); ShowWindow( hwnd, nCmdShow ); 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, 1, 1, 0 ); glBegin( GL_TRIANGLES ); glColor3f( 0, 1, 1 ); glVertex3f( - 0.5, 0, 0.5 ); glVertex3f( 0.5, 0, 0.5 ); glVertex3f( 0, 1, 0 ); glColor3f( 0, 1, 0 ); glVertex3f( - 0.5, 0, - 0.5 ); glVertex3f( 0.5, 0, - 0.5 ); glVertex3f( 0, 1, 0 ); glColor3f( 0, 0, 1 ); glVertex3f( - 0.5, 0, - 0.5 ); glVertex3f( - 0.5, 0, 0.5 ); glVertex3f( 0, 1, 0 ); glColor3f( 1, 1, 0 ); glVertex3f( 0.5, 0, 0.5 ); glVertex3f( 0.5, 0, - 0.5 ); glVertex3f( 0, 1, 0 ); glEnd(); glBegin( GL_POLYGON ); glColor3f( 1, 1, 1 ); glVertex3f( 0.5, 0, 0.5 ); glVertex3f( 0.5, 0, - 0.5 ); glVertex3f( - 0.5, 0, - 0.5 ); glVertex3f( - 0.5, 0, 0.5 ); glEnd(); glPopMatrix(); SwapBuffers( hDC ); theta += 1.0f; Sleep( 1 ); } } DisableOpenGL( hwnd, hDC, hRC ); DestroyWindow( hwnd ); return msg.wParam; }
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_CLOSE: PostQuitMessage( 0 ); break; case WM_DESTROY: return 0; case WM_KEYDOWN: { switch( wParam ) { case VK_ESCAPE: PostQuitMessage( 0 ); break; } } break; default: return DefWindowProc( hwnd, uMsg, wParam, lParam ); } return 0; }
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 ); } Chodzi mi o to, żeby w obracającym się ostrosłupie lepiej widoczne były ścianki znajdujące się "bliżej widza", bo jak na razie zawsze niezależnie od położenia widoczne są te "później opisane" w kodzie. Skompilujcie i zobaczcie o co biega. |