Quan điểm lập trình

40 306 0
Tài liệu đã được kiểm tra trùng lặp
Quan điểm lập trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Quan điểm lập trình

3Giới thiệuThế là bạn nghĩ rằng lập trình là một thế giới vô cùng thú vị, và bạn muốn tham gia vào thế giới ấy? Trước khi bạn bắt đầu, điều duy nhất mà tôi muốn khuyên là: nếu bạn thực sự yêu thích lập trình thì đó rõ ràng là công việc tốt nhất mà bạn có thể có được. Ngược lại, nếu bạn chỉ cảm thấy thích, hay không quan tâm lắm đến lập trình, thì đó rõ ràng là công việc tồi tệ nhất của bạn. Bởi vì bạn đang gia nhập vào một thế giới mà sự cạnh tranh luôn là nỗi ám ảnh không thể tránh khỏi. Phát triển phần mềm gần như là một cuộc đua tranh. Trong đó, cuộc sống của bạn là một con đường và bạn phải chạy càng nhanh càng tốt, không cần biết dưới chân có gì, cho đến khi gặp đồng bằng hoặc là đụng phải vách đá cheo leo. Nếu bạn sẩy chân, mọi thứ kết thúc, và đó hoàn toàn là lỗi của bạn. Nghe có vẻ hơi ghê gớm đúng không? Nhưng đừng để những điều đó làm bạn nản lòng. Tôi chỉ không muốn vẽ nên một viễn cảnh tươi đẹp, nơi có những cánh đồng xanh ngút ngàn và những đám mây lững lờ trôi trên nền trời xanh thẳm. Thực tế là có thể chỉ vài phút sau đó trời sẽ mưa và bạn thì chẳng mang theo dù. Thế nhưng, chính những điều không chắc chắn, những thách thức và áp lực sẽ làm cho cuộc sống trở nên đầy hứng thú.Bạn vẫn còn đọc đến đây ư? Rất tốt, thế có nghĩa là bạn hoàn toàn nghiêm túc về điều này. Bây giờ điều tôi sẽ nói với bạn là một bản phác thảo về những gì đang chờ đợi bạn trong thế giới lập trình, chúng ta sẽ nói một ít về kỹ thuật và cả những niềm vui của thế giới ấy.Bạn cần gì để trở thành một lập trình viên? Tôi không nghĩ rằng có một vài yêu cầu khó khăn nào đó khiến bạn không thể trở thành lập trình viên, tôi chỉ đơn giản nghĩ rằng bất cứ ai có một ít (hay rất nhiều) mong muốn đều có thể trở thành lập trình viên. Vấn đề chỉ là bạn dành ra bao nhiêu thời gian. Điều đó có nghĩa là tôi nghĩ có nhiều quan niệm sai lầm về những kỹ năng cần có để trở thành lập trình viên. Trước tiên, bạn không cần phải thật xuất sắc trong môn Toán, bạn chỉ cần có khả năng hiểu được những điều cơ bản. Dĩ nhiên là có những ngoại lệ, nếu bạn có hứng thú trong lĩnh vực đồ họa hay lập trình game thì một kiến thức Toán vững vàng sẽ giúp bạn rất nhiều. Một quan niệm sai lầm khác là bạn cần phải là thiên tài logic. Nói chung, điều đó không phải là bắt buộc, dĩ nhiên tư duy logic càng tốt thì càng dễ dàng hơn khi tiếp cận thế giới lập trình. Vậy thì kỹ năng nào là cần thiết? Bị thúc đẩy bởi những thách thức là yếu tố quan trọng nhất. Đơn giản là vì bạn đang tham gia vào một trò chơi trong đó thách thức xuất hiện trong mọi ngõ ngách. Một điều quan trọng khác là phải không ngừng theo đuổi mục tiêu, nhưng vẫn phải luôn uyển chuyển để không đuổi theo một cách mù quáng những mục tiêu xa vời.Còn trường học thì sao?Trường học là nơi tuyệt vời để học mọi thứ ngoại trừ công nghệ. Đừng cho là tôi sai, tôi không nói rằng tôi nghĩ trường học là không quan trọng. Ngược lại, tôi nghĩ trường học là rất quan trọng, nhưng không phải để học lập trình. Những Như vậy là bạn muốn trở thành một lập trình viên?Việt ThanhTổng hợp từ InternetKhông bao giờ sợ phải bắt đầu.Tôi sẽ không viết hai lần cùng một đoạn mã giống nhau.Khi phát triển phần mềm, hãy nghĩ đến tương lai.Viết mã càng ít bao nhiêu, mắc lỗi càng ít bấy nhiêu.Bạn sẽ không bao giờ trở thành một lập trình viên giỏi nếu chỉ tập luyện 2 giờ mỗi ngày.Tất cả các công việc đều có phần thú vị và phần buồn chán, không có ngoại lệ.Kẻ thù số một của các lập trình viên là gì? Kiêu căng.Lập trình viên sử dụng hầu hết thời gian của mình vào việc sửa lỗi. Chương trình càng dễ đọc bao nhiêu càng tiết kiệm thời gian bấy nhiêu.Trường học khiến các bạn tin rằng chương trình của bạn chỉ cần thỏa mãn một mình bạn là đủ. Điều này hoàn toàn sai lầm. Chương trình phải thỏa mãn khách hàng và các lập trình viên khác. 4gì bạn nên tập trung thật sự ở trường là học cách để làm việc với những người khác trong một đề án. Cũng như học cách những người xung quanh giải quyết vấn đề và cách thức giải quyết của họ khác cách của bạn ở chỗ nào. Trường học thường bắt bạn phải làm những thứ có thể bạn không thích. Chẳng hạn, tôi nhớ lúc tôi học môn “Thiết kế trình biên dịch”, tôi tự nhủ: “Thật là mất thời gian một cách vô ích, tôi chẳng bao giờ cần phải thiết kế trình biên dịch làm gì”. Nhưng, điều tôi đã học được là làm thế nào để giải quyết những vấn đề hoàn toàn khác nhau, và kiến thức này giúp tôi làm được nhiều việc khác.Một trong những thuận lợi bạn có được từ trường học là bạn có thể gặp gỡ bạn bè có cùng chí hướng và có thể sau này trở thành đồng nghiệp của bạn. Ngành công nghiệp phần mềm ở nhiều khía cạnh rất giống với ngành công nghiệp điện ảnh, khi có ai đó bị lôi cuốn vào một đề án đầy tham vọng, họ thường mời bạn bè cùng hợp tác. Nếu bạn không biết họ từ trước, bạn sẽ không thể mời (hay thuê), và trong nhiều trường hợp, trường học chính là nơi bạn có thể tìm được những người có cùng sở thích. Một khía cạnh khác không thể bỏ qua là trường học không chỉ dạy về kỹ thuật mà còn dạy về lịch sử, về tâm lý,… Và trong khi những thứ ấy có vẻ không liên quan trực tiếp đến lập trình, bạn có thể sẽ rất ngạc nhiên nếu biết rằng đó cũng là một trong những nguồn cảm hứng mà tôi từng có. Tôi nên bắt đầu từ đâu?Trước tiên, tôi khuyên là bạn nên cân nhắc cẩn thận trước khi có một quyết định quan trọng. Như tôi đã nói, thế giới lập trình có thể rất lý thú, nhưng cũng đầy gian nan. Do đó, đừng bao giờ nhảy bổ vào mà không suy nghĩ kỹ. Việc đầu tiên cần làm dĩ nhiên là tìm mua một cuốn sách dạy lập trình. Nhưng có quá nhiều sách và quá nhiều ngôn ngữ. Tôi khuyên bạn nên chọn một trong các ngôn ngữ sau: C, C++, Visual Basic, Pascal (Delphi) hay Java. Khoan hãy nghĩ đến những ngôn ngữ khác, bởi vì chúng hoặc là quá phức tạp cho người mới bắt đầu hoặc là quá đơn giản để có thể đưa bạn vào thế giới lập trình. Nhưng dù thế nào thì bạn cũng nên chọn một ngôn ngữ vào thời điểm này. Những ngôn ngữ này rất giống nhau, và vô cùng mạnh mẽ. Hầu như mọi ứng dụng thương mại đều có thể được viết bởi một trong những ngôn ngữ trên. Phương pháp của tôi là chọn 2 quyển sách cho mỗi ngôn ngữ đã nêu ở trên. Đọc sơ qua trước, và chú ý các ví dụ, mã nguồn trong đó. Sau khi đã đọc sơ qua tất cả các quyển sách đã chọn, hãy chọn quyển sách gây cho bạn nhiều hứng thú nhất. Và ngôn ngữ mà quyển sách đó đề cập chính là ngôn ngữ bạn nên học đầu tiên. Bây giờ hãy chọn thêm vài quyển sách về ngôn ngữ đó, mỗi quyển, bạn hãy đọc một phần chương đầu tiên, bạn có cảm thấy quan tâm đến nó không? Nếu không, hãy bỏ quyển sách ấy và chọn một quyển khác; nếu có, hãy lật đến giữa quyển sách và một phần chương mà bạn bắt gặp, vẫn cảm thấy quan tâm đến quyển sách ấy đúng không? Tốt, đó là quyển sách có thể bạn sẽ chọn. Đừng cố hiểu nó viết cái gì, chỉ cần tìm hiểu xem nó có mang đến cho bạn sự quan tâm về ngôn ngữ đó hay không. Tiếp tục phương pháp này cho đến khi không còn quyển sách nào cả, bạn có thể tìm được quyển sách gây cho bạn nhiều hứng thú nhất để học ngôn ngữ đó.Những công cụ cần thiếtHãy nhìn thẳng vào vấn đề, chọn đúng công cụ sẽ làm cho công việc trở nên dễ dàng hơn. Điều này càng chính xác hơn trong lĩnh vực phát triển phần mềm. Có thể Microsoft đã tạo ra môi trường phát triển tốt nhất, Microsoft Developers Studio. Do đó, nếu bạn dùng C/C++, Visual Basic,… thì có lẽ đây sẽ là thứ bạn cần. Tuy nhiên, vẫn có nhiều công cụ thay thế miễn phí khác cho những ngôn ngữ này. Bạn có thể kiểm tra thử nếu thích.Một công cụ khác cũng rất quan trọng, đó là trình soạn thảo mã lệnh (code editor). DevStudio có một trình soạn thảo mã lệnh tích hợp sẵn, và đó là một trong những lý do khiến nhiều người dùng nó. Cá nhân tôi không thích bị ràng buộc bởi một môi trường phát triển nào. Do đó, tôi thích dùng công cụ soạn thảo MultiEdit (http://www.analogx.com/cgi-bin/cgirdir.exe?http://www.multiedit.com/). Tôi đã sử dụng nó trong nhiều năm. Và tôi rất tự hào khuyên những ai muốn tìm một công cụ thay thế cho DevStudio hãy dùng nó.Hãy là người lạc quanTôi từng nghe người ta nói rằng kẻ lạc quan nhất trên thế giới chính là nhà phát triển phần mềm. Trong suy nghĩ của họ, không có phần mềm nào là không thể viết được. Một ví dụ nhỏ, bạn hãy vào thử một site download phần mềm nào đó mà xem. Có hàng trăm hàng ngàn phần mềm bao gồm mọi lĩnh vực. Làm thế nào mà người ta có thể sáng tạo ra từng ấy phần mềm. Chúng nhiều và tốt đến nỗi bạn không thể nghĩ ra nên sáng tạo thêm phần mềm nào. Thế nhưng từng ngày từng giờ, các nhà 5phát triển phần mềm luôn sáng tạo và cho ra nhiều phần mềm mới hơn nữa, những phần mềm mà đã có thời người ta cho là không thể tạo ra được. Dù sao thì lạc quan mấy cũng phải có giới hạn. Mấu chốt của vấn đề là họ không nhìn mọi thứ một cách tổng thể, mà ở từng phần cụ thể. Ở một chừng mực nào đó, có thể xem đấy là đặc trưng của ngành thiết kế phần mềm, chia dự án ra thành những phần nhỏ và giải quyết từng phần. Nếu bạn không phân phối thời gian hợp lý, bạn sẽ không thể nào hoàn thành công việc. Khi bạn bắt đầu viết chương trình “thực sự” đầu tiên (nghĩa là chương trình có thể thực hiện được một công việc nào đó cần thiết cho mọi người, không phải cho riêng bạn), phải chắc chắn rằng bạn dành đủ thời gian để vạch ra kế hoạch về những việc bạn định làm, thứ tự thực hiện, và kết quả cuối cùng là gì. Nếu bạn làm điều này, bạn sẽ thấy mọi thứ trở nên dễ dàng hơn và có thể hoàn thành nhanh hơn là bạn nghĩ.Hãy làm việc theo nhóm!Nếu bạn dự định trở thành một lập trình viên đơn độc, hãy suy nghĩ lại. 99,9% các dự án đòi hỏi phải làm việc theo nhóm. Và do đó, bạn cần phải có kinh nghiệm làm việc theo nhóm, phối hợp với những người khác trong một dự án. Một khi bạn đã hoàn thành những dự án nhỏ của riêng mình, đó là lúc bắt đầu tìm cách tham dự vào một dự án có nhiều người tham gia. Đó có thể là một game, một bản demo, hay bất cứ thứ gì. Chỉ cần đó là dự án làm bạn quan tâm. Có nhiều các để tìm dự án, bạn có thể gia nhập vào những dự án đã có, tìm kiếm những nhóm vừa mới thành lập và xin gia nhập, hay thậm chí tự lập một dự án và mời người khác cùng cộng tác. Điều quan trọng nhất là bạn phải học cách làm việc cùng với những người khác để thực hiện mục tiêu chung. Những thứ nên đọc!Đọc sách là nguyên tắc cơ bản… Và điều này càng chính xác trong ngành phát triển phần mềm. Nếu bạn là người không thích đọc sách, có lẽ bạn nên chọn một công việc khác. Bởi vì đọc sách chính là chìa khóa để củng cố và hiện thực hóa những tiềm năng của bạn. Bạn có thể tự hỏi vì sao tôi có thể viết nhiều phần mềm trong thời gian ngắn như thế? Có 3 lý do chính: kinh nghiệm, những đồng nghiệp tài năng mà tôi luôn hài lòng khi được làm việc chung và cuối cùng là những quyển sách tôi đã đọc. Tôi không thể giúp bạn có được kinh nghiệm và những bạn đồng nghiệp giỏi, nhưng tôi có thể giới thiệu cho bạn những quyển sách hay:Code CompleteĐây là quyển sách cần thiết cho mọi nhà phát triển phần mềm, bất kể họ đang dùng ngôn ngữ lập trình nào. Nó bao gồm nhiều bài thực hành và nhiều kỹ thuật liên quan đến phong cách viết mã.ISBN: 1-55615-484-4Rapid Development Quyển sách này hướng đến việc lập kế hoạch cho một dự án, tập trung vào những lỗi tiềm ẩn có thể mắc phải,… Đây là quyển sách cho bạn biết thế giới thực sự của ngành phát triển phần mềm.ISBN: 1-55615-900-5Dynamics of Software DevelopmentQuyển sách này có một hướng tiếp cận khác, tập trung vào việc làm việc theo nhóm và động lực của việc lập trình. Đây là điều thỉnh thoảng bị xem nhẹ, và hậu quả có thể được thấy trong nhiều dự án bị thất bại.ISBN: 1-55615-823-8The Mythical Man-Month Đây thực sự là một quyển sách nên đọc. Dù rằng nó đã được viết cách đây hơn 20 năm, thế nhưng vẫn có nhiều điều có thể áp dụng.ISBN: 0-201-83595-9Programming Windows Nếu bạn có ý định lập trình trên Windows (bằng C hay C++), bạn cần phải mua quyển sách này. Theo tôi đây là quyển sách dạy lập trình Windows tốt nhất.ISBN: 1-57231-995-XThe Art of Ware Tôi là một người hâm mộ cuồng nhiệt Tôn Tử, do đó tôi rất thích thú khi đọc quyển sách này. Đây là một quyển sách có phong cách viết rất lôi cuốn, với những bài học trong binh pháp Tôn Tử được vận dụng vào ngành phát triển phần mềm.ISBN: 1-55851-396-5Ghi chú: các bạn có thể tìm những quyển sách trên bằng cách tìm kiếm trên Google hay những site bán sách. Ở Việt Nam, bạn có thể vào site http://www.sachtinhoc.com hay http://www.sachtuhoc.com và nhờ họ mua giúp.Tổng kếtHy vọng tôi đã nêu được một số điều cần thiết để trở thành một lập trình viên, không phải về mặt kỹ thuật mà là về mặt tư duy. Cá nhân tôi cho rằng lập trình là một công việc đầy hứng thú. Không có gì vui hơn khi nhìn thấy ai đó đang sử dụng phần mềm do bạn viết để làm cho cuộc sống của họ tốt hơn, dù chỉ là một phần nào đấy. Do đó, nếu bạn quyết định theo đuổi ngành phát triển phần mềm, tôi xin chúc bạn may mắn và hy vọng một ngày nào đó tôi sẽ có dịp download phần mềm do bạn viết để sử dụng. 6Bài này nhằm hướng dẫn bạn cách thiết lập một cửa sổ OpenGL. Cửa sổ này có thể ở chế độ bình thường (window) hay toàn màn hình (fullscreen), có kích cỡ (size), độ phân giải (resolution) và độ sâu màu (color depth) tùy thích. Đoạn mã rất dễ điều chỉnh do đó có thể dùng lại trong tất cả các chương trình OpenGL khác.Tôi sẽ không nói dông dài về lý thuyết mà đi ngay vào phân tích phần mã chương trình. Đây cũng là một cách học tốt, bạn sẽ được giải thích từng đoạn mã trong chương trình, và cả những bài viết tiếp theo cũng sẽ như thế. Điều đầu tiên bạn cần phải làm là tạo một project mới trong Visual C++. Nếu bạn vẫn chưa biết cách tạo một project, bạn chưa nên học OpenGL lúc này, bạn nên học về Visual C++ trước. Chương trình nguồn cho bài viết này được xây dựng bằng chương trình Visual C++ 6.0. Nhưng bằng cách thay đổi vài chi tiết nhỏ về tên các từ khóa, tôi có thể biên dịch thành công chương trình này bằng VC++4 và VC++5.Sau khi bạn tạo một ứng dụng Win32 mới (không phải là ứng dụng console) trong Visual C++, bạn cần liên kết các thư viện OpenGL với chương trình của mình. Trong Visual C++ vào menu Project, Settings, và click vào tab LINK, ở mục “Object/library modules” thêm vào (trước kernel32.lib) OpenGL32.lib GLu32.lib và Glaux.lib. Click OK, giờ thì bạn đã sẵn sàng viết một chương trình OpenGL.Bốn dòng đầu tiên include các chúng ta dùng.#include <windows.h> // File Header cho Windows#include <gl\gl.h> // File Header cho OpenGL32#include <gl\glu.h> // File Header cho GLu32#include <gl\glaux.h> // File Header cho GLauxTiếp theo là tất cả các biến toàn cục mà bạn sẽ dùng trong chương trình. Chương trình của chúng ta sẽ tạo ra một cửa sổ OpenGL trống, vì vậy bây giờ chúng ta không cần quá nhiều biến. Các biến mà chúng ta khai báo dưới đây là rất quan trọng, và sẽ được dùng trong mọi chương trình OpenGL mà bạn sẽ viết sau này bằng cách dùng lại phần mã này.Dòng đầu tiên khai báo một RC (Rendering Context). Mỗi chương trình OpenGL đều được liên kết với một RC. Rendering Context là các liên kết OpenGL gọi đến Device Context. OpenGL Rendering Context được khai báo là hRC. Và để chương trình vẽ một cửa sổ bạn cần tạo một DC (Device Context), ở dòng thứ 2 của chương trình, Windows Device Context được khai báo là hDC. DC kết nối Window với GDI (Graphics Device Interface). RC kết nối OpenGL với DC.Dòng thứ 3 biến hWnd sẽ giữ một handle (điều khiển) được gán cho cửa sổ của chúng ta bởi Windows, và cuối cùng, dòng thứ 4 tạo một instance (thể hiện) cho chương trình của chúng ta.HGLRC hRC=NULL; // Rendering ContextHDC hDC=NULL; // Private GDI Device ContextHWND hWnd=NULL; // Handle WindowHINSTANCE hInstance; // Instance của ứng dụngBây giờ chúng ta sang đoạn mã tiếp theo, dòng đầu tiên khai báo một mảng dùng để quản lý các phím Căn bản về OpenGLBài 1 - Thiết lập một cửa sổ OpenGLTô Nguyễn Thanh VũTheo nehe.gamedev.net 7được nhấn trên bàn phím. Có nhiều cách để làm điều này, và bạn có thể tự chọn một cách theo bạn là tốt nhất. Tôi chọn cách dùng mảng vì nó chính xác và có thể quản lý nhiều hơn một phím nhấn ở một thời điểm.Biến active giúp cho chương trình biết được cửa sổ của chúng ta đang thu nhỏ nằm ở taskbar (minimized) hay không. Nếu như cửa sổ đang thu nhỏ, chúng ta có thể hiện thực bất kì điều gì từ tạm thời dừng chương trình cho đến thoát khỏi chương trình. Tôi thích tạm dừng chương trình.Ý nghĩa của biến fullscreen rất dễ hiểu. Nếu chương trình của chúng ta đang chạy ở chế độ toàn màn hình, fullscreen sẽ bằng TRUE, ngược lại nếu chương trình chạy ở chế độ cửa sổ, fullscreen sẽ bằng FALSE. Biến này nên là biến toàn cục vì mỗi thủ tục đều cần phải biết chương trình đang chạy ở chế độ nào.bool keys[256]; // Mảng cho phím nhấnbool active=TRUE; // Cờ Active mặc định // là bằng TRUEbool fullscreen=TRUE; // Cờ Fullscreen // mặc định bằng TRUETiếp theo chúng ta định nghĩa hàm WndProc(). Lý do ta làm điều này vì hàm CreateGLWindow() có một tham khảo đến WndProc() nhưng WndProc() lại được đặt sau CreateGLWindow(). Trong C nếu chúng ta muốn truy xuất một hàm hay một phần của chương trình đang nằm sau phần chương trình hiện hành, chúng ta phải khai báo phần mã chúng ta muốn truy xuất ở đỉnh chương trình. Vì vậy dòng tiếp theo chúng ta định nghĩa trước WndProc() để CreateGLWindow() có thể tham khảo tới.LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Khai báo WndProcPhần mã tiếp theo dùng để định lại kích thước vùng nhìn OpenGL khi kích thước cửa sổ (giả sử bạn chạy chương trình ở chế độ cửa sổ) được điều chỉnh. Kể cả khi bạn không có khả năng điều chỉnh lại cửa sổ (khi bạn ở chế độ fullscreen), phần mã này vẫn được gọi ít nhất là một lần khi chương trình chạy lần đầu để thiết lập khung nhìn. Vùng nhìn OpenGL sẽ được định lại kích thước dựa theo chiều rộng và chiều cao của cửa sổ đang hiển thị.GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Khởi tạo và điều chỉnh kích thước cửa sổ GL{if (height==0) // Tránh lỗi Divide By Zero{height=1;}glViewport(0, 0, width, height); // Reset vùng nhìn hiện hànhCác dòng tiếp theo thiết lập màn hình cho khung nhìn. Nghĩa là những gì ở xa hơn sẽ nhỏ hơn. Điều này tạo ra một vùng nhìn thật hơn. Khung nhìn được tính toán với góc nhìn 45 độ và dựa trên chiều rộng và chiều cao của cửa sổ. 0.1f, 100.0f là điểm bắt đầu và điểm kết thúc cho độ sâu mà chúng ta có thể vẽ vào màn hình.Lời gọi hàm lglMatrixMode(GL_PROJECTION) cho biết 2 dòng mã tiếp theo sẽ ảnh hưởng đến ma trận chiếu. Ma trận khung nhìn chịu trách nhiệm việc thêm khung nhìn vào vùng nhìn. glLoadIdentity() giống như reset. Nó đưa ma trận được chọn trở về trạng thái ban đầu. Sau khi glLoadIdentity() được gọi chúng ta khai báo khung nhìn mới cho vùng nhìn. glMatrixMode(GL_MODELVIEW) cho biết bất kì sự thay đổi nào đều sẽ ảnh hưởng lên ma trận Modelview. Ma trận modelview là nơi thông tin đối tượng của chúng ta được lưu giữ. Cuối cùng chúng ta reset ma trận modelview. Đừng lo nếu như bạn không hiểu, chỉ cần biết đây là những phần cần phải làm nếu như bạn một có một vùng nhìn tốt (^_^).glMatrixMode(GL_PROJECTION); // Select The Projection MatrixglLoadIdentity(); // Reset The Projection Matrix// Tính toán lại hệ số tỷ lệ của cửa sổgluPerspective(45.0f,(GLfloat)width/glMatrixMode(GL_MODELVIEW); // Select The Modelview MatrixglLoadIdentity(); // Reset The Modelview Matrix}Trong đoạn mã tiếp theo ta thực hiện phần cài đặt cho OpenGL. Ta sẽ thiết lập màu dùng để xóa màn hình, bật vùng đệm độ sâu, cho phép smooth shading, v.v. Phần mã này sẽ không được gọi cho đến khi cửa sổ OpenGL được tạo. Hàm trả về một giá trị nhưng vì phần khởi tạo của chúng ta không quá phức tạp nên chúng ta cũng không cần bận tâm về giá trị này.int InitGL(GLvoid) // Tất cả các cài đặt cho OpenGL đặt ở đây{Dòng tiếp theo cho phép chế độ smooth shading. Chế độ này cho phép hiển thị màu sắc và ánh sáng tốt hơn.glShadeModel(GL_SMOOTH); // Cho phép Smooth ShadingDòng tiếp theo thiết lập màu của màn hình khi nó được xóa. Tôi xin giải thích ngắn gọn về các màu. Tầm giá trị của màu từ 0.0f cho đến 1.0f. 0.0f là khi màu tối nhất và 1.0f là khi sáng nhất. Thông số đầu tiên của hàm glClearColor() là cường độ màu đỏ (Red), thông số thứ hai là xanh lá (Green) và thứ ba là xanh dương (Blue). Kết hợp cường độ của ba màu này ta sẽ có các màu sắc 8khác nhau (nhớ là tầm giá trị từ 0.0f đến 1.0f). Thông số cuối cùng là giá trị Alpha. Khi dùng cho việc làm sạch (clear) màn hình, chúng ta không bận tâm về thông số thứ 4 này. Ta sẽ thiết lập nó là 0.0f.Để tạo một màu nền đen bạn thiết lập tất cả các màu càng tối càng tốt (0.0f)glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // nền đenBa dòng tiếp theo liên quan đến Depth Buffer (Bộ đệm độ chiều sâu). Bạn hãy xem depth buffer như là các lớp trong màn hình. Bộ đệm này chịu trách nhiệm về việc các đối tượng đang ở sâu bao nhiêu trên màn hình. Ở chương trình này, chúng ta không thật sự dùng đến depth buffer, nhưng mọi chương trình OpenGL vẽ màn hình ở chế độ 3D đều phải dùng đến depth buffer. Nó sắp xếp trật tự vẽ các đối tượng, nhờ đó một hình vuông bạn vẽ sau một hình tròn sẽ không nằm trên hình tròn. Depth buffer là một phần rất quan trọng của OpenGL.glClearDepth(1.0f); // Cài đặt Depth BufferglEnable(GL_DEPTH_TEST); // Cho phép kiểm tra độ sâuglDepthFunc(GL_LEQUAL); // Chế độ kiểm traTiếp theo chúng ta thiết lập khung nhìn sao cho việc hiển thị là tối ưu.glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // chọn chế độ hiển thị tốt nhấtCuối cùng giá trị trả về của hàm là TRUE. Nếu muốn biết việc cài đặt OpenGL có thành công hay không, ta có thể kiểm tra giá trị trả về là TRUE hay FALSE, để làm việc này bạn cần phải thêm phần mã trả về FALSE nếu như có lỗi xảy ra.return TRUE;}Phần tiếp theo là nơi chứa tất cả các mã về việc vẽ lên màn hình. Tất cả những gì bạn muốn hiển thị trên màn hình đều nằm trong phần này. Nếu như bạn đã có một số hiểu biết về OpenGL, bạn có thể tạo thử các dạng hình cơ bản bằng cách thêm mã OpenGL bên dưới dòng glLoadIdentity() và trước return TRUE. Hiện tại, chương trình của chúng ta chỉ dừng ở việc làm sạch màn hình bằng màu đã định trước, xóa vùng đệm độ sâu và reset lại vùng nhìn.Dòng return TRUE cho biết không có lỗi xảy ra. Nếu như bạn muốn chương trình dừng lại vì một vài lí do nào đó, thêm vào dòng return FALSE ở nơi bạn muốn để thông báo việc vẽ thất bại. Chương trình sẽ thoát ra khi thực thi đến dòng mã này.int DrawGLScene(GLvoid){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Xóa màn hình và bộ đệmglLoadIdentity(); // Reset ma trận Modelviewreturn TRUE; // Mọi thứ OK}Hàm KillGLWindow() được gọi trước khi chương trình kết thúc. Công việc của hàm này là giải phóng Rendering Context, Device Context và cuối cùng là handle của cửa sổ. Tôi đã thêm vào một ít mã kiểm tra lỗi. Nếu chương trình không thể giải phóng phần nào của cửa sổ, một thông điệp lỗi sẽ hiển thị, cho biết phần nào bị lỗi. Điều này khiến bạn dễ dàng hơn trong việc phát hiện lỗi trong lập trình.GLvoid KillGLWindow(GLvoid) // hàm hủy cửa sổ{Đầu tiên cần phải biết chúng ta có đang ở chế độ toàn màn hình hay không. Nếu có, chúng ta sẽ chuyển về chế độ bình thường. Chúng ta vẫn có thể hủy cửa sổ trước khi tắt chế độ toàn màn hình, nhưng có vài card màn hình nếu chúng ta hủy cửa sổ trước khi tắt chế độ toàn màn hình, thì desktop sẽ bị “treo”. Tốt nhất là ta tắt chế độ toàn màn hình trước khi hủy cửa sổ.if (fullscreen) // Đang ở chế độ toàn màn hình?{Ta dùng ChangeDisplaySettings(NULL, 0) để trở về. Việc truyền giá trị NULL và 0 khiến Windows dùng các giá trị hiện thời đang chứa trong registry (độ phân giải mặc định, độ sâu bit màu, tần số, v.v…) để phục hồi lại desktop. Sau khi chuyển sang desktop, chúng ta cho con trỏ chuột hiển thị trở lại.ChangeDisplaySettings(NULL,0); // chuyển về desktopShowCursor(TRUE); // hiển thị con trỏ chuột}Đoạn mã tiếp theo kiểm tra xem ta có một Rendering Context (hRC) hay không. Nếu không có, chương trình sẽ nhảy đến đoạn mã kiểm tra chúng ta có Device Context hay không.if (hRC) // Rendering Context?{Nếu có, đoạn code bên dưới sẽ cho biết liệu chúng ta có thể giải phóng nó (hRC) hay không (tách hRC khỏi hDC). Lưu ý cách tôi thực hiện việc kiểm tra lỗi. Đầu tiên, cho chương trình giải phóng các Context (bằng wglMakeCurrent(NULL,NULL), sau đó kiểm tra xem việc giải phóng có thành công hay không).if (!wglMakeCurrent(NULL,NULL)) // {Nếu việc giải phóng các context DC và RC không thành công, hộp thoại MessageBox() sẽ tự động bật lên với một thông báo cho ta biết DC và RC không thể giải phóng được. Ý nghĩa của các thông số truyền cho hàm MessageBox() như sau: NULL nghĩa là hộp thoại không có các cửa sổ cha. Đoạn văn bản sau NULL sẽ được hiển thị trong hộp thoại. “SHUTDOWN ERROR” là dòng chữ sẽ hiện trên đỉnh của hộp thoại (tiêu đề). 9Tiếp theo ta có MB_OK, có nghĩa là ta cần hộp thoại có một nút bấm có nhãn là “OK” và cuối cùng là MB_ICONINFORMATION tạo một ký hiệu chữ i thường xuất hiện bên trong hộp thoại dùng để thông báo.MessageBox(NULL,”Release Of DC And RC Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);}Tiếp theo chúng ta sẽ xóa Rendering Context. Nếu không thành công sẽ có một hộp thoại thông báo lỗi.if (!wglDeleteContext(hRC)) // có thể xóa RC hay không?{MessageBox(NULL,”Release Rendering Context Failed.”,”SHUTDOWN ERROR”,MB_OK |MB_ICONINFORMATION);}hRC=NULL; // Set RC To NULL}Tiếp theo là việc kiểm tra xem ta có một Device Context hay không và nếu có thì giải phóng nó. Nếu ta không thành công trong việc giải phóng Device Context thì một thông điệp sẽ hiện ra và hDC sẽ được thiết lập là NULL.if (hDC && !ReleaseDC(hWnd,hDC)) // có thể giải phóng DC không?{MessageBox(NULL,”Release Device Context Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);hDC=NULL; // Set DC To NULL}Đoạn mã bên dưới là đoạn mã tìm và hủy cửa sổ dùng hàm DestroyWindow(hWnd). Nếu chúng ta không hủy được cửa sổ, một thông điệp lỗi sẽ hiện ra và hWnd được gán bằng NULL.if (hWnd && !DestroyWindow(hWnd)) // Có thể hủy cửa sổ không?{MessageBox(NULL,”Could Not Release hWnd.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);hWnd=NULL; // Set hWnd To NULL}Điều cuối cùng cần làm là hủy bỏ đăng kí Class Windows của chúng ta. Điều này cho phép ta hủy cửa sổ một cách chính quy và sau đó có thể mở cửa sổ khác mà không nhận được thông báo lỗi “Windows Class already registered”if (!UnregisterClass(“OpenGL”,hInstance)) // Có thể hủy đăng ký không?{MessageBox(NULL,”Could Not Unregister Class.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);hInstance=NULL; // Set hInstance To NULL}}Kế đến là phần mã tạo nên cửa sổ OpenGL của chúng ta. Tôi đã mất rất nhiều thời gian để quyết định nên tạo một cửa sổ toàn màn hình cố định, không đổi và không cần phải viết nhiều mã, hay là tạo một cửa sổ thân thiện với người dùng và dể dàng chỉnh sửa. Cuối cùng cửa sổ thân thiện người dùng là hướng đi tốt nhất. Vì nhiều người bắt đầu thường rất hay thắc mắc về những điều như: Làm thế nào để tạo ra một cửa sổ thay vì toàn màn hình? Làm thế nào thay đổi tiêu đề cửa sổ? Làm thế nào thay đổi độ phân giải hoặc định dạng điểm của cửa sổ? Phần mã tiếp theo thực hiện tất cả các điều này!Như bạn thấy, thủ tục trả về giá trị BOOL (TRUE hoặc FALSE), nó nhận 5 tham số: tiêu đề của cửa sổ, chiều rộng cửa sổ, chiều cao cửa sổ, số bit màu (16/24/32), và cuối cùng là cờ fullscreen (bằng TRUE cho chế độ toàn màn hình, bằng FALSE cho chế độ cửa sổ). Giá trị BOOL trả về cho biết cửa sổ đã được tạo thành công hay chưa.BOOL CreateGLWindow(char* title, int width, int height, int bits, bool{Khi yêu cầu Windows cung cấp cho chúng ta một định dạng điểm phù hợp với mong muốn, giá trị mà Windows tìm được sẽ được cất trong biến PixelFormat.GLuint PixelFormat; // Chứa kết quả định dạng sau khi tìm kiếmBiến wc sẽ được dùng để chứa cấu trúc Window Class. Cấu trúc Window Class giữ thông tin về cửa sổ. Bằng việc thay đổi các vùng trong Class này chúng ta có thể thay đổi cách nhìn và cách vận hành cửa sổ. Mọi cửa sổ đều thuộc về một Window Class. Trước khi bạn tạo một cửa sổ, bạn phải đăng kí một Class cho cửa sổ.WNDCLASS wc; // Cấu trúc Windows ClassCác biến dwExStyle và dwStyle sẽ chứa các thông tin về kiểu (Style) Window bình thường và mở rộng (Extended). Việc dùng các biến để chứa các thông tin này khiến cho bạn có thể thay đổi các kiểu phụ thuộc vào loại cửa sổ bạn muốn hiển tạo ra (một cửa sổ popup hoặc toàn màn hình hoặc một cửa sổ có viền ngoài)DWORD dwExStyle; // Window Extended StyleDWORD dwStyle; // Window StyleNăm dòng mã tiếp theo chứa các giá trị góc trái trên, và góc phải dưới của một hình chữ nhật. Ta sẽ dùng các giá trị này để điều chỉnh cửa sổ sao cho vùng 10vẽ hiển thị chính xác ở độ phân giải chúng ta cần.RECT WindowRect; // Giữ giá trị góc trên bên trái, góc dưới bên phải hình chữ nhậtWindowRect.left=(long)0; // giá trị bên trái bằng 0WindowRect.right=(long)width; // giá trị bên phải bằng với chiều rộng yêu cầuWindowRect.top=(long)0; // giá trị phía trên 0WindowRect.bottom=(long)height; // giá trị phía dưới bằng với chiều cao yêu cầuỞ dòng tiếp theo chúng ta cho biến toàn c ục fullscreen bằng vớ ì nếu chúng ta chuyển cửa sổ thành toàn màn hình, biế ẽ là TRUE. Nếu ta không gán fullscreen bằ á trị fullscreen sẽ vẫn là FALSE. Nếu chúng ta hủy cửa sổ, và máy tính vẫn đang ở chế độ toàn màn hình, nhưng do biến fullscreen bằng FALSE, chương trình sẽ không chuyển về chế độ desktop trước khi hủy cửa sổ dẫn đến lỗi như phần trên tôi đã trình bày. // cập nhật biến toàn cục fullscreenCác hằng CS_HREDRAW và CS_VREDRAW quy định cửa sổ sẽ được vẽ lại mỗi khi nó được cập nhật kích thước. CS_OWNDC tạo một DC private cho cửa sổ. Nghĩa là các ứng dụng khác không chia sẻ DC này. WndProc là một thủ tục theo dõi các thông điệp trong chương trình. Do không có các dữ liệu cửa sổ nào khác nên hai vùng cbClsExtra và cbWndExtra bằng không. Cho hIcon bằng NULL nghĩa là chúng ta không cần một ICON trên cửa sổ, và giá trị của hCursor cho phép ta dùng con trỏ chuột chuẩn. Màu nền không quan trọng (ta đã thiết lập trong OpenGL). Ta cũng không cần một menu trong cửa sổ này nên cho nó bằng NULL, và tên lớp có thể là bất cứ gì bạn muốn.hInstance = GetModuleHandle(NULL); // giữ một thể hiện của cửa sổwc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc điều khiển các thông điệpwc.cbClsExtra = 0; // không có dữ liệu cửa sổ phụwc.cbWndExtra = 0;//không có dữ liệu cửa sổ phụwc.hInstance = hInstance; // thiết lập thể hiệnwc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // nạp icon mặc địnhwc.hCursor = LoadCursor(NULL, IDC_ARROW); // nạp con trỏ mặc địnhwc.hbrBackground = NULL; // màu nền không cần thiết nếu như ta dùng OpenGLwc.lpszMenuName = NULL; // không cần menuwc.lpszClassName = “OpenGL”; // đặt tên lớpBây giờ ta đăng kí Window Class. Nếu có lỗi xảy ra, một hộp thoại báo lỗi sẽ bật lên. Click vào nút OK sẽ kết thúc chương trình.if (!RegisterClass(&wc)) // đăng kí Window Class{MessageBox(NULL,”Failed To Register The Window Class.”, “ERROR”, MB_OK|MB_ICONEXCLAMATION);return FALSE; // thoát và trả về FALSE}Có nhiều người thường hay vấp phải lỗi trong việc chuyển sang chế độ toàn màn hình. Bạn nên nhớ vài điều quan trọng khi chuyển sang chế độ toàn màn hình. Phải chắc chắn là chiều rộng và chiều cao bạn dùng trong chế độ toàn màn hình cũng chính là chiều rộng và chiều cao bạn dùng cho cửa sổ, và quan trọng nhất, thiết lập chế độ toàn màn hình trước khi bạn tạo cửa sổ.DEVMODE dmScreenSettings; // Chế độ thiết bịmemset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // xóa vùng nhớdmScreenSettings.dmSize= sizeof(dmScreenSettings); // Kích thước của cầu trúc DevmodedmScreenSettings.dmPelsWidth = width; // chọn chiều rộngdmScreenSettings.dmPelsHeight = height; // và chiều caodmScreenSettings.dmBitsPerPel = bits; // chọn số bít mỗi điểmdmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;Trong đoạn mã trên, chúng ta xóa vùng nhớ để chứa các thiết lập video. Thiết lập chiều rộng, chiều cao và số bit của chế độ toàn màn hình. Tất cả các thông tin này được chứa trong dmScreenSettings. Ở dòng mã bên dưới ChangeDisplaySettings sẽ chuyển màn hình sang chế độ phù hợp với những gì chứa trong dmScreenSettings. Tôi dùng thông số CDS_FULLSCREEN khi đổi chế độ, vì cần phải bỏ thanh start ở đáy màn hình, thêm vào việc nó không được dịch chuyển hay định lại kích thước cho đến khi bạn trở lại chế độ cửa sổ bình thường.if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!= DISP_CHANGE_SUCCESSFUL){Nếu không thể chuyển sang chế độ toàn màn hình, đoạn mã bên dưới sẽ được thực thi. Một hộp thoại sẽ bật lên với hai tùy chọn… một là chạy ở chế độ cửa sổ, và hai là thoát chương trình.if (MessageBox(NULL,”The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?”, “OpenGL”, MB_YESNO|MB_ICONEXCLAMATION)==IDYES){ 11Nếu người dùng quyết định dùng chế độ cửa sổ, biến fullscreen được chuyển thành FALSE và chương trình tiếp tục chạy.fullscreen=FALSE; // chuyển sang chế độ cửa sổ}else{Nếu người dùng quyết định thoát, một hộp thoại bật lên cho người dùng biết chương trình sẽ đóng. FALSE sẽ được trả về cho biết chương trình đã không hoạt động thành công.// bật hộp thoại cho biết chương trình đang đóngMessageBox(NULL,”Program Will Now Close.”, ”ERROR”,MB_OK|MB_ICONSTOP);return FALSE; // thoát chương trình và trả về FALSE}}}Do phần mã phía trên có thể không thành công và người dùng có thể quyết định chạy chương trình ở chế độ cửa sổ, ta cần kiểm tra lại biến fullscreen bằng TRUE hay FALSE trước khi thiết lập kiểu màn hình/cửa sổ.if (fullscreen) // vẫn đang trong chế độ toàn màn hình?{Nếu đúng, chúng ta thiết lập kiểu mở rộng (extended style) là WS_EX_APPWINDOW, đẩy cửa sổ đang nằm trên cùng của window xuống taskbar khi cửa sổ của ta bật lên. Với kiểu cửa sổ (window style) ta sẽ tạo một cửa sổ WS_POPUP, cửa sổ này không có đường viền bao quanh, rất thích hợp cho chế độ toàn màn hình.Cuối cùng, ta tắt con trỏ chuột. Bạn cũng có thể để con trỏ chuột, điều này phụ thuộc vào bạn.dwExStyle=WS_EX_APPWINDOW; // Window Extended StyledwStyle=WS_POPUP; // Windows StyleShowCursor(FALSE); // giấu con trỏ chuột}else{Nếu dùng một cửa sổ thay cho chế độ toàn màn hình, ta s ẽ thiết l ập kiểu m ở r ộng là WS_EX_WINDOWEDGE. Điều này khiến cho cửa sổ có vẻ 3D hơn. Với kiểu cửa sổ ta dùng WS_OVERLAPPEDWINDOW thay cho WS_POPUP. WS_OVERLAPPEDWINDOW tạo một cửa sổ có thanh tiêu đề, đường viền kích thước, menu cửa sổ, và các nút minimize/maximize (phóng to/thu nhỏ cửa sổ).dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended StyledwStyle=WS_OVERLAPPEDWINDOW; // Windows Style}Dòng mã tiếp theo điều chỉnh cửa sổ theo đúng như các kiểu mà ta đã thiết lập. Sự điều chỉnh này khiến cửa sổ của chúng ta có chính xác độ phân giải như yêu cầu. Bình thường các đường viền sẽ trùng lấp một số phần của cửa sổ. Bằng cách dùng AdjustWindowRectEx sẽ không có phần nào của vùng nhìn OpenGL sẽ bị bao phủ bởi đường viền, thay vào đó, cửa sổ sẽ được làm lớn hơn. Trong chế độ toàn màn hình, lệnh này không có hiệu quả.AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Điều chỉnh lại kích thước cửa sổTiếp theo, ta tạo cửa sổ và kiểm tra xem nó được tạo đúng hay không. Ta truyền cho hàm CreateWindowEx() tất cả các thông số cần thiết. Kiểu mở rộng cần dùng. Tên lớp (là tên bạn dùng khi đăng kí Window Class). Tiêu đề cửa sổ. Kiểu cửa sổ. Góc trên bên trái của cửa sổ. Chiều rộng và chiều cao. Ta không cần cửa sổ cha, và cũng không có menu, vì vậy ta thiết lập cả hai thông số này là NULL.Lưu ý là tôi thêm vào kiểu WS_CLIPSIBLINGS và WS_CLIPCHILDREN dọc theo kiểu cửa sổ. Hai kiểu này là hai kiểu cần thiết cho OpenGL. Các kiểu này chống lại việc các cửa sổ khác vẽ đè hay vẽ vào trong cửa sổ OpenGL.if (!(hWnd=CreateWindowEx( dwExStyle, // kiểu mở rộng“OpenGL”, // tên lớptitle, // tiêu đề cửa sổWS_CLIPSIBLINGS |WS_CLIPCHILDREN |dwStyle, // kiểu đã chọn0, 0, // vị trí cửa sổWindowRect.right-WindowRect.left, // điều chỉnh chiều rộngWindowRect.bottom-WindowRect.top, // điều chỉnh chiều caoNULL, // không có cửa sổ chaNULL, // không có menuhInstance, // InstanceNULL))) // không truyền cho WM_CREATE gì cảNếu cửa sổ đã được tạo, hWnd sẽ giữ điều khiển cửa sổ. Nếu cửa sổ không được tạo đoạn mã bên dưới sẽ khiến hiển thị một thông báo lỗi và ngừng chương trình.{KillGLWindow();MessageBox(NULL,”Window Creation Error.”, “ERROR”, MB_OK|MB_ICONEXCLAMATION);return FALSE; // trả về FALSE}Phần tiếp theo mô tả một định dạng điểm (Pixel Format). Ta chọn một định dạng có hỗ trợ OpenGL 12và việc đệm đôi (double buffering), kèm theo hệ màu RGBA (có các kênh màu đỏ, xanh lá, xanh dương, và alpha). Và định dạng này có hỗ trợ số bit mà ta chọn (16bit, 24bit, 32bit). Cuối cùng ta cài đặt một bộ đệm 16bit (16bit Z-Buffer). Các thông số còn lại không quan trọng hoặc không dùng đến (trừ bộ đệm stencil (mẫu tô) và bộ đệm accumulation (tích lũy)).static PIXELFORMATDESCRIPTOR pfd= {sizeof(PIXELFORMATDESCRIPTOR), // kích thước của mô tả định dạng điểm1, // số phiên bảnPFD_DRAW_TO_WINDOW | // định dạng phải hỗ trợ WindowPFD_SUPPORT_OPENGL | // định dạng phải hỗ trợ OpenGLPFD_DOUBLEBUFFER, // hỗ trợ Double BufferingPFD_TYPE_RGBA, // yêu cầu định dạng màu RGBAbits, // chọn độ sâu màu0, 0, 0, 0, 0, 0, // bỏ qua các bit màu0, // không có bộ đệm Alpha0, // bỏ qua bit Shift0, // không có bộ đệm Accumulation0, 0, 0, 0, // bỏ qua các bit Accumulation16, // 16Bit Z-Buffer (Depth Buffer)0, // không có bộ đệm Stencil0, // không có bộ đệm AuxiliaryPFD_MAIN_PLANE, // Lớp vẽ chính0, // để dành0, 0, 0 // bỏ qua các mặt nạ lớp};Nếu không có lỗi xảy ra khi tạo cửa sổ, ta tiếp tục lấy một OpenGL Device Context. Nếu ta không thể nhận được một DC, một thông báo lỗi sẽ hiện trên màn hình, và chương trình kết thúc (return FALSE).if (!(hDC=GetDC(hWnd))) // Ta đã có Device Context?{KillGLWindow(); MessageBox(NULL,”Can’t Create A GL Device Context.”, “ERROR”, MB_OK|MB_ICONEXCLAMATION);return FALSE;}Sau khi có được một Device Context cho cửa sổ OpenGL, ta tìm một định dạng điểm phù hợp với yêu cầu đã khai báo ở trên. Nếu Windows không thể tìm ra định dạng phù hợp, một thông điệp lỗi sẽ hiển thị và chương trình kết thúc (return FALSE).if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) {KillGLWindow(); MessageBox(NULL,”Can’t Find A Suitable PixelFormat.”, “ERROR”, MB_OK|MB_ICONEXCLAMATION);return FALSE; }Nếu Windows tìm được định dạng ảnh phù hợp, ta sẽ tiến hành cài đặt định dạng ảnh. Nếu định dạng ảnh không cài đặt được, một thông điệp lỗi sẽ hiển thị và chương trình kết thúc (return FALSE).if(!SetPixelFormat(hDC,PixelFormat,&pfd)) {KillGLWindow(); MessageBox(NULL,”Can’t Set The PixelFormat.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);return FALSE; }Khi định dạng ảnh đã được thiết lập xong, phần tiếp theo là nhận một Rendering Context. Nếu không lấy được một RC, một thông điệp lỗi sẽ được hiển thị và chương trình sẽ kết thúc (return FALSE)if (!(hRC=wglCreateContext(hDC))) {KillGLWindow(); MessageBox(NULL,”Can’t Create A GL Rendering Context.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);return FALSE; }Khi không có lỗi nào xảy ra, và ta đã tạo được cả hai Device Context và Rendering Context, phần còn lại là làm cho Rendering Context hoạt động. Nếu ta không thể kích hoạt Rendering Context một thông điệp lỗi sẽ bật lên và chương trình kết thúc (return FALSE).if(!wglMakeCurrent(hDC,hRC)) // Kích hoạt Rendering Context{KillGLWindow();MessageBox(NULL,”Can’t Activate The GL Rendering Context.”, “ERROR”, MB_OK|MB_ICONEXCLAMATION);return FALSE;}Khi mọi thứ đều tốt đẹp, và cửa sổ OpenGL đã được tạo, ta bắt đầu hiển thị cửa sổ, cho nó làm cửa sổ hiện hành và ở trên cùng (bằng cách cho nó độ ưu tiên cao). Sau đó ta gọi ReSizeGLScene với các thông số chiều rộng và chiều cao để thiết lập khung nhìn màn hình OpenGL.ShowWindow(hWnd,SW_SHOW); // Hiển thị cửa sổSetForegroundWindow(hWnd); [...]... đang chờ đợi bạn trong thế giới lập trình, chúng ta sẽ nói một ít về kỹ thuật và cả những niềm vui của thế giới ấy. Bạn cần gì để trở thành một lập trình viên? Tơi khơng nghĩ rằng có một vài u cầu khó khăn nào đó khiến bạn khơng thể trở thành lập trình viên, tơi chỉ đơn giản nghĩ rằng bất cứ ai có một ít (hay rất nhiều) mong muốn đều có thể trở thành lập trình viên. Vấn đề chỉ là bạn dành... thành một lập trình viên giỏi nếu chỉ tập luyện 2 giờ mỗi ngày. Tất cả các cơng việc đều có phần thú vị và phần buồn chán, khơng có ngoại lệ. Kẻ thù số một của các lập trình viên là gì? Kiêu căng. Lập trình viên sử dụng hầu hết thời gian của mình vào việc sửa lỗi. Chương trình càng dễ đọc bao nhiêu càng tiết kiệm thời gian bấy nhiêu. Trường học khiến các bạn tin rằng chương trình của... chương trình “closed for Một chương trình bên cạnh tính độc lập tương đối của mình cịn có quan hệ với rất nhiều chương trình khác. Việc sửa đổi nó có thể dẫn đến việc sửa đổi tất cả những chương trình liên quan. Và trong một hệ thống lớn thì việc này quả là một thảm họa. Nâng cấp một phần của hệ thống kéo theo phải nâng cấp toàn bộ hệ thống! Như vậy làm thế nào để xây dựng được một chương trình. .. sử dụng. 3 Giới thiệu Thế là bạn nghĩ rằng lập trình là một thế giới vô cùng thú vị, và bạn muốn tham gia vào thế giới ấy? Trước khi bạn bắt đầu, điều duy nhất mà tôi muốn khuyên là: nếu bạn thực sự u thích lập trình thì đó rõ ràng là cơng việc tốt nhất mà bạn có thể có được. Ngược lại, nếu bạn chỉ cảm thấy thích, hay khơng quan tâm lắm đến lập trình, thì đó rõ ràng là công việc tồi tệ nhất... học là nơi tuyệt vời để học mọi thứ ngoại trừ công nghệ. Đừng cho là tơi sai, tơi khơng nói rằng tơi nghĩ trường học là không quan trọng. Ngược lại, tôi nghĩ trường học là rất quan trọng, nhưng không phải để học lập trình. Những Như vậy là bạn muốn trở thành một lập trình viên? Việt Thanh Tổng hợp từ Internet Khơng bao giờ sợ phải bắt đầu. Tôi sẽ không viết hai lần cùng một đoạn mã giống nhau. Khi... hơn một phím nhấn ở một thời điểm. Biến active giúp cho chương trình biết được cửa sổ của chúng ta đang thu nhỏ nằm ở taskbar (minimized) hay không. Nếu như cửa sổ đang thu nhỏ, chúng ta có thể hiện thực bất kì điều gì từ tạm thời dừng chương trình cho đến thốt khỏi chương trình. Tơi thích tạm dừng chương trình. Ý nghĩa của biến fullscreen rất dễ hiểu. Nếu chương trình của chúng ta đang chạy... nghĩa là tơi nghĩ có nhiều quan niệm sai lầm về những kỹ năng cần có để trở thành lập trình viên. Trước tiên, bạn khơng cần phải thật xuất sắc trong mơn Tốn, bạn chỉ cần có khả năng hiểu được những điều cơ bản. Dĩ nhiên là có những ngoại lệ, nếu bạn có hứng thú trong lĩnh vực đồ họa hay lập trình game thì một kiến thức Tốn vững vàng sẽ giúp bạn rất nhiều. Một quan niệm sai lầm khác là bạn... nào! Nó địi hỏi chúng ta phải có kiến thức vững về lập trình hướng đối tượng và am tường phân tích thiết kế hướng đối tượng. Tất cả bắt đầu vào những năm 70 của thế kỷ 20, tại phịng thí nghiệm Xerox PARC ở Palo Alto. Sự ra đời của giao diện đồ họa (Graphical User Interface) và lập trình hướng đối tượng (Object Oriented Programming) cho phép lập trình viên làm việc với những thành phần đồ họa như... và mối quan hệ giữa những đối tượng đó. Những đối tượng này được biểu diễn bằng dạng mệnh đề của logic, một phần nhỏ của logic vị từ. Thành phần logic của một vấn đề được gọi chung là chương trình logic (logic program). Sau đó phần điều khiển lấy những suy diễn logic hay những lập luận để dẫn xuất ra một sự kiện mới từ chương trình logic để giải quyết vấn đề. Sự phân chia này có những ưu điểm. .. phần có thể phát triển độc lập với nhau. •Thành phần logic có thể được phát triển bởi tự điều chỉnh qua từng bước. •Thay đổi thành phần điều khiển tác động đến sự hiệu quả của giải pháp. Giới thiệu Prolog Nếu như C là một ngơn ngữ dùng để diễn tả giải thuật, thì Prolog là ngôn ngữ dùng để diễn tả vấn đề. Lập trình logic Thanh Tùng Prolog là một bước chuyển tiếp của lập trình trong logic, do đó . không quan trọng. Ngược lại, tôi nghĩ trường học là rất quan trọng, nhưng không phải để học lập trình. Những Như vậy là bạn muốn trở thành một lập trình. thích lập trình thì đó rõ ràng là công việc tốt nhất mà bạn có thể có được. Ngược lại, nếu bạn chỉ cảm thấy thích, hay không quan tâm lắm đến lập trình,

Ngày đăng: 30/08/2012, 11:12

Hình ảnh liên quan

Sử dụng các control với tên như bảng sau:                                   - Quan điểm lập trình

d.

ụng các control với tên như bảng sau: Xem tại trang 14 của tài liệu.
“Làm thế nào chúng ta có thể lưu trữ hình ảnh vào cơ sở dữ liệu và truy cập chúng trở lại?”, đây là câu  hỏi thường gặp trong lập trình cơ sở dữ liệu - Quan điểm lập trình

m.

thế nào chúng ta có thể lưu trữ hình ảnh vào cơ sở dữ liệu và truy cập chúng trở lại?”, đây là câu hỏi thường gặp trong lập trình cơ sở dữ liệu Xem tại trang 14 của tài liệu.
Hình 1. Hộp thoại điều chỉnh biến môi trường Trong mục  System  củ a  Control  Panel  trong  Windows  2k  và  XP - Quan điểm lập trình

Hình 1..

Hộp thoại điều chỉnh biến môi trường Trong mục System củ a Control Panel trong Windows 2k và XP Xem tại trang 20 của tài liệu.
Hình 2.Đ iều chỉnh biến hệ thống trong Windows - Quan điểm lập trình

Hình 2..

Đ iều chỉnh biến hệ thống trong Windows Xem tại trang 20 của tài liệu.
Hình 3. Chương trình Connect - Quan điểm lập trình

Hình 3..

Chương trình Connect Xem tại trang 21 của tài liệu.
Hình 1: Quá trình thiết kế hệ thống số - Quan điểm lập trình

Hình 1.

Quá trình thiết kế hệ thống số Xem tại trang 26 của tài liệu.
Hình 2: Kết quả của giai đoạn thiết kế dữ liệu - Quan điểm lập trình

Hình 2.

Kết quả của giai đoạn thiết kế dữ liệu Xem tại trang 26 của tài liệu.

Tài liệu cùng người dùng

Tài liệu liên quan