天天看點

opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數

使能光計算

glEnable(GL_LIGHTING); 
           

光設定

// Bright white light - full intensity RGB values 
GLfloat ambientLight[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
 
// Enable lighting 
glEnable(GL_LIGHTING); 
 
// Set light model to use ambient light specified by ambientLight[] 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight); 
           

材料設定

方法一

Glfloat gray[] = { 0.75f, 0.75f, 0.75f, 1.0f }; 
… 
… 
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray); 
 
glBegin(GL_TRIANGLES); 
glVertex3f(-15.0f,0.0f,30.0f); 
glVertex3f(0.0f, 15.0f, 30.0f); 
glVertex3f(0.0f, 0.0f, -56.0f); 
glEnd(); 
           

方法二

// Front material ambient and diffuse colors track glColor 
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); 
// Light values and coordinates 
GLfloat  specref[] =  { 1.0f, 1.0f, 1.0f, 1.0f }; 
… 
… 

// Enable color tracking 
glEnable(GL_COLOR_MATERIAL); 

// Set Material properties to follow glColor values 
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

// All materials hereafter have full specular reflectivity
// with a high shine 
glMaterialfv(GL_FRONT, GL_SPECULAR,specref); 
glMateriali(GL_FRONT,GL_SHININESS,128); 
… 
… 
glcolor3f(0.75f, 0.75f, 0.75f); 
glBegin(GL_TRIANGLES); 
glVertex3f(-15.0f,0.0f,30.0f); 
glVertex3f(0.0f, 15.0f, 30.0f); 
glVertex3f(0.0f, 0.0f, -56.0f); 
glEnd(); 
           

法向量

// Reduces a normal vector specified as a set of three coordinates, 
// to a unit normal vector of length 1. 
void ReduceToUnit(float vector[3]) 
{ 
float length; 
 
// Calculate the length of the vector 
length = (float)sqrt((vector[0]*vector[0]) +  
 (vector[1]*vector[1]) + 
 (vector[2]*vector[2])); 
 
 // Keep the program from blowing up by providing an acceptable zero. 
if(length == 0.0f) 
length = 1.0f; 
 
 // Dividing each element by the length will result in a 
// unit normal vector. 
vector[0] /= length; 
vector[1] /= length; 
vector[2] /= length; 
} 

// Points p1, p2, & p3 specified in counterclockwise order 
void calcNormal(float v[3][3], float out[3]) 
{ 
float v1[3],v2[3]; 
static const int x = 0; 
static const int y = 1; static const int z = 2; 
 
 // Calculate two vectors from the three points 
v1[x] = v[0][x] - v[1][x]; 
v1[y] = v[0][y] - v[1][y]; 
v1[z] = v[0][z] - v[1][z]; 
 
v2[x] = v[1][x] - v[2][x]; 
v2[y] = v[1][y] - v[2][y]; 
v2[z] = v[1][z] - v[2][z]; 
 
 // Take the cross product of the two vectors to get 
 // the normal vector which will be stored in out[] 
out[x] = v1[y]*v2[z] - v1[z]*v2[y]; 
out[y] = v1[z]*v2[x] - v1[x]*v2[z]; 
out[z] = v1[x]*v2[y] - v1[y]*v2[x]; 
 
 // Normalize the vector (shorten length to one) 
ReduceToUnit(out); 
} 
           

示例

// This function does any needed initialization on the rendering 
// context. Here it sets up and initializes the lighting for 
// the scene. 
void SetupRC() 
{ 
 // Light values and coordinates 
 GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f }; 
 GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f }; 
 Glfloat  lightPos[] = { -50.f, 50.0f, 100.0f, 1.0f }; 
 GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 

 glEnable(GL_DEPTH_TEST); // Hidden surface removal 
 glFrontFace(GL_CCW);   // Counter clock-wise polygons face out 
 glEnable(GL_CULL_FACE); // Do not calculate inside of jet 
 
 // Enable lighting 
 glEnable(GL_LIGHTING); 
 
 // Setup and enable light 0 
 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); 
 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); 
 glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 
 glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
 glEnable(GL_LIGHT0); 
 
 // Enable color tracking 
 glEnable(GL_COLOR_MATERIAL); 
 
 // Set Material properties to follow glColor values 
 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
 
 // All materials hereafter have full specular reflectivity 
 // with a high shine 
 glMaterialfv(GL_FRONT, GL_SPECULAR,specref); 
 glMateriali(GL_FRONT,GL_SHININESS,128); 

 // Light blue background 
 glClearColor(0.0f, 0.0f, 1.0f, 1.0f ); 
} 
void main()
{
 SetupRC();
 float normal[3]; // Storage for calculated surface normal 
… 
… 
// Vertices for this triangle 
float v[3][3] = {{ 15.0f, 0.0f, 30.0f}, 
{ 0.0f, 15.0f, 30.0f}, 
{ 0.0f, 0.0f, 60.0f}}; 
 
// Calculate the normal for the plane 
calcNormal(v,normal); 
 
// Draw the triangle using the plane normal 
// for all the vertices 
glBegin(GL_TRIANGLES); 
  glRGB(0, 255, 0); 
  glNormal3fv(normal); 
  glVertex3fv(v[0]); 
  glVertex3fv(v[1]); 
  glVertex3fv(v[2]); 
glEnd(); 
}
           

聚焦燈設定

// the scene. 
void SetupRC() 
{ 
 glEnable(GL_DEPTH_TEST); // Hidden surface removal 
 glFrontFace(GL_CCW); // Counterclockwise polygons face out 
 glEnable(GL_CULL_FACE);// Do not try to display the back sides 
 
 // Enable lighting 
 glEnable(GL_LIGHTING); 
 
 // Set up and enable light 0 
 // Supply a slight ambient light so the objects can be seen 
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); 
 
 // The light is composed of just diffuse and specular components 
 glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight); 
 glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 
 glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
 
 // Specific spot effects 
 // Cut off angle is 60 degrees 
 glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,60.0f); 
 
 // Fairly shiny spot 
 glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,100.0f); 
 
 // Enable this light in particular 
 glEnable(GL_LIGHT0); 
    
 // Enable color tracking 
 glEnable(GL_COLOR_MATERIAL); 
 
 // Set Material properties to follow glColor values 
 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
 
 // All materials hereafter have full specula r reflectivity 
 // with a high shine 
 glMaterialfv(GL_FRONT, GL_SPECULAR,specref); 
 glMateriali(GL_FRONT, GL_SHININESS,128); 
 
// Black background 
glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); 
} 
           

畫聚焦燈

glPushAttrib(GL_LIGHTING_BIT); 
//Just following this statement, we disable lighting and render a bright yellow sphere. Then 
//we make a call to  
glPopAttrib();   
           

陰影

後補

相關函數

opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數
opengl--光使能光計算光設定材料設定法向量示例聚焦燈設定陰影相關函數

繼續閱讀