[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
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 ...
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ìm kiếm theo từ khóa liên quan:
Javascript ASP.NET Tin học đại cương giáo trình Tin học đại cương bài giảng Tin học đại cương tài liệu Tin học đại cương lý thuyết Tin học đại cươngTài liệu liên quan:
-
Ứng dụng công cụ Quizizz thiết kế trò chơi học tập trong giảng dạy học phần tin học đại cương
12 trang 302 0 0 -
Tài liệu hướng dẫn thực hành Tin học đại cương - ĐH Bách Khoa Hà Nội
40 trang 258 0 0 -
Giáo trình Tin học đại cương part 7
19 trang 238 0 0 -
Giáo trình Tin học đại cương: Phần 1 - ĐH Kinh tế Quốc Dân
130 trang 157 0 0 -
Giáo trình Tin học đại cương (Tái bản năm 2020): Phần 1 - PGS.TS. Nguyễn Thị Thu Thủy (Chủ biên)
105 trang 142 0 0 -
Giáo trình Tin học đại cương: Phần 1 - Vi Hồng Thắm
90 trang 130 0 0 -
Hướng dẫn thực hành lập trình C trên Visual Studio
9 trang 128 0 0 -
Giáo trình Tin học đại cương: Phần 2 - Trần Đình Khang
118 trang 122 0 0 -
Quản trị người dùng trong Exchange 2007 bằng Powershell
9 trang 107 0 0 -
Đề cương học phần Tin học đại cương
23 trang 104 0 0