Liên Mạng VietNam || GiaiTri.com | GiaiTriLove.com | GiaiTriChat.com | LoiNhac.com Đăng Nhập | Gia Nhập
Tìm kiếm: Tựa truyện Tác giả Cả hai

   Tìm theo mẫu tự: # A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Danh sách tác giả    Truyện đã lưu lại (0
Home >> Khoa Học >> Lập trình Opengl với thư viện AUX

  Cùng một tác giả
Không có truyện nào


  Tìm truyện theo thể loại

  Tìm kiếm

Xin điền tựa đề hoặc tác giả cần tìm vào ô này

  Liệt kê truyện theo chủ đề

  Liệt kê truyện theo tác giả
Số lần xem: 6943 |  Bình chọn:   |    Lưu lại   ||     Khổ chữ: [ 1, 2, 3

Lập trình Opengl với thư viện AUX
Bùi Minh Trường

9

11-Sử dụng ánh sáng trong opengl.
Để xác định  mặt nào được chiếu sáng và với cường độ sáng bao nhiêu, người ta dùng véc tơ pháp tuyến (normal vector).Trong chương trình dưới đây tôi sẽ giới thiệu cách dùng véc tơ này.Mã nguồn:
/*filename: light1.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
#include<GL/glu.h>
GLdouble vertex[][3]={
 {0.0,0.0,0.0},
 {1.0,0.0,0.0},
 {1.0,1.0,0.0},
 {0.0,1.0,0.0},
 {0.0,0.0,1.0},
 {1.0,0.0,1.0},
 {1.0,1.0,1.0},
 {0.0,1.0,1.0}
};
int face[][4]={
 {0,1,2,3},
 {1,5,6,2},
 {5,4,7,6},
 {4,0,3,7},
 {4,5,1,0},
 {3,2,6,7}
};
GLdouble normal[][3]={
 {0.0,0.0,-1.0},
 {1.0,0.0,0.0},
 {0.0,0.0,1.0},
 {-1.0,0.0,0.0},
 {0.0,-1.0,0.0},
 {0.0,1.0,0.0}
};
GLvoid CALLBACK none(void)
{
}
GLvoid CALLBACK draw(void)
{
 int i,j;
 static int r=0;
 glClearColor(0.0,0.0,0.0,0.0);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();
 gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
 glRotated((double)r,0.0,1.0,0.0);
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_LIGHTING); /*tham số mới*/
 glEnable(GL_LIGHT0);  /*tham số mới*/
 glBegin(GL_QUADS);
 for(i=0;i<6;i++){
  glNormal3dv(normal[i]);  /*hàm mới*/
  for(j=0;j<4;j++){
   glVertex3dv(vertex[face[i][j]]);
  }
 }
 glEnd();
 glDisable(GL_LIGHT0);  /*tham số mới*/
 glDisable(GL_LIGHTING); /*tham số mới*/
 glDisable(GL_DEPTH_TEST);
  
 auxSwapBuffers();
 if(++r>=360) r=0;
}
GLvoid CALLBACK resize(GLsizei w,GLsizei h)
{
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glViewport(0,0,w,h);
 gluPerspective(30.0,1.0,1.0,10.0);
 glMatrixMode(GL_MODELVIEW);
}
 
