http://www.ebook.edu.vn
Lp trình Opengl vi thư vin AUX
(Tài liu tham kho ca trường đại hc wakayama Nht)
Tác gi: Bùi Minh Trường
Email: truongtoba136@yahoo.co.jp
Homepage: http://cct2.st.toba-cmt.ac.jp/~442/
I-Gii thiu v Opengl:
Opengl thư vin lp trình đồ ho 3D, các bn mun biết thêm thì xem ti trang ch
opengl. Org.Bài viết này dành cho nhng bn đã biết opengl là gì, và nó cũng là bài đầu tiên
cho vic hc đồ ho vi opengl sau này.
II-Opengl trong Windows:
Lp trình opengl trong Windows bng Visual C, bn phi s dng ba thư vin sau
glaux.lib glu32.libopengl32.lib.Trong Visual C mun link ti các thư vin này các bn
làm như sau: trên menu(trình đơn) chn Project sau đó chn setting ri cui cùng trong tab
link bn dánh tên 3 thư vin trên vào(nh là có du cách gia các tên ca thư vin).Nếu bn
thích s dng phím tt thì ch vic bm Alt+F7 thì cũng được kết qu như trên.Mt điu cũng
rt quan trng là khi to mt project mi bn phi chn Window32 console application.T
bây gi bn đã có th sn sàng viết mã lnh ca mình.(Nên nh là bn không phi thêm bt c
cái gì na vì trong VC đã có đầy đủ nhng cái tôi đề cp trên).
III-To mt ca s trong opengl:
Dưới đây là mã ngun cho chương trình đầu tiên ca bn để to mt ca s.Hãy lưu
nó vi tên gì tu bn(ví d hello.c như truyn thng)
1-Chương trình đầu tiên ca bn:
/*filename: hello.c*/
/*Chương trình đầu tiên to mt ca s trong opengl*/
#ifdef unix /*Phn này dùng để xác định môi trường làm vic ca bn*/
#include <GL/gl.h> /*Nó s xác định bn biên dch chương trình này trên unix*/
#include “aux.h“ /*hay Windows, vi lp trình viên trên windows bn có */
#define CALLBACK /*th b phn bên trên đi và ch ly phn in đậm*/
#else
#include<windows.h>
#include<GL/gl.h>
#include<GL/glaux.h>
#endif
int main(int argc, char *argv[])
{
auxInitWindow(argv[0]);
return 0;
}
Lnh auxInitWindow(string); có tác dng to mt ca s mi, string là tiêu đề ca ca s đó,
bn có th viết tiu đề như thếo là tu bn.
Chương trình này sau khi biên dch thì nó mi ch hin ra mt ca s ri đóng ngay, nếu
windows ca bn chy nhanh quá thì bn s không nhìn thy chi hết
Sau đây chúng ta s bt Window dùng li chng 1 giây để chúng ta quan sát.Cũng vi mã
lnh trên bn ch cn thêm mt dòng lnh: sleep(s_giây_mun_xem x 1000);(tc là lnh này
bt window tm dng trong vòng 1 phn nghìn giây)
2-Theo dõi Window
/*file name: hello1s.cpp*/
#ifdef unix
http://www.ebook.edu.vn
#include <GL/gl.h>
#include "aux.h"
#define CALLBACK
#else
#include<windows.h>
#include<GL/gl.h>
#include<GL/glaux.h>
#endif
int main(int argc, char *argv[])
{
auxInitWindow(argv[0]);
/*dòng lnh mi , window s hin trong vòng 1 giây*/
Sleep(1000);
/*dòng lnh mi*/
return 0;
}
Trong phn source code mã ngun này nm trong file hello1s.cpp.
3-Xoá màn hình trong opengl
Tiếp theo tôi s gii thiu vi các bn cách xoá màn hình trong opengl.Dưới đây là mã ngun:
/*filename: clear.cpp*/
#ifdef unix
#include <GL/gl.h>
#include "aux.h"
#define CALLBACK
#else
#include<windows.h>
#include<GL/gl.h>
#include<GL/glaux.h>
#endif
int main(int argc, char *argv[])
{
auxInitWindow(argv[0]);
/*Nhng dòng lnh mi*/
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
/*Nhng dòng lnh mi*/
Sleep(1000);
return 0;
}
Các lnh glClearColor(), glClear(),glFush() là nhng lnh cơ bn ca Opengl.glClearColor()
có nhim v chn màu để xoá window, bn d dàng nhn ra là nó có 4 tham s, 4 tham s đó
là RGBA( red green blue alpha).Không ging vi hàm RGB() trong Win32 API , 4 tham s
này có giá tr trong khong 0.0f đến 1.0f(kiu float).Ba tham s đầu là màu đỏ xanh lá cây và
xanh da tri, còn tham s th 4 là độ sáng ti ca window.Bây gi hãy thay đổi các giá tr ca
màu xem th!Hàm glClear() mi thc s xoá window, nó có nhng hng s xác định.Có
trường hp có nhng hàm chưa được chy đến khi kết thúc chương trình, để tránh trường hp
này hàm glFlush()được gi, nó s thc hin tt c các hàm chưa được chy và kết thúc
chương trình.
4-V hình trong opengl
http://www.ebook.edu.vn
T trước đến gi chúng ta mi ch nói v cách to và xoá ca s, bây gi chúng ta s thc
hin v mt s hình đơn gin:
/*filename line.cpp*/
#ifdef unix
#include <GL/gl.h>
#include "aux.h"
#define CALLBACK
#else
#include<windows.h>
#include<GL/gl.h>
#include<GL/glaux.h>
#endif
int main(int argc, char *argv[])
{
auxInitWindow(argv[0]);
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
/*nhng dòng lnh mi*/
glBegin(GL_LINE_LOOP);
glVertex2d(0.1,0.1);
glVertex2d(0.9,0.1);
glVertex2d(0.9,0.9);
glVertex2d(0.1,0.9);
/*nhng dòng lnh mi*/
glEnd();
glFlush();
Sleep(1000);
return 0;
}
Tt c các hình khi được v trong opengl đều được nm gia hai dòng lnh glBegin() và
glEnd() (Hơi ging vi pascal- bn nào hc pascal thì d hiu nhé!).Có th có nhiu cp
dòng lnh như vy, tc là bn có th viết các hàm v khác nhau và dùng cp câu lnh trên
trong các hàm đó.Tham s ca glBegin() là GL_LINE_LOOP có nghĩa là nó bo window v
mt đường khép kín đim đầu trùng vi đim cui.
Dưới đây là mt s hng s cơ bn:
Hng s ý nghĩa
GL_POINT V đim
GL_LINÉ V đường thng ni hai đim
GL_LINE_STRIP Tp hp ca nhng đon đựơc ni vi nhau
GL_LINE_LOOP Đường gp khúc khép kín
GL_TRIANGLES V hình tam giác
GL_QUADS V t giác
GL_TRIANGLES_STRIP V mt tp hp các tam giác lin nhau, chung mt cnh
GL_QUAD_STRIP V mt tp hp các t giác lin nhau, chung mt cnh
GL_TRIANGLE_FAN V hình qut
Dưới đây là bc tranh toàn cnh v các thông s này.
http://www.ebook.edu.vn
Hàm glVertex2d() xác định đim hai chiu.Bn nên biết mt s tin t các hàm ca opengl,
các hàm dùng thư vin nào s bt đầu bng tên ca thư vin đó ví d dùng các hàm cơ bn ca
opengl thì thường là bt đầu vi gl, các hàm dùng thư vin glut thì bt đầu vi glu các hàm
dùng thư vin aux thì bt đầu vi aux......Các hàm cũng có hu t d glVertex2d() là v
đim 2 chiu, glVertex3d() là v đim 3 chiu,....dn dn hc các bn s phát hin ra nhiu
hơn.
5-S dng màu v:
Tiếp theo tôi s hướng dn các bn cách s dng màu để v và cách th hin nó.
Dưới đây là mã ngun:
/*filename: color1.cpp*/
#ifdef unix
#include <GL/gl.h>
#include "aux.h"
#define CALLBACK
#else
#include<windows.h>
#include<GL/gl.h>
#include<GL/glaux.h>
#endif
int main(int argc, char *argv[])
{
auxInitDisplayMode(AUX_RGBA); /*hàm mi*/
auxInitWindow(argv[0]);
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1.0,0.0,0.0); /*hàm mi*/
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS); /*tham s mi*/
glVertex2d(0.1,0.1);
glVertex2d(0.9,0.1);
http://www.ebook.edu.vn
glVertex2d(0.9,0.9);
glVertex2d(0.1,0.9);
glEnd();
glFlush();
Sleep(1000);
return 0;
}
Hàm auxInitDisplayMode() báo vi window rng chúng ta chn cách hin th nhng gì mà
chúng ta sp v ti đây, tham s ca nó là AUX_RGBA chính là mode RGBA mà tôi đề cp
trên.Hàm glColor3d() cho phép chúng ta chn màu v, tham s ca nó là red green và blue
nhưng các giá tr này là kiu double nếu bn mun dùng kiu float thì có hàm glColor3f(), c
hai kiu trên giá tr ca màu vn nm trong khong 0 đến 1.Chú ý là chương trình trên chúng
ta đã đổi tham s mi cho hàm glBegin(), bây gi nó s v mt t giác, và trong chương trình
này thì là mt hình vuông.
Trong phn này tôi mun trình bày vi các bn mt k thut na, chương trình trên ch cho
chúng ta nhìn thy mt màu đỏ do chúng ta đặt mt màu duy nht trước khi v. Để có th to
nhiu màu n tượng bn có th cài đặt đi cài đặt li hàm glColor3d() mi khi chúng ta v mi.
Dưới đây là mã ngun:
/*filename: color2.cpp*/
#ifdef unix
#include <GL/gl.h>
#include "aux.h"
#define CALLBACK
#else
#include<windows.h>
#include<GL/gl.h>
#include<GL/glaux.h>
#endif
int main(int argc, char *argv[])
{
auxInitDisplayMode(AUX_RGBA);
auxInitWindow(argv[0]);
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glColor3d(1.0,0.0,0.0); /*hàm này đã được chuyn xung đây*/
glVertex2d(0.1,0.1);
glColor3d(0.0,1.0,0.0); /*tham s mi cho hàm*/
glVertex2d(0.9,0.1);
glColor3d(0.0,0.0,1.0); /*tham s mi cho hàm*/
glVertex2d(0.9,0.9);
glColor3d(1.0,0.0,1.0); /*tham s mi cho hàm*/
glVertex2d(0.1,0.9);
glEnd();
glFlush();
Sleep(1000);
return 0;
}