You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

96 lines
2.1 KiB

#include "light.h"
Light::Light()
{
}
void Light::SetAmbientColor(float r, float g, float b, float a)
{
float ambientColor[] = { r,g,b,a };
glLightfv(mLightIdentifier, GL_AMBIENT, ambientColor);
}
void Light::SetDiffuseColor(float r, float g, float b, float a)
{
float diffuseColor[] = { r,g,b,a };
glLightfv(mLightIdentifier, GL_DIFFUSE, diffuseColor);
}
void Light::SetSpecularColor(float r, float g, float b, float a)
{
float specularColor[] = { r,g,b,a };
glLightfv(mLightIdentifier, GL_SPECULAR, specularColor);
}
void Light::Enable()
{
glEnable(GL_LIGHTING);
glEnable(mLightIdentifier);
}
DirectionLight::DirectionLight(GLenum light)
{
mLightIdentifier = light;
}
void DirectionLight::SetPosition(float x, float y, float z)
{
float pos[] = { x,y,z, 0.0f }; //这里齐次坐标写了0.0f代表这个光在最远处
glLightfv(mLightIdentifier, GL_POSITION, pos);
}
PointLight::PointLight(GLenum light)
{
mLightIdentifier = light;
memset(mPosition, 0, sizeof(mPosition));
}
void PointLight::SetPosition(float x, float y, float z)
{
//float pos[] = {x,y,z, 1.0f};//这里的齐次坐标为1.0代表在近处
//glLightfv(mLightIdentifier, GL_POSITION, pos);
mPosition[0] = x;
mPosition[1] = y;
mPosition[2] = z;
}
void PointLight::SetConstAttenuation(float v)
{
glLightf(mLightIdentifier, GL_CONSTANT_ATTENUATION, v);
}
void PointLight::SetLinearAttenuation(float v)
{
glLightf(mLightIdentifier, GL_LINEAR_ATTENUATION, v);
}
void PointLight::SetQuadricAttenuation(float v)
{
glLightf(mLightIdentifier, GL_QUADRATIC_ATTENUATION, v);
}
void PointLight::Update(float x, float y, float z)
{
float pos[] = {mPosition[0] - x, mPosition[1] - y, mPosition[2] - z, 1.0f};
glLightfv(mLightIdentifier, GL_POSITION, pos);
}
SpotLight::SpotLight(GLenum light):PointLight(light)
{
}
void SpotLight::SetDirection(float x, float y, float z)
{
float dir[] = { x,y,z };
glLightfv(mLightIdentifier, GL_SPOT_DIRECTION, dir);//设置聚光灯的朝向
}
void SpotLight::SetExpone(float v)
{
glLightf(mLightIdentifier, GL_SPOT_EXPONENT, v);//设置聚光度,其实这里是一个角度,在这个角度内光是不衰减的
}
void SpotLight::SetCutoff(float v)
{
glLightf(mLightIdentifier, GL_SPOT_CUTOFF, v);//设置聚光范围
}