int main(int argc, char *argv[])
{
 auxInitPosition(200,100,512,512);
 auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH);
 auxInitWindow(argv[0]);
 auxReshapeFunc(resize);
 auxIdleFunc(draw);
 glCullFace(GL_BACK);
 auxMainLoop(none);
 return 0;
}
Các bạn đã thấy thông số mới trong hàm glEnable() và glDisable(), các thông số này cho phép chúng ta sử dụng ánh sáng trong khi tạo đồ vật.Opengl cung cấp cho chúng ta 8 nguồn sáng mà chương trình trên mới chỉ sử dụng một nguồn sáng LIGHT0, hàm glNormal3dv() thiết lập véc tơ pháp tuyến cho mỗi mặt chúng ta vẽ, vì thế khi vật thể quay quanh trục thì ta sẽ thấy độ sáng tối thay đổi.
Trong chương trình light0.cpp trên chúng ta không sử dụng màu nên màu sẽ được xác định là màu mặc định như các bạn đã thấy.Tiếp theo đây tôi xin giới thiệu cách sử dụng vật liệu để tạo vật với các màu sắc ấn tượng khác nhau.Chúng ta khai báo dữ liệu sau:
GLfloat ambient[]={ 0.2,0.2,0.2,1.0};
GLfloat diffuse[]={ 0.8,0.0,0.0,1.0};
GLfloat specular[]={0.5,0.5,0.5,1.0};
GLfloat shininess=40.0;
Trong đó các thông số trên đều được đặt theo hệ RGBA(như đã đề cập ở các phần trên), chính vì thế mà chúng có 4 giá trị.Thông số ambient biểu hiện cho độ sáng của môi trường bên ngoài, diffuse là độ khuếch tán, specular là độ phản xạ và shininess là độ bóng(độ bóng sáng). Các thông số trên được hàm glMaterial*() sử dụng để tạo vật thể của chúng ta.Hãy quan sát cách khai báo hàm trên:
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse);
 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);
 glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);
Chú ý là lệnh cuối cùng không phải là “fv” như bình thường, vì shininess chỉ là một số.
Đây là mã nguồn của chương trình.
/*filename light1.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
#include<GL/glu.h>
GLdouble vertex[][3]={
 {0.0,0.0,0.0},
 {1.0,0.0,0.0},
 {1.0,1.0,0.0},
 {0.0,1.0,0.0},
 {0.0,0.0,1.0},
 {1.0,0.0,1.0},
 {1.0,1.0,1.0},
 {0.0,1.0,1.0}
};
int face[][4]={
 {0,1,2,3},
 {1,5,6,2},
 {5,4,7,6},
 {4,0,3,7},
 {4,5,1,0},
 {3,2,6,7}
};
GLdouble normal[][3]={
 {0.0,0.0,-1.0},
 {1.0,0.0,0.0},
 {0.0,0.0,1.0},
 {-1.0,0.0,0.0},
 {0.0,-1.0,0.0},
 {0.0,1.0,0.0}
};
GLfloat ambient[]={ 0.2,0.2,0.2,1.0};
GLfloat diffuse[]={ 0.8,0.0,0.0,1.0};
GLfloat specular[]={0.5,0.5,0.5,1.0};
GLfloat shininess=40.0;
GLvoid CALLBACK none(void)
{
}
GLvoid CALLBACK draw(void)
{
 int i,j;
 static int r=0;
 glClearColor(0.0,0.0,0.0,0.0);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();
 gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
 glRotated((double)r,0.0,1.0,0.0);
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse);
 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);
 glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);
 glBegin(GL_QUADS);
 for(i=0;i<6;i++){
  glNormal3dv(normal[i]);
  for(j=0;j<4;j++){
   glVertex3dv(vertex[face[i][j]]);
  }
 }
 glEnd();
 glDisable(GL_LIGHT0);
 glDisable(GL_LIGHTING);
 glDisable(GL_DEPTH_TEST);
  
 auxSwapBuffers();
 if(++r>=360) r=0;
}
GLvoid CALLBACK resize(GLsizei w,GLsizei h)
{
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glViewport(0,0,w,h);
 gluPerspective(30.0,1.0,1.0,10.0);
 glMatrixMode(GL_MODELVIEW);
}
 
int main(int argc, char *argv[])
{
 auxInitPosition(200,100,512,512);
 auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH);
 auxInitWindow(argv[0]);
 auxReshapeFunc(resize);
 auxIdleFunc(draw);
 glCullFace(GL_BACK);
 auxMainLoop(none);
 return 0;
}

<< 8 | 10 >>


Dành cho quảng cáo

©2007-2008 Bản quyền thuộc về Liên Mạng Việt Nam - http://lmvn.com ®
Ghi rõ nguồn "lmvn.com" khi bạn phát hành lại thông tin từ website này - Useronline: 602

Return to top