Danh mục

[C/C++] Đồ họa với OpenGL

Số trang: 6      Loại file: pdf      Dung lượng: 136.60 KB      Lượt xem: 10      Lượt tải: 0    
tailieu_vip

Hỗ trợ phí lưu trữ khi tải xuống: 1,000 VND Tải xuống file đầy đủ (6 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Lập trình 3D thì phổ biến nhất là dùng Direct3D hoặc OpenGL. Direct3D chỉ dùng được trên Windows, còn OpenGL đã là Industrial Standard từ khá lâu và có thể dùng được trên mọi OS. Nếu không bị bắt buộc phải dùng Direct3D, nên chọn OpenGL Để học OpenGL, có lẽ không thể thiếu cuốn OpenGL Programming Guide, còn gọi là The Red Book. Ngoài ra nên tham khảo tutorial trên NeHe 
Nội dung trích xuất từ tài liệu:
[C/C++] Đồ họa với OpenGL [C/C++] Đồ họa với OpenGLLập trình 3D thì phổ biến nhất là dùng Direct3D hoặc OpenGL. Direct3D chỉdùng được trên Windows, còn OpenGL đã là Industrial Standard t ừ khá lâu vàcó thể dùng được trên mọi OS. Nếu không bị bắt buộc phải dùng Direct3D, nênchọn OpenGLĐể học OpenGL, có lẽ không thể thiếu cuốn OpenGL Programming Guide, còngọi là The Red Book. Ngoài ra nên tham khảo tutorial trên NeHe Dùng thư viện cấp cao kiểu graphics hay game engine, nh ư Irrlicht vs  Ogre3D. Các này thì không cần biết OpenGL là gì. Dùng trực tiếp API do OpenGL cung cấp kèm hoặc không kèm thư viện  AUX. AUX là thư viện để tạo cửa sổ và quản lí input từ chuột, bàn phím. Không dùng AUX thì ta ph ải tự làm các việc trên. Nếu dùng AUX thì chương trình sẽ cross-platformCách viết chương trìnhBước 0 - Khai báo file header và library File header c ủa OpenGL thường được đặt riêng trong folder gl, nên khai: #include glgl.hChỉ với gl.h, đã có thể làm mọi thứ liên quan đến OpenGL. Tuy nhi ên để tiếtkiệm thời gian, có thể xài một số utility function. Những utility function n àynằm trong glu.h:#include glglu.hFunction của gl.h và glu.h có prefix tương ứng là gl và glu. Sau khi compile, đểlink thành chương trình .exe, cần khai file libraryNếu chỉ include gl.h, chỉ cần khai file opengl32.lib. Nếu x ài thêm glu.h thì khaithêm glu32.lib. Phần khai này tùy compiler/linker, nếu xài IDE của Visual C++6 thì vào Project -> Settings -> Link, rồi gõ file .lib thích hợp vàoObject/library modules.Fig2. Khai libraryMẹo: với Visual C++, có thể khai file library ngay trong source code, chú ýkhông có dấu chấm phẩy.#pragma comment(lib, opengl32.lib)#pragma comment(lib, glu32.lib) Bước 1 - Khởi tạo 1.1 - Lấy device context của windowTrong Windows, m ọi thứ đều là window. Muốn vẽ hình 3D lên window nào thìlấy device context của window đó. Để lấy device context của window n ào,phải có handle c ủa window đó.Ex:Chương trình Dialog based, xài MFC. Trên dialog đặt 1 cái Static Text có id l àIDC_STATIC_OPENGL, hình 3D sẽ được vẽ lên đây.Fig3. Static Text đã được kéo to raHWND m_StaticWnd; // globalHDC m_StaticDC; // globalm_StaticWnd = ::GetDlgItem(m_hWnd, IDC_STATIC_OPENGL); //m_hWnd là handle c ủa dialogm_StaticDC = ::GetDC(m_StaticWnd);Để phân biệt, khi xài API function trực tiếp, thêm dấu :: đằng trước. Bây giờkhi đã có device context c ủa Static Text. Vì device context này chỉ đượcrelease khi thoát chương trình, nên khai báo thêm m_StaticWnd vàm_StaticDC trong phần global.1.2 - Thay đổi pixel format của device contextDevice context c ần được thay đổi phù hợp để OpenGL có thể vẽ lên đó.PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0, 0, 0, 0, 0, 0,0, 0,0, 0, 0, 0, 0,32,0,0,PFD_MAIN_PLANE,0,0, 0, 0};int PixelFormat = ::ChoosePixelFormat(m_StaticDC, &pfd);::SetPixelFormat(m_StaticDC, PixelFormat, &pfd);Các tham số có thể tham khảo trong MSDN. PFD_DOUBLEBUFFER- Khi có tham số này, OpenGL không vẽ trực tiếp lên device context, mà sẽ vẽlên buffer. Muốn hiện buffer này lên màn hình, sẽ swap buffer này với devicecontext, xem bước 2. Nếu OpenGL vẽ trực tiếp lên device context, tốc độ sẽ rấtchậm, vì vẽ được cái gì thì sẽ phải update lên màn hình cái đấy ngay.- PFD_SUPPORT_GDI và PFD_DOUBLEBUFFER là mutually exclusive,nên các thao tác GDI trên device context này sẽ không có tác dụng.1.3 - Tạo renderring context cho OpenGLBước này báo cho OpenGL biết sẽ vẽ lên device context nào.HGLRC m_OpenGLRC; // globalm_OpenGLRC = wglCreateContext(m_StaticDC);wglMakeCurrent(m_StaticDC, m_OpenGLRC);Muốn OpenGL vẽ lên device context nào, wglMakeCurrent đến device contextđó. Rendering context này chỉ được delete khi thoát ch ương trình, nên khai báotrong phần global.1.4 - Setup trạng thái cho OpenGLĐiều chỉnh góc nhìn, màu nền,.. như sau:// xóa đen windowglClearColor(0, 0, 0, 0);glClear(GL_COLOR_BUFFER_BIT);glFlush();// chỉnh viewportRECT rect;::GetWindowRect(m_StaticWnd, &rect);int width = rect.right - rect.left;int height = rect.bottom - rect.top;glViewport(0, 0, width, height);// chỉnh góc nhìndouble aspect = (double)width/height;glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60, aspect, 0.1, 1000);// chọn rendering modeglMatrixMode(GL_MODELVIEW);glLoadIdentity();glDrawBuffer(GL_BACK);glEnable(GL_DEPTH_TEST);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);Để hiểu rõ, tham khảo thêm MSDN. Nếu size của window bị thay đổi, nên gọilại phần chỉnh viewport và chỉnh góc nhìn. Bước 2 - Update window Chỉ nên update window khi chương trình ở trong trạng thái idle. Xem ghi chúvề idle ở c uối bài viết này.Render(); // gọi RenderSwapBuffers(m_StaticDC); // swap buffer v ới dev ...

Tài liệu được xem nhiều: