C++ Opengl - 使用聚光灯照明
Posted
技术标签:
【中文标题】C++ Opengl - 使用聚光灯照明【英文标题】:C++ Opengl - lighting using spotlight 【发布时间】:2012-12-15 15:07:17 【问题描述】:我有一个模型需要在聚光灯/定向光下,
意思是,我需要在模式(聚光灯和定向)之间切换。
这里有一些解释的代码:
我可以通过鼠标移动来旋转模型/光源,所以我正在使用
glRotate 和 glTranslate 。
一旦用户按下“L”键,我就应该在模式之间切换。
这是闪电的代码:
void LightBall::projectLight(void)
if(LIGHT == _lightMode)
printf("Entering LIGHT mode\n"); <--- Supposed to be a directional light
glDisable(GL_LIGHT1);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, _light_position);
if(SPOT_LIGHT == _lightMode)
printf("Entering SPOTLIGHT mode\n"); <--- Supposed to be a spotlight
glDisable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_POSITION, _light_position);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 10.0);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,_spotlight_position);
问题是我在它们之间切换时总是得到相同的灯光模式,
如下:
另一个例子是在两种光模式之间切换后仍然获得相同的光
带光源旋转的源(小球):
我怎样才能得到想要的结果?
以下是 LIGHT0 和 LIGHT1 的定义:
GLfloat light_ambient[] = 1.0, 0.0, 0.0, 1.0 ;
GLfloat light_diffuse[] = 1.0, 0.0, 0.0, 1.0 ;
GLfloat light_specular[] = 1.0, 1.0, 1.0, 1.0 ;
_light_position[0] = 0.0;
_light_position[1] = 1.0;
_light_position[2] = 0.0;
_light_position[3] = 0.0;
_spotlight_position[0] = 0.0;
_spotlight_position[1] = -1.0;
_spotlight_position[2] = 0.0;
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
谢谢!
【问题讨论】:
【参考方案1】:GL 灯是定向灯还是聚光灯取决于其位置的 w(第 4 个)分量。如果坐标为 0,则它是有方向的。如果非零(通常为 1),则为聚光灯。在调用 glLightfv(..., GL_POSITION, ...)
之前,您必须相应地修改 _lightPosition
。
【讨论】:
以上是关于C++ Opengl - 使用聚光灯照明的主要内容,如果未能解决你的问题,请参考以下文章
昂宝OB3635AMPOB33398MP大功率投光灯80W驱动照明
RT7304GE隔离大功率50-100W路灯/投光灯照明驱动