OpenGL 不考虑 GL_DIFFUSE 位置光的距离
OpenGL doesn't consider distance of GL_DIFFUSE positional light
我想在我的场景中放置位置灯。我希望远处的物体吸收较少的光线,但 opengl 只关心表面法线和光线之间的角度。我是做错了什么还是必须添加另一个功能?
GLfloat lightIntensity=1.0;
GLfloat main_position[] = {0.0, 0.0, 1.0, 1.0};
GLfloat light_ambient[] = {0.2, 0.2, 0.2, 0.0};
GLfloat light_diffuse[] = {lightIntensity, lightIntensity, lightIntensity, 1.0};
GLfloat light_specular[] = {0.0, 0.0, 0.0, 0.0};
/* Enable a single OpenGL light. */
glLightfv(GL_LIGHT0, GL_POSITION, main_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
当我 运行 代码时,具有相同表面法线的 2 个对象具有相同的光照,即使它们与光源的距离不同
对于距离相关的光,您必须分别设置衰减参数 GL_CONSTANT_ATTENUATION
、GL_LINEAR_ATTENUATION
GL_QUADRATIC_ATTENUATION
。参见 glLight
。默认情况下,光是恒定的,与距离无关。
光衰减在第 62 页 OpenGL 2.0 Specification - 2.14.1 Lighting 中指定。
光衰减系数定义为:
att = 1 / (kc + kl * d + kq * d * d)
d ... distance from the light source to the fragment
kc ... constant attenuation
kl ... linear attenuation
kq ... quadratic attenuation
恒定衰减的默认值为 1,线性和二次衰减的默认值为 0。这导致与距离无关的因子为 1。
例如下面设置一个衰减,其中衰减因子为<= 1.0/255.0
,距离max_dist
:
float max_dist = ...;
float threshold = 1.0f/255.0f;
float kc = 0.0f;
float kq = 0.0f;
float kl = (1.0f/threshold - kc - kq*max_dist*max_dist) / max_dist;
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, kc);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, kl);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, kq);
对于二次衰减,同样可以通过
实现
float kc = 0.0f;
float kl = 0.0f;
float kq = (1.0f/threshold - kc - kl*max_dist) / (max_dist*max_dist);
我想在我的场景中放置位置灯。我希望远处的物体吸收较少的光线,但 opengl 只关心表面法线和光线之间的角度。我是做错了什么还是必须添加另一个功能?
GLfloat lightIntensity=1.0;
GLfloat main_position[] = {0.0, 0.0, 1.0, 1.0};
GLfloat light_ambient[] = {0.2, 0.2, 0.2, 0.0};
GLfloat light_diffuse[] = {lightIntensity, lightIntensity, lightIntensity, 1.0};
GLfloat light_specular[] = {0.0, 0.0, 0.0, 0.0};
/* Enable a single OpenGL light. */
glLightfv(GL_LIGHT0, GL_POSITION, main_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
当我 运行 代码时,具有相同表面法线的 2 个对象具有相同的光照,即使它们与光源的距离不同
对于距离相关的光,您必须分别设置衰减参数 GL_CONSTANT_ATTENUATION
、GL_LINEAR_ATTENUATION
GL_QUADRATIC_ATTENUATION
。参见 glLight
。默认情况下,光是恒定的,与距离无关。
光衰减在第 62 页 OpenGL 2.0 Specification - 2.14.1 Lighting 中指定。
光衰减系数定义为:
att = 1 / (kc + kl * d + kq * d * d)
d ... distance from the light source to the fragment
kc ... constant attenuation
kl ... linear attenuation
kq ... quadratic attenuation
恒定衰减的默认值为 1,线性和二次衰减的默认值为 0。这导致与距离无关的因子为 1。
例如下面设置一个衰减,其中衰减因子为<= 1.0/255.0
,距离max_dist
:
float max_dist = ...;
float threshold = 1.0f/255.0f;
float kc = 0.0f;
float kq = 0.0f;
float kl = (1.0f/threshold - kc - kq*max_dist*max_dist) / max_dist;
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, kc);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, kl);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, kq);
对于二次衰减,同样可以通过
实现float kc = 0.0f;
float kl = 0.0f;
float kq = (1.0f/threshold - kc - kl*max_dist) / (max_dist*max_dist);