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
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);//设置聚光范围
|
|
}
|