首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL不考虑GL_DIFFUSE位置光的距离

OpenGL不考虑GL_DIFFUSE位置光的距离
EN

Stack Overflow用户
提问于 2019-08-04 20:25:25
回答 1查看 203关注 0票数 2

我想在我的场景里放个位置灯。我希望远距离物体能吸收较少的光,但是opengl只关心表面法向和光之间的角度。我是不是做错了什么,还是必须添加另一个函数?

代码语言:javascript
复制
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个物体具有相同的照明,尽管它们与光源的距离不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-05 11:31:42

对于与距离有关的光,必须分别设置衰减参数GL_CONSTANT_ATTENUATIONGL_LINEAR_ATTENUATIONGL_QUADRATIC_ATTENUATION。见glLight。默认情况下,光线与距离无关。

光衰减在OpenGL 2.0规范- 2.14.1照明,第62页中指定。

光衰减因子的不同之处在于:

代码语言:javascript
复制
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.0max_dist的距离

代码语言:javascript
复制
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);

对于二次衰减,同样可以通过

代码语言:javascript
复制
float kc = 0.0f;
float kl = 0.0f;
float kq = (1.0f/threshold - kc - kl*max_dist) / (max_dist*max_dist);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57349994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档