#100317#NeHe学习笔记----光暗

来源:互联网 发布:北大青鸟java培训学费 编辑:程序博客网 时间:2024/04/29 11:36

首先照例先添加几个变量,

bool  light;

bool  lp;

bool  fp;

分别表示光线开关,L键控制和F键的控制

 

 

GLfloat  xrot;

GLfloat  yrot;

GLfloat  xspeed;

GLfloat  yspeed;

分别表示x轴旋转,y轴旋转和x轴旋转的速度,y轴旋转的速度

GLfloatz=-5.0f;深入屏幕的深度。

 

 

接着设置用来创建光源的数组。我们将使用两种不同的光。第一种称为环境光。环境光来自于四面八方。所有场景中的对象都处于环境光的照射中。第二种类型的光源叫做漫射光。漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。处于漫射光直接照射下的任何对象表面都变得很亮,而几乎未被照射到的区域就显得要暗一些。这样在我们所创建的木板箱的棱边上就会产生的很不错的阴影效果。
创建光源的过程和颜色的创建完全一致。前三个参数分别是RGB三色分量,最后一个是alpha通道参数。
因此,下面的代码我们得到的是半亮(0.5f)的白色环境光。如果没有环境光,未被漫射光照到的地方会变得十分黑暗。

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };

表示环境光的参数。

 

 

下一行代码我们生成最亮的漫射光。所有的参数值都取成最大值1.0f。它将照在我们木板箱的前面,看起来挺好。

GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };

漫射光的参数。

 

最后我们保存光源的位置。前三个参数和glTranslate中的一样。依次分别是XYZ轴上的位移。由于我们想要光线直接照射在木箱的正面,所以XY轴上的位移都是0.0f。第三个值是Z轴上的位移。为了保证光线总在木箱的前面,所以我们将光源的位置朝着观察者(就是您哪。)挪出屏幕。我们通常将屏幕也就是显示器的屏幕玻璃所处的位置称作Z轴的0.0f点。所以Z轴上的位移最后定为2.0f。假如您能够看见光源的话,它就浮在您显示器的前方。当然,如果木箱不在显示器的屏幕玻璃后面的话,您也无法看见箱子。『译者注:我很欣赏NeHe的耐心。说真的有时我都打烦了,这么简单的事他这么废话干嘛?但如果什么都清楚,您还会翻着这样的页面看个没完么?』
最后一个参数取为1.0f。这将告诉OpenGL这里指定的坐标就是光源的位置,以后的教程中我会多加解释。

GLfloat   LightPosition[]={0.0f, 0.0f, 2.0f, 1.0f}

 

filter 变量跟踪显示时所采用的纹理类型。第一种纹理(texture 0) 使用gl_nearest(不光滑)滤波方式构建。第二种纹理 (texture 1) 使用gl_linear(线性滤波) 方式,离屏幕越近的图像看起来就越光滑。第三种纹理 (texture 2) 使用 mipmapped滤波方式,这将创建一个外观十分优秀的纹理。根据我们的使用类型,filter 变量的值分别等于 0, 1 或 2 。下面我们从第一种纹理开始。
GLuint texture[3] 为三种不同纹理分配储存空间。它们分别位于在 texture[0], texture[1] 和 texture[2]中。

GLuint  filter;

GLuint  texture[3];

 

接下来将设置三个不同的滤波办法,具体原理不太清楚。

int LoadGLTextures()         // Load Bitmaps And Convert To Textures
{
 int Status=FALSE;         // Status Indicator

 AUX_RGBImageRec *TextureImage[1];     // Create Storage Space For The Texture

 memset(TextureImage,0,sizeof(void *)*1);            // Set The Pointer To NULL

 // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
 if (TextureImage[0]=LoadBMP("Data/Crate.bmp"))
 {
  Status=TRUE;         // Set The Status To TRUE

  glGenTextures(3, &texture[0]);     // Create Three Textures

  // Create Nearest Filtered Texture
  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

  // Create Linear Filtered Texture
  glBindTexture(GL_TEXTURE_2D, texture[1]);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

  // Create MipMapped Texture
  glBindTexture(GL_TEXTURE_2D, texture[2]);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
 }

 if (TextureImage[0])        // If Texture Exists
 {
  if (TextureImage[0]->data)      // If Texture Image Exists
  {
   free(TextureImage[0]->data);    // Free The Texture Image Memory
  }

  free(TextureImage[0]);       // Free The Image Structure
 }

 return Status;          // Return The Status
}

 

 

然后修改InitGL函数:

 

int InitGL(GLvoid)          // All Setup For OpenGL Goes Here
{
 if (!LoadGLTextures())        // Jump To Texture Loading Routine
 {
  return FALSE;         // If Texture Didn't Load Return FALSE
 }

 glEnable(GL_TEXTURE_2D);       // Enable Texture Mapping
 glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
 glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
 glClearDepth(1.0f);         // Depth Buffer Setup
 glEnable(GL_DEPTH_TEST);       // Enables Depth Testing
 glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations

 

 现在开始设置光源。下面下面一行设置环境光的发光量,光源light1开始发光。这一课的开始处我们我们将环境光的发光量存放在

LightAmbient数组中。现在我们就使用此数组(半亮度环境光)。在int InitGL(GLvoid)函数中添加下面的代码。

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);  // Setup The Ambient Light


 接下来我们设置漫射光的发光量。它存放在LightDiffuse数组中(全亮度白光)。

glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);  // Setup The Diffuse Light
 glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light
 glEnable(GL_LIGHT1);        // Enable Light One
 return TRUE;          // Initialization Went OK
}

 

原创粉丝点击